Основы плагиностроения к 3D Studio MAX.
Автор: Sergei Shaykin
Для понятия материала требуются знания объектно-ориентированного программирования в среде Visual C++, Windows-программирование динамически подключаемых библиотек (DLL), а также элементарное умение осмысленного нажатия на кнопки в 3D Studio MAX.
Для написания plug-in'ов к 3D Studio MAX 3.x необходимо иметь Visual C++ 6.0, 3D Studio MAX 3.x, для тестирования, и MAX SDK. SDK поставляется на CD вместе с MAX'ом, во время установки 3D Studio MAX, вы выбираете режим установки Custom, где добавляете установку SDK.
Введение
Структура
Несколько советов.
С чего всё началось. Или слово о версиях.
Заключение
Введение
3D Studio MAX SDK (Software Development Kit) — объектно-ориентированная библиотека, представляющая собой набор классов, которыми могут пользоваться разработчики, для создания plug-in'ов к 3D Studio Max.
Max на большую часть сам состоит из plug-in'ов. Почти любые части Max'а доступны для разработчиков. Plug-in'ы делятся по типам, в зависимости от их предназначения. При их помощи вы можете создавать новые типы объектов, модификаторов, материалов, утилит, эффектов и т.д. Игроделов в первую очередь интересуют экспортные возможности.
Наверно, к самым простым типам plug-in'ов относятся утилиты. На примере простейшей утилиты мы и устроим наше первое знакомство с SDK.
Структура
Plug-in, в рамках языка С++, представляет собой объект специального класса, будем называть такой класс классом plug-in'а. Как файл plug-in представляет собой обычную DLL, которую, если распознает, подгружает Max. При этом такой .dll-файл может содержать несколько объектов plug-in'ных классов. Каждый plug-in'ный файл должен содержать пять функций. При помощи них Max распознаёт plug-in, понимает его тип и т.п.:
- DllMain(): Стандартная main-функция используемая Windows для инициализации DLL. Здесь происходит инициализация стандартных элементов управления (controls), а также дополнительных элементов управления, которые используются в Max'е.
- LibNumberClasses(): Эта функция возвращает количество классов, отвечающих за plug-in'ы, содержащихся в DLL.
- LibVersion(): Позволяет Max'у определить, для какой его версии предназначен plug-in.
- LibDescription(): Возвращает текстовую строку (описание), которая показывается пользователю, если DLL не доступна по каким-то причинам.
- LibClassDesc(): Функция возвращает указатель на объект, называемый Дескриптором класса для каждого класса plug-in'а в DLL. Этот объект описывает свойства каждого класса plug-in'а и способ создания объекта этого класса.
Приведём пример файла, содержащего эти пять функций. (Файлы MyUtility.h и MyUtility.cpp будут рассмотрены позже).
// file: DllEntry.cpp // общий .h-файл для нашего plug-in'а #include "MyUtility.h" // Реализована в файле MyUtility.cpp extern ClassDesc2* GetMyUtilityDesc(); // DLL's instance handle. HINSTANCE hInstance; // флаг controlsInit - используется, для того, чтобы элементы // управления инициализировались только один раз int controlsInit = FALSE; BOOL WINAPI DllMain( HINSTANCE hinstDLL,ULONG fdwReason,LPVOID) { hInstance = hinstDLL; if ( !controlsInit) { // вызывается один раз во время загрузки plug-in'а controlsInit = TRUE; // Инициализация элементов управления MAX'а InitCustomControls( hInstance); // Инициализация стандартных элементов управления InitCommonControls( ); } return ( TRUE); } __declspec( dllexport ) const TCHAR* LibDescription( ) { // функция GetString() реализована ниже return GetString( IDS_LIBDESCRIPTION); } __declspec( dllexport ) int LibNumberClasses( ) { return 1; } __declspec( dllexport ) ClassDesc* LibClassDesc( int i) { switch( i) { case 0: return GetMyUtilityDesc( ); default: return 0; } } __declspec( dllexport ) ULONG LibVersion( ) { // VERSION_3DSMAX - Объявлена в MAX SDK return VERSION_3DSMAX; } // функция достает строку из ресурсов TCHAR *GetString( int id) { static TCHAR buf[256]; if ( hInstance) return LoadString( hInstance, id, buf, sizeof( buf)) ? buf : NULL; return NULL; }
#3D Studio MAX, #plug-in, #плагины, #экспорт
13 июля 2001 (Обновление: 14 мая 2013)