Описывает геометрию(и пр.) некого объема пространства, который будет(должен) иметь свои лайты(включая ambient-light).
Блок с общими данными
Размер блока = 14 байт.
L 34445300 флаг файла; текст “4DS.”(const)
S 1D00 спец.метка(const)
<8 байт> ? некие общие данные о конкретном файле; пусть будут пока нулями. Потом заюзаем 4ds-unlocker и он их подправит как нужно.
Прим.: есть другие структуры, например, с меткой 3A00 (tvoda01.4DS).
Раздел текстур
Состоит из секторов с текстурами.
Первая текстура в разделе текстур имеет порядковый номер 1.
Вначале задается их кол-во.
S чек-сумма кол-ва секторов с текстурами
Далее идут текстурные сектора по-порядку.
Текстурный сектор состоит из нескольких подсекторов – подсектор с настройками и подсектора с самими именами текстур. У анимированных текстур есть дополнительный подсектор с их настройками(аним.подсектор).
Подсектор с настройками:
Размер подсектора = 44 байта.
B 01 флаг всего текстурного сектора
<3 байта> настройки типа unused, glowing, color key; влияют на
интенсивность цветов(увеличивают нек. до 1)(см.прим.)
F ?
F ?
F ?
F интенсивность красного цвета(макс=0.5, мин=0)
F интенсивность зеленого цвета(то же)
F интенсивность синего цвета(то же)
F ? заноза с этим не работает, обнуляет.
F ? заноза с этим не работает, обнуляет.
F ? заноза с этим не работает, обнуляет.
F прозрачность(“блик”); от 0…1 (1-нет прозрачности; 0 –
полная прозрачность)
Подсектора с именами текстур:
Имен текстур в нем может быть от нуля до трех. Первое имя – первичная текстура; второе – вторичная(“альфа-текстура”); третье – хз(редко встречается: есть, например, в ресторане Пепе; задает некий оттенок(фон, хром-текстура) для вторичной текстуры? Также имеет дополнительную F перед именами текстур(второй “блик”?)).
Соответственно, подсектор с именем имеет структуру:
B чек-сумма длины полного имени текстуры
<nn байт> имя текстуры в виде <имя>.BMP (или <имя>.TGA)
Если имя отсутствует, то байт чек-суммы длины имени, соотв-но, равен 0. Это означает что соотв. объект не имеет текстуры, а просто окрашен неким цветом(согласно смешению цветов) программно; и тогда остальных текстур в данном подсекторе также нет(см. также прим.).
Аним.подсектор:
Размер равен 18 байт.
Нуждается в соотв. настройках в подсекторе с настройками(см.прим.). В качестве имени текстур пишется первая из аним.текстур; имена текстур должны иметь соотв. вид: первичная - <имя>00.BMP, вторичная(если есть) - <имя>000.BMP. В папке MAPS должен иметься “видеоряд” из них. Первая текстура видеоряда имеет имя <имя>00.BMP, вторая - <имя>01.BMP и т.д.(вторичные – аналогично).
B кол-во аним.текстур видеоряда
B 00 ?(=01 в vodapristavm.4ds, morezk1.4ds)
L 00000000 ?(=0A000000 в explosion.4ds)
L время задержки пролистывания текстур видеоряда.
L 00000000 ?
L 00000000 ?
B textures sequence amount
B 00 ?(=01 in vodapristavm.4ds, morezk1.4ds)
L 00000000 ?(=0A000000 in explosion.4ds)
L textures listing wait time
L 00000000 ?
L 00000000 ?
Прим.:
Данные <3 байта> - основные настройки:
Normal textures settings:
1. “unused”:
000000 EMPTY(xsvetlolof 02.4ds)
00A000 EMPTY(sky14.4ds)
008000 EMPTY(xx vana.4ds, xsvetlo 02 on.4ds)
008010 EMPTY(m_vetrm.4ds)
910800 EMPTY(invisible.4ds)
800000EMPTY(shlaif02.4ds)
800010 EMPTY(xstul13_c1.4ds)
combination | primary texture | models |
mix with color | xzachod.4ds | |
mix with color | xvlajka2.4ds | |
mix with color | kaluz-seq.4ds | |
00A400 | mix with color | sky13.4ds |
00A700 | mix with color | zapad1.4ds |
light map | skyautos.4ds | |
mix with color | o_m03.4ds | |
mix with color | 9brasnotv.4ds | |
mix with color | xsvetlo 04 on.4ds | |
mix with color | zem_tomanim.4ds | |
mix with color | xzachod.4ds | |
mix with color | zblunk.4ds | |
mix with color | xreflektor.4ds | |
light map | xsvetlo 04 on.4ds | |
mix with color | 2fireworks.4ds volumelight.4ds | |
80A480 | light map mix with color | xreflektor.4ds xsvetlo 13 on.4ds |
2. “color key”:
800020EMPTY(8fabdr1.4ds, vitrina03.4ds)
808020 EMPTY(xtrava 1.4ds, 9vejir.4ds)
800030 EMPTY(8drat2.4ds)
combination | primary texture | model |
mix with color | TH_strom02.4ds | |
mix with color | ws_zluty.4ds | |
mix with color | xvesak.4ds | |
mix with color | xvedeni3.4ds | |
3. “glowing”:
800050EMPTY(smoke.4ds, blood.4ds)
808040 EMPTY(9bang.4ds, 2sklinka2.4ds, xtrava 2.4ds)
combination | primary texture | alfa texture | model |
mix with color | disabled | zblunk.4ds 2feather.4ds | |
mix with color | disabled | UfoTalir.4ds | |
mix with color | disabled | 2fireworks.4ds | |
light map | disabled | 2fireworks.4ds | |
light map light map | - - | UfoTalir.4ds 8svet1 on.4ds | |
mix with color mix with color mix with color mix with color light map light map | disabled disabled disabled disabled disabled disabled | xsvetlo 05on.4ds zblunk.4ds 2feather.4ds hit_effect_stone.4ds 2fireworks1.4ds hit_effect_stone.4ds | |
mix with color mix with color | disabled disabled | 2fireworks.4ds xletadloup3.4ds | |
light map | disabled | 2sparkle.4ds | |
light map | disabled | hit_effect_stone.4ds | |
80A440 | light map | disabled | zapad1.4ds |
80A480 | light map | - | 7plampaon.4ds |
4. “special chrome”:
Fisrt texture =ENV(…).BMP usually(“chrome-texture”). It is not primary texture!
Sector has additional F(add.blink)!
а) “unused”:
018800EMPTY(tlacitko.4ds)
048800 EMPTY(9hpolic.4ds)
110800EMPTY(2pohar.4ds)
118800 EMPTY(Tbirdold00.4ds)
858810EMPTY(Sklenice.4ds)
combination | primary texture | model |
018C00 | mix with color | 9gramec.4ds |
028C00 | mix with color | lano2a.4ds |
038C00 | mix with color | 9vidlicka.4ds |
040C00 | mix with color | xzachod.4ds |
048C00 | mix with color | tlacitko.4ds |
058C00 | mix with color | speedster_PROVOZ.4ds |
110C00 | mix with color | xsedos.4ds |
018C00 | mix with color | 9stulsef.4ds |
118C00 | mix with color | UfoTalir.4ds |
158C00 | mix with color | solnicka.4ds |
250C00 | mix with color | fire10.4ds |
838C80 | mix with color | 9hodinky.4ds |
б) “color key”:
combination | primary texture | model |
910C20 | mix with color | xxx.4ds |
в) “glowing”(+alfa-texture):
840C50
918840 EMPTY (cord_sedanH00.4ds)
combination | primary texture | alfa texture | model |
828C40 | mix with color | disabled | ukaz.4ds |
848C40 | mix with color | disabled | 9bryle.4ds |
840C40 | mix with color | disabled | fmv_whi4.4ds |
858C40 | mix with color mix with color | ?(disabled?) mix with color | speedster_PROVOZ.4ds FMVwhiskymrph.4ds |
918C40 | mix with color | disabled | trucksplachtou.4ds |
91AC40 | mix with color | disabled | xxx.4ds |
948C40 | mix with color | disabled | fmv_whi1.4ds |
948C50 | mix with color | disabled | 9flaskw.4ds |
950C40 | mix with color | disabled | solnicka.4ds |
958C40 | mix with color | disabled | 2mol.4ds |
Animtextures settings:
1. “unused”:
combination | primary texture | model |
mix with color | bazen.4ds watercity_r.4ds vodapristavm1.4ds |
2. “color key”:
combination | primary texture | model |
mix with color | 2pajdulaci.4ds |
3. “glowing”:
808046 EMPTY(2vybuch.4ds, 2vybuch.4ds) doesnt work
800056 EMPTY(explosion.4ds) doesnt work
combination | primary texture | model |
light map | fire_effect.4ds, cord_sedanH00.4ds | |
light map | fire_effect.4ds |
4. “glowing”+alfa-texture:
combination | primary texture | alfa texture | model |
light map light map | light map disabled | 2lighting.4ds 2firesm.4ds | |
mix with color | disabled | morezk1.4ds |
5. “unused”+special chrome:
combination | primary texture | alfa texture | model |
01AC04 | mix with color | - | morezk1.4ds |
112C04 | mix with color | - | vodapristavm.4ds |
Раздел геометрических объектов
Вначале стоит
S чек-сумма кол-ва объектов в файле.
В конце файла обычно дописывается пара нуль-байтов.
Размер нелимитирован. Содержит объекты по-порядку. Порядковый номер первого объекта = 1.
Типы 4ds-объектов
Каждый тип объекта имеет свою структуру. Однако есть одинаковый блок для каждого, размером 42 байт – блок позиционирования в пространстве - назовем его general block, его структура:
S иерархия - порядковый номер объекта файле, в иерархию
кот. вложен данный объект; соотв.-но оный объект должен находиться в файле выше(см. также коммент)
F coord X
F coord Y
F coord Z
F scale X
F scale Y
F scale Z
F rotation0
F rotation1 (around X)
F rotation2 (around Y)
F rotation3 (around Z)
Данный блок – это параметры локальной оси объекта.
Также у каждого типа объекта есть свой флаг, метка и расширение(подтип). Сводная таблица оных прилагается(см. коммент).
-------------------------------------------------------------------------------------------------------
Типы объектов:
1.default-object
Обычный геометрический объект с текстурингом.
L 0100002A флаг
<general block>
B 09 метка
B чек-сумма длины имени объекта
<nn байт> имя объекта
B чек-сумма названия подтипа; если последний отсутствует, то данный байт нулевой; иначе далее идет название подтипа(<mm байт> text название подтипа) (mm=значению данной чек-суммы).
S интересная вещь; если оно равно нулю – идем дальше, если нет, то это порядковый номер объекта в файле, полную копию геометрии которого(vertex- + face-блоки) мы приписываем данному объекту и на этом заканчиваем. Меж делом заметим что, тем не менее, данный объект имеет свой general block. Также, копирование работает не со всеми типами(например, с DUMMY-типом не работает, поскольку думми имеет программно-расчитываемую геометрию из 12ти фейсов)
Иначе далее начинается блок геометрии объекта. Слагается из общего подблока и vertex- и face-блоков.
Общий подблок:
Задает дальнейшую структуру объекта.
B lod-байт(lod = low detaled object);
=01 если лодов нету,
=02 если есть один лод,
=03 если лода два и т.д. Далее рассматриваем ситуацию с отсутствием лодов…
S 0000 const; если лоды есть, то не const
S const=7A45, если лодов нет(иначе D646?). У аналогов
default-объекта(см. табл.) здесь ноль
Vertex-блок:
Содержит подсектора с вершинами объекта и чек-сумму(S) оных.
S чек-сумма кол-ва вершин.
Размер вершинного подсектора равен 32 байта. Т.о. размер всего vertex-блока равен 2+S*32.
Далее структура вершинного подсектора:
F coord X вершины
F coord Y вершины
F coord Z вершины
F ?
F ?
F ?
F ? как текстура привязана к вершине(?)
F ? как текстура привязана к вершине(?)
Первая вершина в vertex-блоке имеет порядковый номер 0.
Face-блок:
Содержит перечисление порядковых номеров вершин, образующих полигоны(faces), чек-сумму оных и их групп и порядковый номер натянутой на них текстуры(напомним: первая текстура в разделе текстур имеет номер 1).
В общем случае default-объект может иметь несколько текстур. Тогда все фейсы сортируются на группы, и каждой группе соответствует своя текстура.
Каждый фейс строится по трем вершинам.
Все данные в face-блоке – тип S.
Размер всего face-блока равен 2+размеры всех групп.
Итого, вначале:
S чек-сумма кол-ва групп фейсов.
А далее идут группы фейсов последовательно.
Размер каждой группы равен 6*(кол-во фейсов в группе)+4.
Рассмотрим структуру одной группы(пусть она имеет 2 фейса):
S 0200 чек-сумма кол-ва фейсов в группе
S 0000 вершина 0
S 0100 вершина 1
S 0200 вершина 2
S 0000 вершина 0
S 0300 вершина 3
S 0100 вершина 2
S порядковый номер соотв. текстуры для данной группы
фейсов. Если фейсы группы не затекстурены, то для них создается “пустая текстура”(в занозе имя “null”).
Прим.: если есть лоды, то они просто дописаны после данного объекта(только вертекс- и фейс-блоки).
-------------------------------------------------------------------------------------------------------
2. DUMMY
Объект без текстуры. Имеет геометрию параллелепипеда.
Строится по двум точкам, лежащим напротив по диагонали, и согласно ротации лок.оси(точки образуют 12 фейсов программно). Первая точка в геом.блоке – самая левая нижняя(наименьшие координаты), вторая – правая верхняя(наибольшие координаты).
B 06 флаг думми-объекта
<general-block>
B 09 метка
B чек-сумма длины имени объекта
<nn байт> имя объекта
B чек-сумма длины названия подтипа; если последний
отсутствует, то данный байт нулевой; иначе далее идет название подтипа(mm байт).
И далее идет геометрический блок, содержащий координаты двух крайних точек:
F coord X точки1
F coord Y точки1
F coord Z точки1
F coord X точки2
F coord Y точки2
F coord Z точки2
Размер геом.блока т.о. равен 24 байта.
-------------------------------------------------------------------------------------------------------
3. GLOW
Объект без геометрии. Содержит набор текстур в натуральную величину(это без учета шкалинга в general-блоке конечно). Также данный объект имеет встроенную функцию BBRD(авторотация), т.е. его текстуры вращаются сами т.о. чтобы всегда быть “лицом” к камере(без учета ротации в general-блоке? Или ротация должна быть нулевая? Или она просто не имеет значения? Скорее всего лок.ось крутится вслед за камерой).
L 0106002A флаг
<general block>
B 09 метка
B чек-сумма длины имени объекта
<nn байт> имя объекта
B чек-сумма длины названия подтипа(например LENSF). Если = 0, то идем дальше; если нет – далее следует название подтипа, длиной, заданной чек-суммой.
B чек-сумма кол-ва дальнейших подсекторов
Далее…каждый подсектор размером 6 байт имеет номер текстуры и настройку:
F расстояние от камеры(от прицела)
S порядковый номер текстуры
Если подсектор всего один, то F не роляет, и данный объект статичен(по координатам).
А если подсекторов несколько, то ситуация меняется. Вообще так сделаны(просимулированы) “кольца ньютона” от солнца(дифракция света) в игре…В общем описывать лень, проще глянуть в игре. Отмечу несколько моментов(тестилось на двух текстурах, расстояния 0 и 25):
а) при приближении к объекту на расстояние ~90метров он пропадал (скрывалась прорисовка)
б) как и полагается текстура1 висела всегда в прицеле(расст.0), а вторая маячила в 25 метрах визуально, причем при вращении камеры слегка колебалась в такт.
Полезного от нескольких подсекторов немного, а с одним подсектором так делаются лампочки в игре. Единственная проблема – данный тип объектов жрет ресурс движка и при удалении от него он размывается, а не уменьшается как надо было бы.
К слову сказать в scene2.bin также можно, похоже, гловинги дополнительно поднастроить; вроде бы там есть параметры по типу времени задержки прорисовки, скоростей прорисовки\антипрорисовки и пр.; иначе юзаются некие дефолт-настройки.
-------------------------------------------------------------------------------------------------------
4. LIGHT-SECTOR
Описывает геометрию(и пр.) некого объема пространства, который будет(должен) иметь свои лайты(включая ambient-light).
Размер всего объекта = имя объекта+12*(кол-во вершин)+6*(кол-во фейсов)+77*(кол-во окон)+87.
L 05 флаг
<general block> все значения – дефолт
B 7D метка лайт-сектора
B чек-сумма длины имени объекта
<nn байт> имя объекта
<9 байт> 000108000000000000 сonst
L кол-во вершин
L кол-во фейсов
Vertex-блок:
Содержит указанное выше кол-во подсекторов с вершинами объекта.
Размер вершинного подсектора равен 3*4=12 байт.
Т.о. размер всего vertex-блока равен 12*(кол-во вершин).
Далее структура вершинного подсектора:
F coord X вершины
F coord Y вершины
F coord Z вершины
Face-блок:
Содержит перечисление порядковых номеров вершин, образующих полигоны(faces). Каждый фейс строится по трем вершинам; фейсы перечисляются без разделителей(как обычно).
Все данные в face-блоке – тип S.
Т.о. размер всего face-блока равен 6*(кол-во фейсов).
Dummy-блок:
Содержит мин\макс координаты геометрии сектора по всем трем осям.
Размер блока = 2*3*4=24 байта. Все данные – тип F.
Порядок перечисления координат:
minX, minY, minZ, maxX, maxY, maxZ.
Light_windows-блок:
Содержит некое кол-во “окон” между лайт-секторами(включая примари сектор).
При нахождении камеры в лайт-секторе, прорисовка объектов другого лайт-сектора – только через окна. Прорисовка двусторонняя.
Блок имеет чек-сумму кол-ва окон(1 байт) и подсектора с самими окнами(по 77 байт).
Т.о. размер блока = 1+77*(кол-во окон данного лайт-сектора).
Структура:
B чек-сумма кол-ва окон. М.б.=0.
далее пример одного окна:
S флаг 0404 или 0444(разница неясна)
<7 байт> ? нули(под текст?)
<16 байт> ротации(тип F)
F +-координата
<48 байт> координаты 4х крайних точек окна(окно=прямоугольник)
Прим.:
Последовательность перечисления {вершин и фейсов}, {ротаций, +-координата и координат крайних точек окна} взаимосвязаны.
Оконная взаимосвязь лайт-секторов задана некими logic-рамками также.
5. MIRROR
Зеркало. Имеет геометрию и настройки.
Размер всего объекта = имя объекта+12*(кол-во вершин)+6*(кол-во фейсов)+184
L 01080022 флаг
<general block>
B 09 метка геом-объекта
B чек-сумма длины имени объекта
<nn байт> имя объекта
B 06 размер имени подтипа
<6 байт> mirror имя подтипа
<120 байт> 30 значений настроек. Тип F.
L кол-во вершин
L кол-во фейсов
Vertex-блок:
Содержит указанное выше кол-во подсекторов с вершинами объекта.
Размер вершинного подсектора равен 12 байт.
Т.о. размер всего vertex-блока равен 12*(кол-во вершин).
Далее структура вершинного подсектора:
F coord X вершины
F coord Y вершины
F coord Z вершины
Face-блок:
Содержит перечисление порядковых номеров вершин, образующих полигоны(faces). Каждый фейс строится по трем вершинам.
Все данные в face-блоке – тип S.
Т.о. размер всего face-блока равен 6*(кол-во фейсов).
=============================================================
Комменты:
1. Необходимо уточнить насчет координат\ротаций\шкалингов во всех блоках:
а) если объект не вложен по иерархии никуда, то точка отсчета – центр координат в 4DS; если он вложен, то точка отсчета – его прямой надиерархический объект(его коорд\рот\шкал). Т.е все относительно по типу “матрешки”. Так же как и связка {примари сектор - объект в сцене2.бин}.
б) координаты вершин в vertex-блоке(или точек в геом.блоке думми) используют как точку отсчета лок.ось(general-block) сего объекта.
2. Сводная таблица
Типы объектов | Флаги (hex) | Мет-ки (hex) | Подтипы(text) | Прим. |
Default-объект | 0100002A | 1D 3D | z_bias no_shadow ;M60N22I5; VOLB,0x13 ;N22Z; ;N15Z.+; z_bias ~~~ACTR:BOX~~~ ~~~ACTR:BOX50,4,1,22~~~ ~~~ACTR:BOX~~~ ;X200M50I2N22+; {auto_lod 50 250 12 .3} OFF_ SECT, OFF_ {SECT} SECT и {SECT} SECT и {SECT} glass | обычные ? ? краш-модели краш-модели краш-модели краш-модели краш-модели zabradl.4ds xbarelcr.4ds xbarel 4_c1.4ds prejimka.4ds ZLODkol.4ds, mise12garage; встроенный окклюдер, переносится чехпрогой в scene2.bin(с назначением сектора) и здесь уже не нужен Scene.4ds Scene.4ds; light-окно Scene.4ds Scene.4ds Стекла в дверях |
no_shadow | mise12-garage, Stin_auta.4ds | |||
0100000A | no_proj | Watercity.4ds | ||
no_proj no_shadow | Watercity.4ds | |||
0100002B | z_bias ~~~ACTR:BOX300,1,1,14~~~, z_bias | toys.4ds, thompsons.4ds obrgal8.4ds | ||
0100802A | AV_LIGHT | Zeleny.4ds | ||
010000AA | no_fog | skyautos.4ds | ||
Light-sector | 7D | Scene.4ds | ||
Dummy | volr,0x19 VOLA,0x19 DYNB DYNB,0x21 VOLC,0x13 vols,0x33 VOLR,0x33 VOLR,33 VOLF, 31 VOLB,0x14 [15] ~DCS~ и ~DCC~ | обычные XZVEDAK.4ds xvez.4ds xsvetlo 13 on.4ds xpytel3.4ds watercity.4ds watercity_r.4ds Переносится в tree.klz(14-свойство клипа) Muzzle в оружии(16-номер вспышки) Некие номера у DWH* в машинах(ширина следа?) Спецдуммисы в truckmorph00 | ||
Glow | 0106002A | LENSF | обычные Для солнца | |
Mirror | mirror | |||
Morph-body1 | 0102002A | 3D | SNGM | SynRad1DEAD.4ds pumpar hadice2.4ds pigeon3.4ds |
Morph-body2 | 0103002A | 3D | SNGMRPH | Тело чела |
Body_parts | 0A | 3D | TRGT=targetN TRGT | Все кроме… neck targetN |
Morph-object | 0105002A 0105802A 0105002B | MRPH MRPH, AV_LIGHT MRPH no_shadow z_bias, MRPH | xvlajka2.4ds vodapristavm1.4ds pradlo02mor.4ds strom morph.4ds noviny17a.4ds FMVwhiskymrph.4ds | |
Auto_rotate- object | 0104002A 010400AA | {BBRD} BBRD BBRD=x BBRD=y! BBRD=z! BBRD=Y!, no_fog {BBRD},no_fog | xsvetlo 07 on.4ds slunko glow.4ds, kule2.4ds odlesk.4ds w4zluty.4ds strela.4ds 2lighting.4ds semafor.4ds, tunelx.4ds | |
Прим.:
1.Объекты с метками 08 и 10 в face-блоке имеют в качестве номера текстуры ноль. 08 это окклюдер будущий; 10 – будущее “окно” между лайт-секторами (если понадобится). В общем, это вспомогательные объекты для чеховской проги.
2. [SECT, OFF_] можно писать как [SECT, off_], или без пробела [SECT,off_]; как и [no_proj no_shadow] иногда пишется с двумя пробелами…В общем не суть поскольку длина имени подтипа задается впереди него.
3. В именах объектов(чаще – в именах подтипов) можно встретить “левые” байты 0D0A. Это “пустые” байты, ничего страшного; просто чек-сумма длины имени увеличивается.
===================
poli00.4ds
polcad10.4ds
polimfor00.4ds
DWHL1.[15]
fire00.4ds
DWHR0.[15]
DWHR1.[38]
flamer00.4ds
hartmann00.4ds
DWHL0.[17]
FMVanimTruckB00.4ds
TruckA00.4ds
DWHL0.[15]
DWHR1.[40]
FMVcad_phaet.4ds
DWHL0.[20]
bull00.4ds
-
bus00.4ds
DWHL0.[20]
DWHL1.[40]
===================