Sergei Shaykin
GameDev.ru / Страницы / Sergei Shaykin / Статьи / Основы плагиностроения к 3D Studio MAX.

Основы плагиностроения к 3D Studio MAX.

Страницы: 1 2 3 Следующая

Автор:

Для понятия материала требуются знания объектно-ориентированного программирования в среде 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;
}

Страницы: 1 2 3 Следующая

13 июля 2001

#3D Studio MAX, #plug-in, #плагины, #экспорт


Обновление: 14 мая 2013

2001—2017 © GameDev.ru — Разработка игр