Cursed Earth FIG file format ============================== * This file is part of Cursed Earth. Cursed Earth is an open source, cross-platform port of Evil Islands. Copyright (C) 2009-2010 Yanis Kurganov. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You should have received a copy of the GNU Free Documentation License along with this program. If not, see . * This is an internal documentation currently available only on Russian. Something more strong in English will be later. * Введение. Формат fig представляет из себя полное описание меша модели - набора вершин, определяющих её форму. Помимо этого, в fig присутствуют данные нормалей и текстурных координат. * Описание. Присутствует сигнатура, данные плотно упакованы. Типы: struct vec2 - вектор float x, y struct vec3 - вектор float x, y, z struct vec4 - вектор float x, y, z, w struct vertex_component - компонента для вершины uint16 vertex_index - индекс вершины uint16 normal_index - индекс нормали uint16 texcoord_index - индекс тукстурной координаты struct morph_component - компонента для морфинга uint16 morph_index - индекс вектора-смещения для морфинга (см. anmfile) uint16 vertex_index - индекс вершины Формат: uint32 signature - сигнатура, определяющая тип формата (fig8, ...) uint32 vertex_count - количество вершин uint32 normal_count - количество нормалей uint32 texcoord_count - количество текстурных координат uint32 index_count - количество индексов uint32 vertex_component_count - количество компонентов для вершины uint32 morph_component_count - количество компонентов для морфинга uint32 unknown - неизвестно; возможно, для выравнивания; всегда 0 uint32 group - группа uint32 texture_number - номер текстуры vec3 center[n] - центр модели vec3 min[n] - минимальная координата модели vec3 max[n] - максимальная координата модели float radius[n] - радиус модели vec3 vertices[4 * n * vertex_count] - вершины vec4 normals[4 * normal_count] - нормали vec2 texcoords[texcoord_count] - текстурные координаты uint16 indices[index_count] - индексы vertex_component vertex_components[vertex_component_count] - компоненты для вершины morph_component morph_components[morph_component_count] - компоненты для морфинга В зависимости от типа формата выбирается число n - назовём его количеством вариантов. Дело в том, что некоторые значения записаны в fig не "как есть", а блоками размером n. С учётом конкретной комплекции из одного блока рассчитывается одно значение (скаляр). Из 3-х блоков получается вектор. Фактически сие есть улучшенный вариант масштабирования. При обычном масштабировании нам доступно только "железное" изменение размеров объекта по 3-м измерениям. При варианте с комплекцией у нас развязываются руки и мы можем, например, открывать крышку сундука... Значение поля группа пока непонятно. Удалось выяснить, что по этому полю объекты объединяются в группы. Например, большинство деревьев принадлежат группе 18. Возможно, существует некий набор материалов или каких-либо предопределённых состояний и происходит их выбор по значению группы. Также есть предположение, что по значению группы производится какой-то вид сортировки, но это маловероятно. Номер тестуры означает первичная это текстура или вторичная. Речь идёт не о наложении текстур (мультитекстурировании), а о выборе текстуры из списка (составленного, например, из mob файла). Внимание! До конца не ясно, что ещё это означает, т.к. для некоторых объектов значения могут быть > 2 (например, 8). Вершины. Каждая вершина в fig содержит 4 блока для каждой компоненты x, y и z. Т.е. из неё можно извлечь 4 "нормальные" вершины по комплекции. Внимание! В рамках одной вершины блоки для каждого компонента расположены непрерывно, т.е. сначала 4 блока для x, потом 4 для y и т.д. Нормали. Каждая нормаль в fig содержит 4 компоненты x, y, z и w. Т.е. из неё можно получить 4 "нормальные" нормали напрямую. Внимание! Значения для каждого компонента расположены непрерывно, т.е. сначала 4 x, потом 4 y и т.д. Текстурные координаты. Ничего необычного - пара xy (uv). Только одно замечание: значения могут выходить за границы отрезка [0,1], что значит возможность повторения текстуры. Индексы. Индекс - это индекс :) компонента для вершины, см. ниже. Количество всегда кратно 3-м, что означает серию несвязанных треугольников. Компоненты для вершины. Тройка чисел, полностью определяющая одну вершину треугольника: индексы вершины, нормали и текстурной координаты. Компоненты для морфинга. Фактически это карта, отображающая вектор-смещение из anmfile на вершину из figfile. Эта карта нужна, т.к. смещений морфинга может быть меньше, чем вершин. См. пример. * Пример. Модель: unmoco2 (столб с кнопками главного меню). Часть: but01 (метка для кпонки "новая игра"). Местонахождение: menus.res -> unmoco2.mod -> but01. signature: 0x38474946 vertex_count: 2 normal_count: 2 texcoord_count: 4 index_count: 12 vertex_component_count: 8 morph_component_count: 8 unknown: 0 group: 18 texture_number: 2 center: -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 -0.000557 0.000537 -0.034701 min: -0.492459 -0.035761 -0.101966 -0.492459 -0.035761 -0.101966 -0.492459 -0.035761 -0.101966 -0.492459 -0.035761 -0.101966 ... max: 0.492459 0.035761 0.101966 0.492459 0.035761 0.101966 0.492459 0.035761 0.101966 0.492459 0.035761 0.101966 ... radius: 0.504175 0.504175 0.504175 0.504175 0.504175 0.504175 0.504175 0.504175 vertices: -0.493017 -0.035224 0.067265 ... normals 0.000000 -1.000000 0.000000 1.000000 ... texcoords: 0.017222 0.845068 0.681266 0.845068 0.681266 0.982561 0.017222 0.982562 indices: 0 1 2 2 3 0 4 5 6 6 7 4 vertex components: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 1 5 5 0 6 6 3 7 7 2 morph components: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 Модель: unmosu (гарпия). Часть: r_pereponka (перепонка). Местонахождение: figures.res -> unmosu.mod -> r_pereponka. morph components: ... 19 19 20 20 20 21 20 22 20 23 Пояснение. Количество вершин в перепонке - 24. Количество смещений морфинга - 21. Карта выше применяет последнее смещение ещё дополнительно к 3-м вершинам.