Суббота, 2024-05-18, 7:54 PM
Начало Каталог статей Регистрация Вход
Вы вошли как "Гость" · RSS
Меню сайта
Категории каталога
Формат объектов [1]
Форма входа
Поиск по каталогу
Друзья сайта
Наш опрос
Оцените мой сайт

Результаты · Архив опросов

Всего ответов: 28
Статистика
Каталог статей
» Статьи » Форматы данных » Формат объектов

Meshes
Список объектов

В FE2 (Frontier:Elite 2) объекты разделяются на три типа: главные (корабли, планеты, города, и т.д.), специальные (векторный шрифт, могильный камень, показываемый при смерти пилота), объекты из заставки (те, которые вы видите при запуске игры). В FFE (Frontier:First Encounters) же все объекты расположены в одном большом списке, без разделений.
Сам по себе список не содержит другой информации кроме как указатели на области памяти с нужными данными. Каждый указатель может быть либо нулевым, либо указывать на структуру модели. Количество указателей ничем не ограничено.

Структура модели

Каждая единичная 3D модель описана одной структурой (тип структуры для всех моделей одинаков). Каждый объект выглядит следующим образом:


typedef struct {
unsigned short * Mesh_ptr;
signed char * Vertices_ptr;
int NumVertices;
signed char * Normals_ptr;
int NumNormals;
int Scale;
int Scale2;
int Radius;
int Primitives;
color_t DefaultColor;
char padding;
int field_28;
int field_2C;
int field_30;
unsigned short * Collision_ptr;
ShipDef_t * Shipdef_ptr;
int LinefeedCharacter;
unsigned short * Character[1];
} Model_t;

Mesh_ptr - указатель на начало скрипта описания модели.
Vertices_ptr - указатель на начало координат вершин.
NumVertices - количество кординат. На самом деле больше в два раза, так как описываются только четные координаты, нечетные - симетричны, поэтому различаются лишь знаком.
Normals_ptr - указатель на нормали. Используется для просчета освещения и видимости. Если 0, нормаль не требуется (в каких случаях?).
NumNormals - количество нормалей. Аналогично координатам - симетричны, поэтому четные и нечетные различаются лишь знаком.
Scale - используется для смешения координат вершин. Малые объекты имеют значение "3" (голова пилота, часы в церкви), большие могут достигать 16h (22 в десятичном).
Scale2 - аналогично Scale, но "0" для малых объектов, и большее значение для звезд, планет, и так далее.
Radius - неизвестно.
Primitives - количество примитиовов в объекте.
DefaultColor - цвет точки, которой отображается корабль, когда находится очень далеко. Если красный компонент цвета имеет 7ой бит установленным в "1", объект "светится" и выглядит как звезда, если нет, выглядит как небольшая точка. Звезды, орбитальные станции и сбитые Таргоны обязательно светятся, планеты и остальные корабли - нет (Кроме Thargoid Transporter и INRA Command Ship).
padding - один байт, предназначен для выравнивания структуры по слову (или нет?).
Collision_ptr - указатель на "0" или сам "0". Назначение неизвестно.
Shipdef_ptr - либо "0" (модель не является кораблем), либо содержит указатель на структуру ShipDef_t.
LinefeedCharacter - вершина, относительно которой строится текст.
Character[1] - указатель на первую букву надписи. Если "0", то текста нет. Количество элементов непостоянно.
Назначение остальных полей структуры пока неизвестно.

Дополнительные структуры

Самая простая структура - color_t. Она содержит три составляющих - red, green, blue, по одному байту на каждый цвет.

Одна из самых раскрытых на сегодня структур - ShipDef_t. В ней хранится вся информация о каждом корабле. Структура имеет следующий вид:


typedef struct {
short ForwardThrust ;
short RearThrust ;
char Gunmountings ;
char FuelScoop ;
short Mass ;
short Capacity ;
short Price ;
short Scale ;
short Description ;
short Crew ;
short Missiles ;
char Drive ;
char IntegralDrive ;
short EliteBonus ;
short Camera1_x, Camera1_y, Camera2_x, Camera2_y ;
short frontMount_x, frontMount_y ;
short rearMount_x, rearMount_y ;
short topMount_x, topMount_y ;
short bottomMount_x, bottomMount_y ;
} ShipDef_t ;

ForwardThrust, RearThrust - передние и задние двигатели. Двигаемся вперед, первый +, второй -, и наоборот при движении назад.
Gunmountings - количество присоединенного оружия. Значения от 0 до 4, больше поставить нельзя (звезду смерти сделать не получится однозначно)!
FuelScoop - топливосборник. От 0 до 1.
Mass - масса корабля.
Capacity - вместимость корабля.
Price - цена нового корабля. Необходимо умножить на 1000.
Scale - размер корабля при отображении в доке. Не влияет ни на что, кроме этого момента.
Description - номер строки с описанием.
Crew - необходимое количество членов экипажа (включая капитана).
Missiles - количество ракет, присоединенных к кораблю. "0" для IP Shuttle, максимум "8". Значение жестко прописано, изменить больше лимита невозможно.
Drive - присоединенный двигатель. Значение от 0 до 14.
IntegralDrive - если "0", двигатель можно менять.
EliteBonus - бонус, который дается к рейтингу если сбить данный корабль.
Camera1_x, y and Camera2_x, _y - позиции камеры для данного типа корабля.
frontMount_x and y, and rearMount_*, topMount_* and bottomMount_* - координаты присоединяемых пушек к кораблю. Не изменяется при масштабировании, необходимо делать самому. Порядок - передняя, задняя, верхняя, нижняя пушки.

Определение вершин и нормалей

Структура координат следующая: первый байт определяет тип координат, далее идет (? не понял), затем сами координаты и снова (? опять не въехал).

typedef struct {
unsigned char type;
unsigned char pad1;
signed char x,y,z;
unsigned char pad2;
} Vertex_t ;

Как уже было сказано ранее, структура описывает только четные вершины, нечетные симетричны по оси Х и различаются лишь знаком.
Есть несколько типов вершин, известны лишь некоторые:

Type 1 - обычная вершина, описывает что угодно во всей галактике.
Type 5 - симетричная вершина. z содержит номер вершины, по отношению к которой эта симетрична (по Х оси). Необходимо лишь поменять знак Х координаты.
Type 7 - вершины со случайными координатами (?).
Type 11 - интересная вершина - z и y указывают номера вершин, посредине которых находится эта вершина. x координата равна 1 и не учитывается.
Type 19 - еще одна очень интересная вершина. Значение в координате Х является номером внешней переменной и оно интерполируется между вершинами, индексы которых хранятся в Y,Z.

Переменные

Переменные могут быть 16 битными словами из Глобального пула (обычно они определяют такие внутренние значения, как "Отображать линии сетки", "Есть сканер" и так далее), и 32 битными двойными словами из небольшого локального пула. Локальный пул определяется для каждого объекта, который будет отрисовываться и его содержимое напрямую зависит от кода отображения. Он используется для текущих вычислений корректировки позиций подобъектов.
По первым битам можно определить тип переменной. При маскировании C0h получаются следующие результаты:
00h: текущее значение в пределах от 0 до 63
40h: большое текущее значение в пределах от 0 до FC00
80h: значение из Глобального пула в пределах от 0 до 64. Переменная #0 - это TIME, используется при анимации.
C0h: локальная переменная от 0 до 6. Перед использованием должна быть инициализирована.

Игра использует только локальные переменные от 0 до 6, результат вычислений всегда помещается в локальный пул.
Глобальный пул заполнен значениеями для каждой модели отдельно. Если вы видите на экране три Viper, то каждая из них является отдельной от других, что можно увидеть в глобальном списке перемернных.

Категория: Формат объектов | Добавил: Quester (2006-07-03)
Просмотров: 1111 | Комментарии: 2 | Рейтинг: 0.0 |

Всего комментариев: 0
Имя *:
Email *:
Код *: