Антон АксёновСтатьи

Delphi 3DSMAX SDK for export plugin, экспортный плагин к 3DSMAX8 на Delphi

Автор:

В статье описывается Delphi maxsdk для написания экспортного плагина к 3DSMAX8 на Delphi.

  Вступление.
  Описание.
  Основные возможности.
  Требования к Delphi плагину.
  Порядок работы.
  Пример Delphi плагина.
  Отладка плагина.
  Послесловие.
  Ссылки.

Вступление.

Предлагаю всем дельфистам переложение небольшой части maxsdk с C++ на Delphi. Теперь можно писать непосредственно экспортный плагин для 3DSMAX в свой SuperFormat на любимом языке. Сейчас можно выгрузить материалы, геометрию, скининг, иерархию костей.

Описание.

Я написал экспортнрый плагин на C++ DelphiPlugin.dle, который является proxy dll между Вашим плагином на Delphi и 3DSMAX’ом. Он экспортирует все основные методы maxsdk классов в Delphi плагин. На стороне Delphi эти методы снова оборачиваются в классы с такими же именами, поэтому для справки можно использовать оригинальный maxsdk help. В итоге у Вас получится обычный экспортный плагин, который запускается как и все плагины через File -> Export/Export Selected.

Основные возможности.

В текущей версии (1.15) из 3DSMAX можно получить:
INode:
-  матрицы трансформаций
-  свойства User Defined
-  материал
Mesh:
-  вершины
-  нормали на каждую вершину (с учетом smooth groups и EditNormals)
-  текстурные координаты
-  информацию о фасетках
Mtl:
-  свойства материала
-  имена текстурных карт
-  работа с sub-materials
Modifier:
-  Physique Export Interface
-  ISkin
Вершины, нормали и текстуры проиндексированы.
Во всех заголовочных файлах в описаниях классов я разбил функции по категориям, аналогично справке в maxsdk. Функции maxsdk, которые не привязаны к конкретным объектам, описаны в PluginTypesCOREfunctions.pas.

Требования к Delphi плагину.

Ваш плагин должен быть dll файлом, который экспортирует следующие функции:

procedure InitPlugin(var plugInf, plugAPI: pointer); cdecl;

Вызывается при инициализации плагина. С помощью этой процедуры 3DSMAX запрашивает данные о Вашем плагине. В связи с особенностями работы 3DSMAX эта информация будет запрашиваться два раза: первый раз когда пользователь нажимает File-Export - для построения списка плагинов, второй раз когда пользователь начнет экспорт с помощью этого плагина.
Параметры:
plugInf (out) указатель на структуру TPluginInfo, в которой содержится информация о плагине. Отвести память и заполнить нужно самому.
plugAPI (out) указатель на структуру TPluginAPI, в которой содержится системная информация, необходимая для работы Delphi maxsdk. Указатель на эту структуру передаётся в конструктор объекта TNode. Переменная этого типа pluginAPI находится в файле PluginTypesSys.pas, нужно просто передать на неё указатель. Менять в структуре ничего не надо, заполняет её DelphiPlugin.dle

function DoExport(ParentWnd: HWND; fname: PChar;
  ipID: TIPID; showPrompts: LongBool; options: DWORD): LONGBOOL; cdecl;

Вызывается перед началом экспорта, вернуть true для продолжения. Здесь можно отобразить пользовательский интерфейс. Для подробностей см maxsdk по DoExport.
Параметры:
ParentWnd (in) указатель на окно-родителя для построение своего интерфейса.
fname (in) имя файла, которое указал пользователь в диалоге эксорта.
ipID (in) переменная, которая хранит указатель на класс Interface из maxsdk. Нужна для передачи в конструктор класса TIP.
showPrompts (in) флаг, разрешающий запрашивать что-либо у пользователя, в т.ч. отображать интерфейс.
options (in) опции экспорта.

function BeginExport(): integer; cdecl;

Вызывается перед началом обхода дерева сцены (если он был, т.е. в DoExport вернули true). Должна возвратить необходимое количество обходов всех узлов сцены.

procedure EndExport(); cdecl;

Вызывается после окончания экспорта (если он был, т.е. в DoExport вернули true)

function ProcNode(nodeID: TNodeID; iteration: integer): TProcNodeResult; cdecl;

Эта функция вызывается 3DSMAX’ом при обходе дерева узлов сцены. Для подробной справки см описание класса IScene в maxsdk.
Параметры:
nodeID (in) переменная, которая хранит указатель на класс Node из msaxsdk. Нужна для передачи в конструктор класса TNode.
iteration (in) номер текущего обхода сцены.

procedure ShowAbout(Wnd: HWND); cdecl;

Отображение диалога About – сведения о программе
Параметры:
Wnd (in) окно-предок для диалога.

Порядок работы.

Чтобы DelphiPlugin.dle нашел и загрузил Ваш плагин, нужно создать файл DelphiPlugin.INI и в ключе “plugin” раздела [MAIN] прописать полный путь к Вашему плагину. Сам файл DelphiPlugin.INI нужно разместить там же где находится DelphiPlugin.dle – т.е. в папке plugins корневой папки 3DSMAX’а.
В папке doc\ pattern лежит шаблонный проект плагина. Там достаточно комментариев, чтобы разобраться что к чему. Для создания собственного плагина можно просто скопировать всё содержимое этой папки в нужный каталог, переименовать проект и добавить свой код.

Пример Delphi плагина.

В качестве примера я написал плагин, который на выходе на каждый объект создаёт три файла:
_имя объекта.inf – файл с описанием, аналогичен ini файлу (key=value)
_имя объекта.vb – данные по геометрии, которые сразу можно загрузить в вершинный буфер
_имя объекта.ib – индексы, которые можно загрузить в индексный буфер
Структура файла *.inf:
[MAIN]
vbname=имя файла для загрузки в Vertex Buffer
ibname=имя файла для загрузки в Index Buffer
vcount=количество вершин
icount=количество индексов
[MATERIAL]
name=название материала
texture=имя файла с диффузной текстурой
ambient_(rgb), diffuse_(rgb), specular_(rgb), emissive_(rgb) – цвета материала.
На всю сцену создаётся файл .sdp – простой текстовый файл, в котором перечислены имена inf файлов в сцене, по имени на строку.
Пример находится в папке doc\samples\plugin
Основная логика экспорта реализована в модуле Export2SuperFormat.pas, интерфейсная форма в модуле uInterface.pas.
В модуле Export2SuperFormat2 в процедуре PhyGetWeights реализован пример работы с Physique Export Interface, а в процедуре ISkinGetWeights с ISkin. Данные костей просто выгружаются в log файл.
Пример загрузки и отображения находится в папке doc\samples\viewer (за основу взял один из примеров из Delphi DirectX 9.0 headers / SDK). Пробел включает/отключает режим отображения нормалей, мышкой можно вращать камеру, enter – остановка/запуск вращения сцены, стрелки управляют положением источника света (directional). Для работы viewer требует последний DX9SDK.

Отладка плагина.

Для отладки плагина пропишите полное имя файла 3dsmax.exe в главном меню Run->Parameters->Host Application (полное имя содержит путь). Тогда по F9 у Вас будет запускаться 3DSMAX и программа будет послушно спотыкаться на всех брякпоинтах. А если Вы не будете использовать эту возможность, то после каждой перекомпиляции плагина не надо будет перезапускать 3DSMAX. В DelphiPlugin.dle стоит ловушка для исключений, так что чтобы уронить 3DSMAX из Delphi плагина надо очень постараться.

Послесловие.

DelphiPlugin.dle - это первая моя программа на c++, поэтому я делал очень некрасиво: приставал ко всем с глупыми вопросами, желая побыстрее его закончить.
Огромное спасибо ребятам с irc канала #GameDev за помощь:
Сержант, NULL_PTR, ACRSoft , VoidEx, iDag.
Так же спасибо всему народу с этого канала за терпение, и админам за то что кикнули всего один раз (я бы себя раз пять точно бы кикнул за глупые вопросы). :)
Спасибо авторам всех статей по экспорту, это был мой основной источник информации.
Если кто-то будет расширять возможности этого sdk – просьба высылать мне изменения, я буду вносить их в текущую версию. Ну и конечно, если будут какие-нибудь баги - прошу сообщать мне о них сюда, или в личку.
Буду рад конструктивной критике.

Ссылки.


Для полного понимания сути процесса рекомендую прочесть замечательные статьи с этого сайта:
Основы плагиностроения к 3D Studio MAX
Создание Export плагина для 3D Studio MAX.
Нюансы при экспорте из 3DS MAX

Сам сдк с примерами: Delph 3DSMAX SDK

Delphi powered | Delphi 3DSMAX SDK for export plugin, экспортный плагин к 3DSMAX8 на Delphi

(c) февраль - март 2007.

#3D Studio MAX, #3DSMAX SDK, #Delphi, #export, #plug-in, #SDK

21 февраля 2007 (Обновление: 25 дек 2009)

Комментарии [86]