История Xtreme3D

Xtreme3D v3

История Xtreme3D

Xtreme3D 0.x-2.x (2003-2006)

История Xtreme3D началась в 2003 году. Движок был написан на Delphi с использованием библиотеки GLScene (де-факто стандартного 3D-движка для Object Pascal) немецким программистом под ником Xception. К сожалению, нам неизвестно его настоящее имя.

Первая стабильная версия Xtreme3D (0.9) была выпущена в 2003 году. Ее возможности были довольно скромными: поддерживались только анимированные модели MD2 и MD3, статичные 3DS, MS3D и OBJ, встроенные примитивы, спрайты, двумерный и трехмерный текст, lensflare, частицы и небесный купол. API движка напоминал стиль GML-функций.

Основной целью проекта было создание движка для трехмерной RPG наподобие Dungeon Master. И, хотя автор движка изначально не планировал дальнейшее развитие Xtreme3D, в более поздних версиях функционал движка быстро перерос потребности конкретного жанра.

Так, в версии 1.7 (2004 г.) появилась динамическая вода. Однако куда более серьезным прорывом стала версия 2.0 (2006 г.): тотальный пересмотр API, поддержка видов, библиотек материалов и карт освещения, динамический cubemapping, поддержка новых форматов моделей, рендеринг в текстуру, загрузка ресурсов из сжатого архива, аппаратные шейдеры (bump mapping, cel shading), мультитекстурирование, octree и quadtree, поддержка DDS, а также, что особенно важно, интегрированный физический движок Open Dynamics Engine (ODE).

Последний релиз от Xception (2.0.2.0), помимо многочисленных багфиксов, содержал два важных нововведения: отрисовщик ландшафта и движок проверки столкновений DCE. Функциональность движка была на уровне коммерческих игр 1997-2003 годов - Xtreme3D 2.0 позволял создавать что-то похожее в плане графики на Quake 2-3, Half-Life, GTA 3, The Elder Scrolls: Morrowind и т.д. - все, что относится к "дошейдерной" эпохе.

К сожалению, Xception, в итоге, забросил свою разработку - движок распространялся без исходников, и поэтому долгое время не развивался, а технологии, между тем, не стояли на месте...

Xtreme3D 3.0 (25.08.16)

С 2009 года в русскоязычном сообществе Xtreme3D постоянно витала идея воссоздать движок с нуля, исправить баги и добавить недостающую функциональность - учитывая, что Xtreme3D является весьма тонкой оберткой над GLScene, эта задача казалась несложной и чисто технической. Однако возникли непредвиденные проблемы, и дело затянулось. В итоге, проект, начавшийся в 2009 году и переживший долгий период стагнации и несколько вспышек активности, был завершен лишь в 2016-м. Так появился Xtreme3D 3.0.

Эта версия Xtreme3D, как и оригинал, написана на Delphi с использованием популярной библиотеки GLScene - фактически, движок можно назвать почти полным враппером GLScene для Game Maker. В основе Xtreme3D 3.0 лежит модифицированная и расширенная GLScene 1.0.0.0714.

Вот краткий список нововведений Xtreme3D 3.0:

- Поддержка шейдеров на языке GLSL (1.1 или 1.2)
- Динамические тени, реализованные методом shadow mapping
- Экранный антиалиасинг 2x и 4x. Имеется поддержка технологии сглаживания NVIDIA Quincunx
- Быстрый внеэкранный рендеринг с использованием p-буферов
- Поддержка прокси-объектов
- Поддержка форматов моделей LOD (LODka 3D) и B3D (Blitz3D)
- Поддержка тегов для моделей MD3
- Смешивание скелетных анимаций
- Загрузка материалов из скриптов
- Встроенный шейдер смешивания текстур (TexCombine)
- Встроенный шейдер, реализующий базовое освещение по Фонгу (Phong)
- Процедурные текстуры на основе шума Перлина
- Поддержка линейных волн для динамической воды
- Новые типы геометрических примитивов (усеченная пирамида, додекаэдр, икосаэдр, чайник)
- Улучшенный эффект взрыва для мешей (в частности, теперь есть возможность вернуть меш в исходное состояние)
- Рендеринг сеток (Grid)
- Отладочный рендеринг объектов-манекенов (Dummycube)
- Множество новых функций для камеры (Camera)
- Возможность копировать матрицы трансформации (локальные и абсолютные) от одного объекта другому. Также можно копировать объектам матрицы костей из модели со скелетной анимацией и задавать локальную матрицу объекта вручную, что позволяет реализовать любую математическую модель движения и вращения объектов, не привязываясь к углам Эйлера
- Возможность прикладывать импульсы (мгновенные изменения скорости) к динамическим объектам в DCE. Также в DCE появилась поддержка ландшафта
- Улучшенная физика ODE. В отличие от старой реализации в Xtreme3D 2.0, теперь в ODE в полной мере поддерживаются Freeform-объекты (как для статических, так и для динамических тел), а также ландшафт. Кроме того, появилась возможность задавать позиции геометриям при их создании, что позволяет создавать составные тела - такие, например, как стол с ножками
- Функции для создания скриншотов и сохранения текстур из памяти в файлы BMP
- Функция чтения текстовых файлов.

Xtreme3D 3.1 (30.09.16)

Осенью 2016 года вышло первое обновление новой ветки Xtreme3D - версия 3.1. Вот список самых важных изменений в ней:

- Улучшенный API для объектов Freeform - появилась возможность ручной сборки Freeform из вершин и полигонов, функции трансформации мешей, а также сохранение Freeform в файл
- Поддержка новых файловых форматов: CSM и LMTS (которых не было в 3.0), X, ASE, DXS
- Поддержка Ragdoll в ODE
- Объект Movement, который позволяет задавать объектам траектории движения
- Улучшенный BumpShader - появилась поддержка теневых карт и автоматического генерирования пространства касательных
- Улучшенный PhongShader - появилась поддержка текстур
- Объект HUDShape - 2D-фигура (поддерживаются прямоугольник, окружность, отрезок и меш)
- Улучшенный API для спрайтов - появилась поддержка текстурных атласов (т.е., использования фрагмента текстуры для отрисовки спрайта), а также отрисовки из заданной точки вместо центра
- Поддержка альфа-канала для PNG
- Функции для опрашивания размеров текстуры.

Xtreme3D 3.2 (21.10.16)

- Поддержка FBO, быстрых внеэкранных буферов, с помощью которых можно реализовать многопроходный рендеринг и различные сложные эффекты постобработки
- Новый, совместимый с шейдерами механизм мультитекстурирования для материалов. Теперь материалы могут иметь до 8 текстур, и GLSL-шейдеры могут автоматически их принимать в качестве параметров
- Функция ViewerRenderObject для рендеринга отдельных объектов и иерархий
- Функция MaterialLoadTexture
- Исправлен баг в функции ObjectSetParent.

Xtreme3D 3.3 (26.11.16)

- Новые функции для Freeform, позволяющие читать и модифицировать геометрию модели (координаты вершин, нормали, индексы и т.д.)
- Поддержка замещающих материалов (Override Material) для видов и FBO. Позволяет задать единый материал, с которым должны рендериться объекты, игнорируя свои собственные материалы
- Поддержка цветовых буферов разных форматов для FBO (включая 32-битные с плавающей запятой)
- Функция FBORenderObjectEx
- Поддержка рендеринга теней ShadowMap в заданный пользователем FBO вместо внутреннего буфера
- Функции ViewerGetSize, ViewerGetPosition, а также ViewerIsOpenGLExtensionSupported.

Xtreme3D 3.4 (30.12.16)

- Добавлена поддержка TTF-шрифтов и вывода любых символов Юникода через кодировку UTF-8
- Добавлены функции ObjectHash (хэш-таблица для хранения любых объектов Xtreme3D)
- Изменен API функции FBORenderObjectEx - появились новые параметры, позволяющие выборочно очищать цветовой буфер и буфер глубины, а также копировать содержимое FBO в основной кадровый буфер
- Поддержка передачи в параметр шейдера GLSL видовой и обратной видовой матриц, а также особого параметра, позволяющего шейдеру узнать, есть ли текстура в заданном текстурном блоке
- В целях ускорения загрузки ресурсов объекты Freeform теперь не генерируют октарные деревья и векторы касательных и бинормалей при загрузке. Это должно быть сделано вручную, если нужно, функциями FreeformGenTangents и FreeformBuildOctree
- Исправлен баг в функции MaterialCubeMapLoadImage. Также в GLSL теперь задействуется бесшовное кубическое проецирование для произвольных мип-уровней кубической текстуры, если поддерживается расширение GL_ARB_seamless_cube_map.

Xtreme3D 3.5 (04.02.17)

- Добавлен объект ClipPlane - плоскость отсечения
- Улучшены шейдеры PhongShader и BumpShader: добавлена поддержка источников света типа lsSpot, тумана, прозрачности и рендеринга без освещения (если освещение отключено в настройках вида). Прозрачность задается через альфа-канал диффузной текстуры - либо, альтернативно, через значение альфа диффузной компоненты материала (только для PhongShader)
- Добавлены новые функции для материалов: MaterialCullFrontFaces, MaterialSetZWrite
- Добавлены новые функции ODE, позволяющие вручную задавать скорость, позицию и поворот динамическим телам.

Xtreme3D 3.6 (17.12.17)

Один из самых крупных релизов в ветке 3.x - разработка этой версии длилась более полугода.

- Добавлена поддержка кодировки Windows для TTF-шрифтов, а также пользовательских 8-битных кодировок
- Добавлены новые функции для материалов: MaterialSetTextureExFromLibrary, MaterialGetNameFromLibrary
- Добавлены новые функции для Freeform: функции FreeformSetMaterialLibraries, FreeformMeshFaceGroupSetLightmapIndex, FreeformMeshFaceGroupGetLightmapIndex
- Добавлены специализированные прокси-объекты для актеров (ActorProxy)
- Возвращены функции ActorMoveBone и ActorRotateBone, добавлена функция ActorMeshSetVisible
- Возвращена функция ObjectInFrustrum
- Возвращены функции мыши, добавлена функция чтения с клавиатуры
- Добавлены функции для создания окон и управления ими
- Добавлены функции для создания цвета из RGB-компонентов
- Добавлены экспериментальные функции для сохранения сцены в файл и чтения из него
- При создании шейдера GLSL теперь не выводится сообщение об ошибке, если ошибок нет
- В шейдерах PhongShader и BumpShader исправлен баг с неправильным расчетом бликов.

Xtreme3D 3.7 (??.??.??)

Самый крупный релиз со времен 3.0. Разработка этой версии также длилась более полугода.

- Новая система освещения, поддерживающая множество источников света. Теперь можно создать любое количество источников - при рендеринге объекта учитываются 8 ближайших. Для этого надо добавить объекту эффект LightFX (функция LightFXCreate). При этом направленные источники имеют более высокий приоритет, чем точечные и конусные. Система совместима со встроенными шейдерами, также эффект учитывается и для всех потомков объекта. Главный недостаток - большие объекты, типа плоскостей, ландшафта и геометрии уровня, все так же учитывают лишь 8 источников света вокруг их центра, так что для освещения уровней остается только lightmapping.
- Общее количество источников света может быть задано функцией EngineSetMaxLights. Это необходимо, чтобы избежать оверхеда при использовании более 8 источников света. Если это значение поставить в 0, то поведение движка будет таким же, как в старых версиях - Xtreme3D будет использовать максимальное количество источников света, поддерживаемое видеодрайвером. По умолчанию это значение равно 8 - таким образом, Xtreme3D по умолчанию не использует более 8 физических источников света, но это ограничение не относится к системе LightFX.
- Интеграция физического движка Kraft. Это современный движок динамики твердых тел, написанный на Delphi. Поддерживает все базовые геометрии (плоскость, сфера, бокс, капсула) и статические меши, позволяет создавать составные геометрии. Kraft работает стабильнее, чем ODE, и имеет более совершенную проверку столкновений, а также включает поддержку рейкастинга. Для использования Kraft не нужна внешняя DLL, поскольку движок встроен прямо в xtreme3d.dll. Поддержка ODE в обозримом будущем сохранится, но уже не будет обновляться.
- Функции редактирования карты высот ландшафта: BmpHDSCreateEmpty, BmpHDSSetHeight, BmpHDSGetHeight. Функция BmpHDSSave для сохранения карты высот в файл BMP.
- Функция TerrainGetHDSPosition, возвращающая позицию пикселя карт высот в заданной точке на ландшафте.
- Базовая поддержка формата моделей FBX. Пока распространяется только на Freeform, но в будущем планируется добавить ее и для Actor. Поддерживается только бинарная версия формата. Материалы не загружаются. Загрузчик основан на библиотеке OpenFBX, и для его использования нужна OpenFBX.dll.
- Новые функции для прокси-актеров: ActorProxyObjectSetAnimationRange, ActorProxyObjectSetInterval.
- Функции для чтения и распаковки PAK-архивов: PakGetFileCount, PakGetFileName, PakExtract, PakExtractFile. Функция SetPakArchive теперь возвращает id PAK-файла, который необходим для вышеперечисленных функций. Также теперь поддерживаются сжатые PAK-архивы.
- Добавлена функция HUDSpriteGetMouseOver.
- Добавлена функция ObjectGetScale.
- Функция ObjectDestroy теперь работает со всеми типами объектов Xtreme3D.
- Новые функции для работы с окнами (WindowSetIcon, WindowIsShowing).
- Функция ViewerResetPerformanceMonitor, решающая проблему с постепенным увеличением FPS.
- Выводятся сообщения об ошибке при загрузке ресурсов (для Freeform, Actor и текстур). Вывод сообщений можно отключить функцией EngineShowLoadingErrors, в этом случае движок будет просто игнорировать ошибку и работать дальше.