CGFX: Difference between revisions

m Remove duplicate offset from DICT header
 
(26 intermediate revisions by 7 users not shown)
Line 19: Line 19:
|-
|-
| 0x6
| 0x6
| 0x4
| 0x2
| CGFX header size
| CGFX header size
|-
|-
| 0xA
| 0x8
| 0x2
| 0x4
| ?
| Revision
|-
|-
| 0xC
| 0xC
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)
|-
| 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
|-
|-
| 0x3
| 0x4
| 0x1
| 0x4
| SOBJ type ? (0x10 = model, 0x02 = skeleton)
| 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
| 0xC
| X (float), Y (float), Z (float)
| 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)
|-
|-
| 0x28v1
| 0x07
| 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)
| Weight
|-
|-
| 0x28v2
| 0x08
| 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)
| Index
|}
|}


Vertex format 0x28 (and possibly others) supports multiple bone assignment. In this case, the sum of all bone weights is 0x64.
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)
|-
|-
| 0x70
| 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]]