Files
secretsplash/doc/splashbundle.md

6.2 KiB
Raw Blame History

SPLASHPACK Binary File Format Specification

All numeric values are stored in littleendian format. All offsets are counted from the beginning of the file.


1. File Header (16 bytes)

Offset Size Type Description
0x00 2 char 'SP' File magic
0x02 2 uint16 Version number (currently 1)
0x04 2 uint16 Number of Exporter descriptors
0x06 2 uint16 Number of Texture Atlas descriptors
0x08 2 uint16 Number of CLUT descriptors
0x0A 3*2 uint16 Reserved (always 0)

2. Metadata Section

The metadata section comprises three groups of descriptors.

2.1 GameObject Descriptors (56 bytes each)

Each gameobject descriptor stores the transform and mesh metadata for one GameObject.

Offset (per entry) Size Type Description
0x00 4 int Mesh Data Offset
0x04 4 int X coordinate (Fixed-point)
0x08 4 int Y coordinate (Fixed-point)
0x0C 4 int Z coordinate (Fixed-point)
0x10 36 int[9] 3×3 Rotation matrix (Fixed-point)
0x28 4 uint16 Triangle count in the mesh
0x2A 2 uint16 Reserved

2.2 Texture Atlas Descriptors (12 bytes each)

Each texture atlas descriptor holds atlas layout data and a placeholder for the atlas raw data offset.

Offset (per entry) Size Type Description
0x00 4 int Atlas Data Offset Placeholder
0x04 2 uint16 Atlas width
0x06 2 uint16 Atlas height (currently always 256, for future-proofing)
0x08 2 uint16 Atlas position X relative to VRAM origin
0x0A 2 uint16 Atlas position Y relative to VRAM origin

2.3 CLUT Descriptors (12 bytes each)

CLUTs are the only data which is stored in the Metadata section. For each CLUT (Color Lookup Table) associated with an atlas texture that has a palette:

Offset (per entry) Size Type Description
0x00 4 int Clut Data Offset Placeholder
0x04 2 uint16 CLUT packing X coordinate - already in 16 pixel steps
0x06 2 uint16 CLUT packing Y coordinate
0x08 2 uint16 Palette count (number of valid palette entries)
0x0A 2 uint16 Reserved (always 0)

3. Data Section

The data section contains the actual mesh and atlas raw data.

3.1 Mesh Data Blocks

For each exporter, a mesh data block is written at the offset specified in its descriptor. Each mesh block contains data for all triangles of the associated mesh.

Triangle Data Layout (per triangle 52 bytes total):

Field Size Description
Vertex Coordinates 3 vertices × 3 × 2 bytes = 18 bytes For each vertex (v0, v1, v2): X, Y, Z coordinates (int16)
Vertex Normal 3 × 2 bytes = 6 bytes Normal vector for vertex v0 (int16: nx, ny, nz)
Vertex Colors 3 vertices × (3 bytes color + 1 byte padding) = 12 bytes For each vertex (v0, v1, v2): Red, Green, Blue (uint8) plus 1 byte padding
Texture Coordinates (UVs) 3 vertices × 2 bytes = 6 bytes For each vertex (v0, v1, v2): U and V coordinates (uint8), adjusted by texture packing factors
UV Padding 2 bytes Padding (uint16, set to zero)
Texture Attributes 2 bytes The TPage attribute for the given polygon
Clut X 2 bytes Clut position within VRAM (already predivided by 16)
Clut Y 2 bytes Clut position within VRAM
Padding 2 bytes

3.2 Atlas Data Blocks

For each atlas, a raw texture data block is written at the offset specified in its descriptor

  • Raw Texture Data:
    The atlas data is written pixel by pixel as returned by the pixel packing function. The total size equals
    (Atlas Width × Atlas Height) The data is prepared for a DMA transfer to the VRAM.

3.3 Clut Data Blocks

For each clut, a raw pixel data block is written at the offset specified in its descriptor as an array of uint16 colors already formatted for the VRAM.