Описывает геометрию(и пр.) некого объема пространства, который будет(должен) иметь свои лайты(включая 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]

===================

Наши рекомендации