Phantom3D

Phantom3D - объектно-ориентированный графический движок, созданный специально для конструктора игр 
Game Maker и представляющий собой набор DLL-библиотек для работы с трехмерной графикой (OpenGL), 
физикой (ODE), изображениями (DevIL).
Phantom3D построен с учетом расширяемости и свободы для программиста. Основная идеология Phantom3D: 
"если что-то не нужно, можно это не использовать, а если чего-то не хватает, можно создать это самому."

1. Архитектура
-----------------------
Phantom3D имеет модульную архитектуру. Это значит, что для использования определенных функций движка 
необходим соответствующий модуль. 
Основные модули Phantom3D:
- Phantom3D.dll - ядро. Содержит функции инициализации OpenGL, набор стандартных классов (трехмерные 
объекты, материал, текстура, шейдер и др.), а также интерфейсы к некоторым другим модулям;
- DevIL.dll - модуль загрузки изображений;
- ILU.dll - дополнительный модуль для работы с изображениями. Зависим от библиотеки DevIL.dll;
- PhantomODE.dll - модуль физики - оболочка над физическим движком ODE. Зависим от библиотек 
libode.dll и libopcode.dll. PhantomODE в достаточной степени независим от ядра и теоретически может 
использоваться отдельно;
- PhantomXML - модуль работы с документами в разметке XML. Полностью независим от ядра.

В отличие от аналогов, Phantom3D - движок с открытым циклом. Иными словами, подготовка обновления 
(очищение буферов, обновление модельной матрицы), само обновление (отрисовка объектов) и завершение 
обновления (смена буферов) не объединены в одну функцию. Благодаря этому в Phantom3D поддерживаются 
прямые команды OpenGL, позволяющие рисовать любую графику. Для повышения производительности, имеет смысл 
вынести эти команды в отдельный модуль. Таким образом, можно существенно расширять возможности Phantom3D 
без пересборки ядра.

2. Объектная модель
-----------------------
В терминах Phantom3D, объект - это образец или конкретная единица определенного класса данных. С такой точки 
зрения, любое понятие в среде Phantom3D - примитив, текстура, материал, шейдер, матрица, список и т.д. - считается 
объектом. Но чаще всего, словом "объект" обозначается только объект трехмерной сцены, т.е., принадлежащий графу 
сцены. Это графические примитивы, модели и т.д.
Граф сцены - это важный компонент движка, который реализуется ядром Phantom3D. Он представляет собой такую систему 
взаимосвязей между объектами, где каждый объект "подчинен" другому и может иметь другие объекты у себя в "подчинении". 
Такая взаимосвязь условно обозначается "родитель/потомок" (parent/child). 
Строго говоря, граф сцены - абстрактное понятие, технически он не существует как отдельная структура. 
Граф сцены реализуется путем постороения для каждого объекта списка его "потомков". 

Существует отдельный класс объектов, которые существуют вне графа сцены. Это так называемые открытые объекты 
(OpenObjects). Открытые объекты предполагают внедрение любых команд OpenGL в их цикл отрисовки, а также позволяют 
создать на их основе абсолютно любую структуру, будь то простой список, граф сцены или что-то еще. 

Текстуры, материалы, шейдеры и другие вспомогательные классы данных технически считаются объектами, но не входят 
в граф сцены и не обладают свойствами трехмерных объектов.





