CGFX: Difference between revisions
Planetarian (talk | contribs) |
m Remove duplicate offset from DICT header |
||
(26 intermediate revisions by 7 users not shown) | |||
Line 19: | Line 19: | ||
|- | |- | ||
| 0x6 | | 0x6 | ||
| | | 0x2 | ||
| CGFX header size | | CGFX header size | ||
|- | |- | ||
| | | 0x8 | ||
| | | 0x4 | ||
| | | Revision | ||
|- | |- | ||
| 0xC | | 0xC | ||
Line 83: | Line 83: | ||
|- | |- | ||
| 3 | | 3 | ||
| | | Materials | ||
|- | |- | ||
| 4 | | 4 | ||
| | | Shaders | ||
|- | |- | ||
| 5 | | 5 | ||
Line 107: | Line 107: | ||
|- | |- | ||
| 11 | | 11 | ||
| | | Visibility animations | ||
|- | |- | ||
| 12 | | 12 | ||
| | | Camera animations | ||
|- | |- | ||
| 13 | | 13 | ||
| | | Light animations | ||
|- | |- | ||
| 14 | | 14 | ||
| | | Emitters | ||
|- | |- | ||
| 15 | | 15 | ||
Line 146: | Line 146: | ||
|- | |- | ||
| 0xC | | 0xC | ||
| 0x4 | |||
| ? | |||
|- | |||
| 0x10 | | 0x10 | ||
| 0x2 | |||
| Unknown. Seems to be shifted left by 4 bits in the source. | |||
|- | |||
| 0x12 | |||
| 0xA | |||
| ? | | ? | ||
|} | |} | ||
Line 175: | Line 183: | ||
| 0xC | | 0xC | ||
| 0x4 | | 0x4 | ||
| | | Offset (self-relative) to object | ||
|} | |} | ||
Line 292: | Line 300: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| | | 0x4 | ||
| Flags ? | | Flags (bit 4: model; bit 1: skeleton) | ||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Magic "SOBJ" | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| ? | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Unknown symbol offset (self-relative) | |||
|- | |||
| 0x10 | |||
| 0xC | |||
| ? | |||
|- | |||
| 0x1C | |||
| 0x4 | |||
| Offset (self-relative) to Unknown1 (appears to hold array of floats) ? | |||
|- | |||
| 0x20 | |||
| 0xC | |||
| Mesh position offset (X/Y/Z floats) | |||
|- | |||
| 0x2C | |||
| 0x4 | |||
| Face groups count | |||
|- | |||
| 0x30 | |||
| 0x4 | |||
| Offset (self-relative) to face groups offset array | |||
|- | |||
| 0x34 | |||
| 0x4 | |||
| ? | |||
|- | |||
| 0x38 | |||
| 0x4 | |||
| Vertex groups count | |||
|- | |||
| 0x3C | |||
| 0x4 | |||
| Offset (self-relative) to vertex groups offset array | |||
|- | |||
| 0x40 | |||
| 0x4 | |||
| Unknown offset (self-relative) ? | |||
|} | |||
Face groups: | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Bone groups count | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Offset (self-relative) to UInt32 bone group IDs array | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| ? | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Unknown2 count | |||
|- | |||
| 0x10 | |||
| 0x4 | |||
| Offset (self-relative) to Unknown2 offset array | |||
|} | |||
Unknown2: | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Face group descriptor count | |||
|- | |- | ||
| | | 0x4 | ||
| | | 0x4 | ||
| | | Offset (self-relative) to face array descriptors offset array | ||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Unknown3 count | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Offset (self-relative) to UInt32 Unknown3 array | |||
|- | |||
| 0x10 | |||
| 0x8 | |||
| ? | |||
|} | |||
Face array descriptor: | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Flags (bit 1: vertex index format: 0=byte, 1=short) | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| ? | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| Vertex index array size (in bytes) | |||
|- | |||
| 0xC | |||
| 0x4 | |||
| Offset (self-relative) to vertex index array | |||
|} | |||
Vertex groups come in a number of different formats. Typically the first vertex group entry is of format 0x40000002 and contains the actual vertex array. | |||
Vertex group format 0x40000002: | |||
{| class="wikitable" | |||
|- | |||
! Offset | |||
! Length | |||
! Description | |||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Flags (0x40000002) | |||
|- | |- | ||
| 0x4 | | 0x4 | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0x8 | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0xC | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0x10 | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0x14 | ||
| 0x4 | | 0x4 | ||
| | | Vertex array size (in bytes) | ||
|- | |- | ||
| | | 0x18 | ||
| | | 0x4 | ||
| | | Offset (self-relative) to vertex array | ||
|- | |- | ||
| | | 0x1C | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0x20 | ||
| 0x4 | | 0x4 | ||
| | | ? | ||
|- | |- | ||
| | | 0x24 | ||
| 0x4 | | 0x4 | ||
| Vertex | | Vertex stride/size in bytes (see below) | ||
|- | |- | ||
| | | 0x28 | ||
| 0x4 | | 0x4 | ||
| | | Unknown3 count | ||
|- | |- | ||
| | | 0x2C | ||
| | | 0x4 | ||
| | | Offset (self-relative) to component declaration offset array | ||
|} | |} | ||
Each mesh's primary vertex group contains an array of vertex component declaration objects, defining the order and parameters for each of a vertex's components. | |||
Vertex component declaration: | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! Offset | ||
! Length | |||
! Description | ! Description | ||
|- | |||
| 0x0 | |||
| 0x4 | |||
| Flags (0x40000001) | |||
|- | |||
| 0x4 | |||
| 0x4 | |||
| Vertex component type (see below) | |||
|- | |||
| 0x8 | |||
| 0x4 | |||
| ? | |||
|- | |- | ||
| 0xC | | 0xC | ||
| | | 0x4 | ||
| ? | |||
|- | |||
| 0x10 | |||
| 0x4 | |||
| ? | |||
|- | |- | ||
| 0x14 | | 0x14 | ||
| | | 0x4 | ||
| ? | |||
|- | |- | ||
| 0x18 | | 0x18 | ||
| | | 0x4 | ||
| ? | |||
|- | |||
| 0x1C | |||
| 0x4 | |||
| ? | |||
|- | |- | ||
| 0x20 | | 0x20 | ||
| | | 0x4 | ||
| ? | |||
|- | |||
| 0x24 | |||
| 0x1 | |||
| Component data type (see below) | |||
|- | |||
| 0x25 | |||
| 0x1 | |||
| ? | |||
|- | |||
| 0x26 | |||
| 0x1 | |||
| ? | |||
|- | |||
| 0x27 | |||
| 0x1 | |||
| ? | |||
|- | |||
| 0x28 | |||
| 0x4 | |||
| Number of values in this component (e.g. XYZ->3, UV->2) | |||
|- | |||
| 0x2C | |||
| 0x4 | |||
| Multiplier for this component's values (float) | |||
|- | |||
| 0x30 | |||
| 0x4 | |||
| Position of this component within vertex stride | |||
|} | |||
Vertex formats with bone data support multiple bone assignment. In this case, the sum of all bone weights is 0x64. | |||
Vertex component types: | |||
{| class="wikitable" | |||
|- | |||
! Value | |||
! Type | |||
|- | |||
| 0x00 | |||
| Position | |||
|- | |||
| 0x01 | |||
| Normal | |||
|- | |||
| 0x02 | |||
| ? (unobserved) | |||
|- | |||
| 0x03 | |||
| Color | |||
|- | |||
| 0x04 | |||
| UV0 | |||
|- | |||
| 0x05 | |||
| UV1 | |||
|- | |||
| 0x06 | |||
| ? (unobserved, possibly UV2) | |||
|- | |- | ||
| | | 0x07 | ||
| | | Weight | ||
|- | |- | ||
| | | 0x08 | ||
| | | Index | ||
|} | |} | ||
Vertex | Vertex component data types: | ||
{| class="wikitable" | |||
|- | |||
! Value | |||
! Type | |||
|- | |||
| 0x00 | |||
| sbyte | |||
|- | |||
| 0x01 | |||
| byte | |||
|- | |||
| 0x02 | |||
| short | |||
|- | |||
| 0x03 | |||
| ? (unobserved, possibly ushort) | |||
|- | |||
| 0x04 | |||
| ? (unobserved, possibly int) | |||
|- | |||
| 0x05 | |||
| ? (unobserved, possibly uint) | |||
|- | |||
| 0x06 | |||
| float | |||
|} | |||
Vertex components are stored as one of the above data types, and the vertex component declaration contains a multiplier that adapts the values to the float version which the game will use. | |||
For example, color RGBA values are stored as bytes, and the multiplier converts them from 0-255 to 0-1.0, and position components using short values are normalized via the multiplier to take advantage of the entire short value range. | |||
== TXOB == | == TXOB == | ||
Line 387: | Line 655: | ||
| 0x4 | | 0x4 | ||
| Magic "TXOB" | | Magic "TXOB" | ||
|- | |||
| 0x8 | |||
| 0x8 | |||
| ? | |||
|- | |- | ||
| 0xC | | 0xC | ||
Line 530: | Line 802: | ||
| 0x4 | | 0x4 | ||
| Offset (self relative) to name symbol | | Offset (self relative) to name symbol | ||
|- | |||
| 0x4 | |||
| 0x4 | |||
| ? | |||
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 555: | Line 831: | ||
| Transformation matrix (4x3) | | Transformation matrix (4x3) | ||
|- | |- | ||
| | | 0x74 | ||
| 0x30 | | 0x30 | ||
| Identity matrix ? (4x3) | | Identity matrix ? (4x3) | ||
Line 565: | Line 841: | ||
CANMs are used to store skeletal animation data. | CANMs are used to store skeletal animation data. | ||
== Tools == | |||
* Every File Explorer | |||
* Ohana3DS and its forks | |||
* SPICA | |||
== Links == | == Links == | ||
* Another CGFX Format Description: [http://florian.nouwt.com/wiki/index.php/CGFX_(File_Format) http://florian.nouwt.com/wiki/index.php/CGFX_(File_Format)] | * Another CGFX Format Description (Archived Page): [https://web.archive.org/web/20150511211029/http://florian.nouwt.com/wiki/index.php/CGFX_(File_Format) http://florian.nouwt.com/wiki/index.php/CGFX_(File_Format)] | ||
[[Category:File formats]] |