Lost Heaven modding
Advertisement
Lost Heaven modding
FMVcolt

4ds модель c текстурами и без

Описание[]

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 При указании основная текстура начинает светиться.

Структура материала[]

MATERIAL
Тип данных Наименование Пример данных Комментарий
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 - прозрачен наполовину.


Далее идут структуры, наличие которых определяется флагами.

Если установлен флаг Reflection Map Enabled
Тип данных Наименование Пример данных Комментарий
float reflectionLevel 0.4 Сила проявления текстуры отражения в интервале от 0 до 1.0
unsigned byte reflectionTextureNameLength Количество символов в имени текстуры.
char reflectionTextureName[reflectionTextureNameLength] Имя текстуры отражения.


Если установлен флаг Diffuse Map Enabled
Тип данных Наименование Пример данных Комментарий
unsigned byte diffuseTextureNameLength 11 Количество символов в имени текстуры.
char diffuseTextureName[diffuseTextureNameLength] 1PLACKA.BMP Имя основной текстуры. В качестве текстур движок Mafia поддерживает 24 и 32х битные изображения в форматах *.bmp и *.tga.


Если установлен флаг Opacity Map Enabled но не установлен флаг Image Alpha
Тип данных Наименование Пример данных Комментарий
unsigned byte opacityTextureNameLength 12 Количество символов в имени текстуры.
char opacityTextureName[opacityTextureNameLength] 1PLACKAO.BMP Имя текстуры прозрачности. Текстура должна быть черно-белой: белый цвет - текстур непрозрачна, черный - полностью прозрачна.


Обратите внимание: если материал не содержит ни основной текстуры ни текстуры прозрачности (флаги Diffuse Map Enabled и Opacity Map Enabled не установлены) вместо их структур будет один байт который следует пропустить.

Далее идет структура анимации. Анимированной может быть как основная текстура, так и текстура прозрачности. Для анимации используется покадровый набор текстур. Имя первой текстуры должно заканчиваться двумя нулями "00". Материал не может быть анимирован в обоих вариантах сразу. Сначала следует проверка, установлен ли флаг Opacity Map Animated. Если не установлен, только тогда производится проверка флага Diffuse Map Animated.

ANIMATION
Тип данных Наименование Пример данных Комментарий
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 теней.

Ссылки[]

Формат(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

Наверх

Advertisement