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]]  | |||