Delphi 3DSMAX SDK for export plugin, экспортный плагин к 3DSMAX8 на Delphi
Автор: Coriolis
В статье описывается 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
(c) февраль - март 2007.
#3D Studio MAX, #3DSMAX SDK, #Delphi, #export, #plug-in, #SDK
21 февраля 2007 (Обновление: 25 дек 2009)