DigglesTool/docs/3db_format_specification.md
2025-08-06 16:09:32 +03:00

8.9 KiB
Raw Permalink Blame History

Спецификация формата файла .3db

Обзор

Формат файла .3db используется для хранения трехмерных моделей, включая геометрию, текстуры, анимации и другие данные. Этот документ описывает структуру и формат файла .3db на основе реализации декодера в проекте Digglestool.

Общая структура файла

Файл .3db имеет бинарный формат с порядком байтов little-endian. Файл состоит из нескольких последовательных секций:

  1. Заголовок файла
  2. Секция материалов
  3. Секция мешей
  4. Секция объектов
  5. Секция анимаций
  6. Секция теней
  7. Секция кубических карт
  8. Секция данных (треугольники, текстурные координаты, точки, яркость)

Типы данных

Базовые типы

  • uint8: 8-битное беззнаковое целое число
  • uint16: 16-битное беззнаковое целое число
  • uint32: 32-битное беззнаковое целое число
  • float32: 32-битное число с плавающей точкой

Строки

Строки хранятся в следующем формате:

  • uint32: длина строки в байтах
  • byte[]: массив байтов, представляющий строку

Векторы и координаты

  • Vector: массив из трех float32 значений [X, Y, Z]
  • Coordinate: массив из двух float32 значений [U, V]

Детальное описание секций

1. Заголовок файла

Заголовок файла содержит:

  • string: версия базы данных (DBVersion)
  • string: имя модели (Name)

2. Секция материалов

Секция материалов начинается с:

  • uint16: количество материалов

За этим следуют записи материалов, каждая из которых содержит:

  • string: имя материала
  • string: путь к текстуре материала
  • uint32: неизвестное значение

3. Секция мешей

Секция мешей начинается с:

  • uint32: количество мешей

За этим следуют записи мешей, каждая из которых содержит:

  • Секция связей меша:
    • uint16: количество связей
    • Для каждой связи:
      • uint16: индекс материала
      • uint16: неизвестное значение
      • uint16: индекс массива треугольников
      • uint16: индекс массива текстурных координат
      • uint16: индекс массива точек
      • uint16: индекс массива яркости
  • Vector: первый вектор (возможно, позиция или ориентация)
  • Vector: второй вектор (возможно, масштаб или ограничивающий бокс)
  • пропуск 0x80 байт: неиспользуемые данные
  • uint16: индекс тени
  • пропуск 0x30 байт: неиспользуемые данные
  • uint16: индекс кубической карты

4. Секция объектов

Секция объектов начинается с:

  • uint16: количество пар ключ-значение

За этим следуют пары ключ-значение, каждая из которых содержит:

  • string: ключ
  • uint16: количество объектов
  • uint32[]: массив индексов объектов

5. Секция анимаций

Секция анимаций начинается с:

  • uint16: количество анимаций

За этим следуют записи анимаций, каждая из которых содержит:

  • string: имя анимации
  • uint16: количество индексов мешей
  • uint32[]: массив индексов мешей
  • uint16: неизвестное значение 1
  • uint16: неизвестное значение 2
  • uint16: неизвестное значение 3
  • string: неизвестная строка
  • Vector: вектор перемещения
  • Vector: вектор вращения

6. Секция теней

Секция теней начинается с:

  • uint16: количество теней

За этим следуют данные теней, каждая из которых содержит:

  • пропуск 32*32 байт: данные изображения тени (предположительно 32x32 пикселя)

7. Секция кубических карт

Секция кубических карт начинается с:

  • uint16: количество кубических карт

За этим следуют записи кубических карт, каждая из которых содержит:

  • uint16: ширина
  • uint16: высота
  • uint16: неизвестное значение 1
  • uint16: неизвестное значение 2
  • пропуск width*height байт: данные пикселей

8. Секция данных

Секция данных содержит:

  • uint16: количество массивов треугольников
  • uint16: количество массивов текстурных координат
  • uint16: количество массивов точек
  • uint16: количество массивов яркости
  • uint32: неизвестное количество

Затем следуют размеры массивов:

  • uint16[]: размеры массивов треугольников
  • uint16[]: размеры массивов текстурных координат
  • uint16[]: размеры массивов точек
  • uint16[]: размеры массивов яркости

Затем следует пропуск неизвестных данных:

  • пропуск 20*unknownCount байт: неизвестные данные

Затем следуют данные массивов:

  • Массивы треугольников: для каждого массива:
    • uint16[]: индексы вершин треугольников
  • Массивы текстурных координат: для каждого массива:
    • Coordinate[]: текстурные координаты (U, V)
  • Массивы точек: для каждого массива:
    • Vector[]: точки (X, Y, Z), хранятся как нормализованные uint16 значения
  • Массивы яркости: для каждого массива:
    • uint8[]: значения яркости

Структуры данных

Material (Материал)

type Material struct {
    Name, Path string
    Unknown    uint32
}

Mesh (Меш)

type Mesh struct {
    Links   []MeshLink
    Vector1 *Vector
    Vector2 *Vector
    Shadow  uint16
    CMap    uint16
}
type MeshLink struct {
    Material           uint16
    Triangles          uint16
    TextureCoordinates uint16
    Points             uint16
    Brightness         uint16
    Unknown            uint16
}

Animation (Анимация)

type Animation struct {
    Name                        string
    MeshIndexes                 []uint32
    Unknown, Unknown1, Unknown2 uint16
    Unknown3                    string
    MoveVector                  *Vector
    RotationVector              *Vector
}

Vector (Вектор)

type Vector [3]float32

Coordinate (Координата)

type Coordinate [2]float32

Примечания по реализации

  1. Все строки хранятся с предшествующей длиной (uint32).
  2. Векторы точек хранятся как нормализованные значения в диапазоне [0, 1], которые затем преобразуются в координаты модели.
  3. Некоторые поля помечены как "неизвестные", так как их точное назначение не определено в текущей реализации.
  4. Файл использует порядок байтов little-endian для всех числовых значений.