Описание[]
3д модели поддерживаемые движком LS3D Engine имеют расширение *.4ds. Mafia поддерживает версию 29. Более новые версии данного формата используются в играх Hidden & Dangerous 2, Wings of Prey, Chameleon, а также в консольной версии Mafia.
Структура формата[]
Описание формата основано на шаблонах для шестнадцатиричного редактора 010 Editor за авторством hdmaster, RoadTrain и pudingus.
Квадратные скобки "[ ]" в наименовании обозначают размер данных в количестве указанного типа данных.
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
char | signature[4] | 4DS\x00 | Сигнатура файла для идентификации. |
unsigned int16 | version | 29 | Версия формата. Mafia поддерживает версию 29. |
FILETIME | timestamp | 08/03/2001 08:03:58 | Дата экспорта файла в 64-х битном значении. |
unsigned int16 | numMaterials | 8 | Количество материалов используемых моделью. |
structure | MATERIAL[numMaterials] | Далее в определенном порядке идут структуры материалов в количестве указанном выше. | |
unsigned int16 | numNodes | 30 | Количество "узлов" объектов с данными, используемыми для построения и визуализации 3д модели. |
structure | NODE[numNodes] | Далее в определенном опрядке идут структуры объектов в количестве указанном выше. | |
unsigned byte | hasAnimationFile | 0 | Специальный флаг, указывающий использует ли модель анимацию. Если значение равно "1" движок будет искать в папке Models файл анимации с расширением *.6ds и названием как у модели. При обнаружении анимация подгрузится и модель в игре будет ее проигрывать. |
Материалы[]
Материалы в Mafia определяют, какого цвета будут использующие их полигоны модели, по каким правилам будут проецироваться текстуры на них, а также другие специфические параметры задаваемые флагами.
Флаги материала[]
Описание флагов основано на спецификации 4ds формата от djbozkosz.
Флаги материала представляют собой 32-х битное значение, каждый бит которого представляет собой маску определенного параметра. Если бит равен единице - параметр используется материалом. Равен нулю - параметр не присвоен.
Читать и записывать флаги удобнее всего с помощью проверочного значения. Получить это значение можно с помощью битовой операции сдвига влево. Например, чтобы получить проверочное значение для флага DiffuseMap Enabled(Используется ли в материале основная текстура) необходимо сдвинуть порядковый номер бита (18) на 1 влево: 1 << 18. Получается 262144 или 0x00040000 в шестнадцатиричной системе счисления.
Читать флаги можно с помощью побитовой операции "AND". При сравнении двух чисел в результате будут выведены биты стоящие на одинаковых позициях и равные единице. Например, значение флагов в материале равно 0x20848001. Проверим установлен ли флаг DiffuseMap Enabled: 0x20848001 & 0x00040000 даст результат 0x00040000, что соответствует проверочному значению. Это означает что материал использует основную текстуру.
Запись флагов производится простым суммированием проверочных значений. К примеру, для материала используещего DiffuseMap, Opacity Map и Mip-Mapping сумма будет следующей: 0x00040000 + 0x40000000 + 0x00800000 = 0x40840000 (1082392576).
Номер бита | Значение для проверки | Наименование | Описание |
---|---|---|---|
0 | 0x00000001 | unknown | Неизвестен, но часто используется. |
1 | 0x00000002 | unknown | |
2 | 0x00000004 | unknown | |
3 | 0x00000008 | unknown | |
4 | 0x00000010 | unknown | |
5 | 0x00000020 | unknown | |
6 | 0x00000040 | unknown | |
7 | 0x00000080 | unknown | |
8 | 0x00000100 | Reflection Blending: Basic | Текстура отражения проявляется поверх основной текстуры с интенсивностью заданной параметром reflectionLevel. |
9 | 0x00000200 | Reflection Blending: Multiply | Текстура отражения переумножается с основной текстурой. Параметр reflectionLevel игнорируется. Флаг Reflection Blending: Basic также должен быть указан. |
10 | 0x00000400 | Reflection Blending: Additive | Текстура отражения суммируется с основной текстурой. Параметр reflectionLevel игнорируется. Флаг Reflection Blending: Basic также должен быть указан. |
11 | 0x00000800 | unknown | |
12 | 0x00001000 | Reflection Calculate: Y Axis | Данный флаг обязательно должен быть указан если используется текстура отражения. |
13 | 0x00002000 | Reflection Projection: Y Axis | Текстура отражения проецируется по оси Y. |
14 | 0x00004000 | Reflection Projection: Z Axis | Текстура отражения проецируется по оси Z. |
15 | 0x00008000 | Additional Effect | Флаг всегда указывается, если используются Opacity Map, Color Key или Additive Mixing. |
16 | 0x00010000 | unknown | |
17 | 0x00020000 | unknown | |
18 | 0x00040000 | Diffuse Map Enabled | Указывается если используется основная текстура. |
19 | 0x00080000 | Reflection Map Enabled | Указывается если используется текстура отражения. |
20 | 0x00100000 | unknown | |
21 | 0x00200000 | unknown | |
22 | 0x00400000 | unknown | |
23 | 0x00800000 | Mip-Mapping | Определяет, использует ли материал метод мип-текстурирования для предотвращения мерцания текстур. |
24 | 0x01000000 | Image Alpha | Вместо отдельной текстуры отражения будет использоваться альфа-канал основной текстуры. Если указан вместе со флагом Opacity Map Enabled, материал не содержит структуру с данными для текстуры отражений. |
25 | 0x02000000 | Opacity Map Animated | Текстура прозрачности анимирована. Материал содержит дополнительную структуру с данными для анимации. |
26 | 0x04000000 | Diffuse Map Animated | Основная текстура анимирована. Материал содержит дополнительную структуру с данными для анимации. |
27 | 0x08000000 | Coloring | Если флаг установлен, цвета Diffuse и Ambient указанные в материале будут окрашивать основную текстуру. Если в материал не использует текстуры, он будет всегда окрашивать полигоны независимо от того установлен ли данный флаг. |
28 | 0x10000000 | Two-Sided | Обычно невидимые обратные стороны полигонов начинают отображаться. |
29 | 0x20000000 | Color Key | Один из цветов в текстуре будет прозрачным. Это может быть черный цвет, либо первый цвет в таблице цветов для индексированых *.bmp изображений. В сочетании с мип-текстурированием переходы к прозрачным участкам будут сглаженными. |
30 | 0x40000000 | Opacity Map Enabled | Указывается если используется черно белая текстура прозрачности. |
31 | 0x80000000 | Additive Mixing | При указании основная текстура начинает светиться. |
Структура материала[]
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
unsigned int32 | flags | 0x40840001 | Флаги материала. В данном случае выставлены флаги DiffuseMap Enabled, Opacity Map Enabled, Mip-Mapping, а также неизвестный флаг под номером бита 0. |
float | ambient[3] | 0.09803922
0.09803922 0.09803922 |
Цвет освещения полигонов модели, к которым присвоен материал. Применяется если материал не использует текстур. Чтобы использовать с затекстуренными моделями, необходимо выставить флаг Coloring.
Для преобразования в формат RGB каждое значение следует умножить на 255.0 |
float | diffuse[3] | 0.4980392
0.4980392 0.4980392 |
Цвет полигонов модели, к которым присвоен материал. Применяется если материал не использует текстур. Чтобы использовать с затекстуренными моделями, необходимо выставить флаг Coloring. |
float | emissive[3] | 0
0 0 |
Цвет светимости полигонов модели, к которым присвоен материал. |
float | opacity | 1 | Определяет степень прозрачности материала от 0 до 1.0: 1 - непрозрачен, 0 - полностью прозрачен, 0.5 - прозрачен наполовину. |
Далее идут структуры, наличие которых определяется флагами.
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
float | reflectionLevel | 0.4 | Сила проявления текстуры отражения в интервале от 0 до 1.0 |
unsigned byte | reflectionTextureNameLength | Количество символов в имени текстуры. | |
char | reflectionTextureName[reflectionTextureNameLength] | Имя текстуры отражения. |
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
unsigned byte | diffuseTextureNameLength | 11 | Количество символов в имени текстуры. |
char | diffuseTextureName[diffuseTextureNameLength] | 1PLACKA.BMP | Имя основной текстуры. В качестве текстур движок Mafia поддерживает 24 и 32х битные изображения в форматах *.bmp и *.tga. |
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
unsigned byte | opacityTextureNameLength | 12 | Количество символов в имени текстуры. |
char | opacityTextureName[opacityTextureNameLength] | 1PLACKAO.BMP | Имя текстуры прозрачности. Текстура должна быть черно-белой: белый цвет - текстур непрозрачна, черный - полностью прозрачна. |
Обратите внимание: если материал не содержит ни основной текстуры ни текстуры прозрачности (флаги Diffuse Map Enabled и Opacity Map Enabled не установлены) вместо их структур будет один байт который следует пропустить.
Далее идет структура анимации. Анимированной может быть как основная текстура, так и текстура прозрачности. Для анимации используется покадровый набор текстур. Имя первой текстуры должно заканчиваться двумя нулями "00". Материал не может быть анимирован в обоих вариантах сразу. Сначала следует проверка, установлен ли флаг Opacity Map Animated. Если не установлен, только тогда производится проверка флага Diffuse Map Animated.
Тип данных | Наименование | Пример данных | Комментарий |
---|---|---|---|
unsigned int32 | numFrames | 20 | Количество кадров анимации. Равно количеству текстур. |
unsigned int16 | unknown | 0 | |
unsigned int32 | delay | 60 | Задержка между кадрами. |
unsigned int32 | unknown | 0 | |
unsigned int32 | unknown | 0 |
Список файлов[]
Составить список остальных моделей (а лучше рассортировать их принтскрины) — мечта с 10 летним стажем.
- FMV_* — модели объектов из видеовставок, красивее чем в игре.
- ????S — файлы чье имя заканчивается на «S» нужны для создания 6ds теней.
Ссылки[]
- Описание структуры файла для 010 Editor'a, от hdmaster & RoadTrain
- англ версия от djbozkosz
- документация от GOLOD55
- обсуждение на mafiascene
- chm файл Имя_файла_модели-картинка:
Формат(outdated)[]
----------------------------------------------------------------------------- variable type description ----------------------------------------------------------------------------- fileSgn 4 byte const = 34 44 53 00 fileVer 2 byte версия файла. Для Мафии = 1D 00 timestamp 8 byte дата создания файла texturesSec раздел текстур meshsSec раздел каркасов в модели animFileFlag byte флаг наличия файла анимации у модели: 1\0 (есть\нет). 5ds должен иметь то же имя что и модель -----------------------------------------------------------------------------
texturesSec — раздел текстур[]
----------------------------------------------------------------------------- variable type description ----------------------------------------------------------------------------- texturesCount short количество текстур в модели textureDesc1 описание первой ... textureDescN и последней -----------------------------------------------------------------------------
textureDescX — описание текстуры[]
----------------------------------------------------------------------------- variable type description ----------------------------------------------------------------------------- textureTypeFlags 4 byte флаги типов текстур (см ниже) ambientColorRed float изменение текстуры в тени. Значения от 0 до 1 ambientColorGreen float ambientColorBlue float diffuseColorRed float при освещении рассеянным светом. От 0 до 1 diffuseColorGreen float diffuseColorBlue float emissionColorRed float свечение(?). От 0 до 1 emissionColorGreen float emissionColorBlue float transparency float прозрачность. От 0 (невидимый) до 1 (непрозрачный) textureNameSize * byte длинна имени файла текстуры с расширением bmp,tga textureFileName string(textureNameSize) имя файла текстуры optionalPart для некоторых типов текстур, здесь будут еще пару строк ----------------------------------------------------------------------------- Примечания: * Если textureNameSize=0, то textureFileName отсутствует, модель не имеет текстуры и залита цветом в соответствии с ambientColor\diffuseColor\emissionColor.
textureTypeFlags — флаги типов текстур[]
Могут складываться, если она принадлежит нескольким типам. В описании от GOLOD55 их гораздо больше, чем в версии djbozskoz ----------------------------------------------------------------------------- type value description ----------------------------------------------------------------------------- 00 00 01 00 00 00 02 00 00 00 04 00 00 00 10 00 00 00 20 00 diffuse 00 00 40 00 00 00 80 00 00 04 00 00 00 08 00 00 MIPmapping 00 80 00 00 набор текстур упрощенных версий для разглядывания с большого расстояния, например, дорожная разметка вдалеке выглядят расплывчатой animatedAlfa 02 00 00 00 анимированная текстура с альфа каналом animatedDiffuse 04 00 00 00 10 00 00 00 20 00 00 00 alfa 40 00 00 00 текстура с альфа каналом 80 00 00 00 -----------------------------------------------------------------------------
meshs — раздел каркасов (обычный - не сектор)[]
----------------------------------------------------------------------------- variable type description -----------------------------------------------------------------------------
meshsCount short количество объектов в модели
float Привязка объекта (является порядковым номером родительского объекта)
float Координаты объекта по оси x
float Координаты объекта по оси y
float Координаты объекта по оси z
float Размеры объекта по оси x
float Размеры объекта по оси y
float Размеры объекта по оси z
float ???
float Ротации по оси x
float Ротации по оси y
float Ротации по оси z
10 byte ???
meshDesc1 Название объекта модели
...
meshDescN