Changes

3,042 bytes added ,  5 May
m
Remove duplicate offset from DICT header
Line 19: Line 19:  
|-
 
|-
 
| 0x6
 
| 0x6
| 0x4
+
| 0x2
 
| CGFX header size
 
| CGFX header size
 
|-
 
|-
| 0xA
+
| 0x8
| 0x2
+
| 0x4
| ?
+
| Revision
 
|-
 
|-
 
| 0xC
 
| 0xC
Line 65: Line 65:  
|}
 
|}
   −
The DATA header contains the entry counts and offsets for each DICT entry. There are always sixteen entries; any unused entries are zeroed.
+
The DATA header contains the entry counts and offsets for each DICT entry. The number of entries can vary (probably based on the version?), but are always in the following order. Any unused entries are zeroed.
    
Typical entries:
 
Typical entries:
Line 83: Line 83:  
|-
 
|-
 
| 3
 
| 3
| Unknown
+
| Materials
 
|-
 
|-
 
| 4
 
| 4
| Unknown
+
| Shaders
 
|-
 
|-
 
| 5
 
| 5
Line 107: Line 107:  
|-
 
|-
 
| 11
 
| 11
| Unknown animations
+
| Visibility animations
 
|-
 
|-
 
| 12
 
| 12
| Unknown
+
| Camera animations
 
|-
 
|-
 
| 13
 
| 13
| Unknown
+
| Light animations
 
|-
 
|-
 
| 14
 
| 14
| Unknown
+
| 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
| Value (often offsets)
+
| Offset (self-relative) to object
 
|}
 
|}
   Line 292: Line 300:  
|-
 
|-
 
| 0x0
 
| 0x0
| 0x3
+
| 0x4
| Flags ?
+
| Flags (bit 4: model; bit 1: skeleton)
 
|-
 
|-
| 0x3
+
| 0x4
| 0x1
+
| 0x4
| SOBJ type ? (0x10 = model, 0x02 = skeleton)
+
| 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
| Magic "SOBJ"
+
| ?
 
|-
 
|-
| 0x44
+
| 0x8
 
| 0x4
 
| 0x4
| Y = Offset (self-relative) to bone correspondance array
+
| ?
 
|-
 
|-
| 0x48
+
| 0xC
 
| 0x4
 
| 0x4
| X = Offset (relative to SOBJ magic) to SOBJ data structure (wrong ?)
+
| ?
 
|-
 
|-
| 0x44+Y+0x00
+
| 0x10
 
| 0x4
 
| 0x4
| N = Number of bone IDs in bone correspondance array
+
| ?
 
|-
 
|-
| 0x44+Y+0x14
+
| 0x14
| 0x4*N
+
| 0x4
| Bone correspondance array
+
| Vertex array size (in bytes)
 
|-
 
|-
| X+0x18
+
| 0x18
| 0x1
+
| 0x4
| Face data format (?) : 0x1 = u8, 0x3 = u16
+
| Offset (self-relative) to vertex array
 
|-
 
|-
| X+0x20
+
| 0x1C
 
| 0x4
 
| 0x4
| Face data section size (in bytes)
+
| ?
 
|-
 
|-
| X+0x24
+
| 0x20
 
| 0x4
 
| 0x4
| Face data section offset (self-relative)
+
| ?
 
|-
 
|-
| X+0x58
+
| 0x24
 
| 0x4
 
| 0x4
| Vertex data section size (in bytes)
+
| Vertex stride/size in bytes (see below)
 
|-
 
|-
| X+0x5C
+
| 0x28
 
| 0x4
 
| 0x4
| Vertex data section offset (self-relative)
+
| Unknown3 count
 
|-
 
|-
| X+0x68
+
| 0x2C
| 0x1
+
| 0x4
| Vertex data format size (in bytes)
+
| 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"
 
|-
 
|-
! Vertex format size
+
! Offset
 +
! Length
 
! Description
 
! Description
 +
|-
 +
| 0x0
 +
| 0x4
 +
| Flags (0x40000001)
 +
|-
 +
| 0x4
 +
| 0x4
 +
| Vertex component type (see below)
 +
|-
 +
| 0x8
 +
| 0x4
 +
| ?
 +
|-
 +
| 0xC
 +
| 0x4
 +
| ?
 +
|-
 +
| 0x10
 +
| 0x4
 +
| ?
 
|-
 
|-
 
| 0x14
 
| 0x14
| X (float), Y (float), Z (float), U (float), V (float)
+
| 0x4
 +
| ?
 
|-
 
|-
 
| 0x18
 
| 0x18
| X (float), Y (float), Z (float), Unk (u32?), U (float), V (float)
+
| 0x4
 +
| ?
 +
|-
 +
| 0x1C
 +
| 0x4
 +
| ?
 
|-
 
|-
 
| 0x20
 
| 0x20
| X (float), Y (float), Z (float), NX (float), NY (float), NZ (float), U (float), V (float)
+
| 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 component data types:
 +
 
 +
{| class="wikitable"
 +
|-
 +
! Value
 +
! Type
 +
|-
 +
| 0x00
 +
| sbyte
 +
|-
 +
| 0x01
 +
| byte
 +
|-
 +
| 0x02
 +
| short
 +
|-
 +
| 0x03
 +
| ? (unobserved, possibly ushort)
 +
|-
 +
| 0x04
 +
| ? (unobserved, possibly int)
 
|-
 
|-
| 0x28v1
+
| 0x05
| X (float), Y (float), Z (float), NX (float), NY (float), NZ (float), U (float), V (float), (local) Bone IDs (4*u8), Bone weights (4*u8)
+
| ? (unobserved, possibly uint)
 
|-
 
|-
| 0x28v2
+
| 0x06
| X (float), Y (float), Z (float), NX (float), NY (float), NZ (float), U (float), V (float), Unk1 (u32), (local) Bone IDs (2*u8), Bone weights (2*u8)
+
| float
 
|}
 
|}
   −
Vertex format 0x28 (and possibly others) supports multiple bone assignment. In this case, the sum of all bone weights is 0x64.
+
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 378: Line 649:  
|-
 
|-
 
| 0x0
 
| 0x0
 +
| 0x4
 +
| Flags
 +
|-
 +
| 0x4
 
| 0x4
 
| 0x4
 
| Magic "TXOB"
 
| Magic "TXOB"
 
|-
 
|-
| 0x14
+
| 0x8
 +
| 0x8
 +
| ?
 +
|-
 +
| 0xC
 +
| 0x4
 +
| Offset (self-relative) to symbol
 +
|-
 +
| 0x18
 
| 0x4
 
| 0x4
 
| Texture height
 
| Texture height
 
|-
 
|-
| 0x18
+
| 0x1C
 
| 0x4
 
| 0x4
 
| Texture width
 
| Texture width
 
|-
 
|-
| 0x30
+
| 0x28
| 0x1
+
| 0x4
 +
| Mipmap levels
 +
|-
 +
| 0x34
 +
| 0x4
 
| Texture format ID (see table below)
 
| Texture format ID (see table below)
 
|-
 
|-
| 0x38
+
| 0x3C
 
| 0x4
 
| 0x4
 
| Texture height (?)
 
| Texture height (?)
 
|-
 
|-
| 0x3C
+
| 0x40
 
| 0x4
 
| 0x4
 
| Texture width (?)
 
| Texture width (?)
 
|-
 
|-
| 0x40
+
| 0x44
 
| 0x4
 
| 0x4
 
| Texture data size
 
| Texture data size
 
|-
 
|-
| 0x44
+
| 0x48
 
| 0x4
 
| 0x4
 
| Texture data offset (self-relative)
 
| Texture data offset (self-relative)
Line 515: Line 802:  
| 0x4
 
| 0x4
 
| Offset (self relative) to name symbol
 
| Offset (self relative) to name symbol
 +
|-
 +
| 0x4
 +
| 0x4
 +
| ?
 
|-
 
|-
 
| 0x8
 
| 0x8
Line 540: Line 831:  
| Transformation matrix (4x3)
 
| Transformation matrix (4x3)
 
|-
 
|-
| 0x70
+
| 0x74
 
| 0x30
 
| 0x30
 
| Identity matrix ? (4x3)
 
| Identity matrix ? (4x3)
Line 550: 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]]