Difference between revisions of "MOD file"

From Pikmin Technical Knowledge Base
Jump to navigation Jump to search
(Created page with "The following is an unabridged copy of my current notes on the MOD file format. <pre> MOD files practice 0x20 alignment for sections ??? Section (0x00000000) { 0x08 Subhe...")
 
m
 
(4 intermediate revisions by 4 users not shown)
Line 1: Line 1:
The following is an unabridged copy of my current notes on the MOD file format.
+
{{todo|Cleanup.}}
 +
 
 +
The entire MOD file documentation is currently being hosted online on a public MEGA folder containing a lot of information on the Pikmin 1 file formats.MOD files are also known to contain not only the models but also the route and collsion for that map or if it is just a enemy and not a map it would just have the model and collsion
 +
 
 +
Here is the document details:
 +
<nowiki>MOD files practice 0x20 alignment for chunks and often sub-sections.
 +
 
 +
All Chunk Types
 +
['0x00', '0x10', '0x11', '0x18', '0x20', '0x22', '0x30', '0x40', '0x50', '0x60', '0x100', '0x110', '0xffff', '0x41', '0x13', '0x19', '0x1a', '0x61', '0x12']
 +
 
 +
Ambrosia speculates that...
 +
Chunk 0x0013 is vertex colors
 +
Chunk 0x0019 has shadows?
 +
Chunk 0x0040 0x0060 has rigging
 +
 
 +
I think that
 +
Chunk 0x0060 has rigging
  
<pre>
 
MOD files practice 0x20 alignment for sections
 
  
  
  
??? Section (0x00000000) {
 
0x08 Subheader {
 
0x04 int # Section identifier (0x00000000)
 
0x04 int # Size of Container
 
}
 
Container {
 
???
 
)
 
)
 
  
Visual Geometry (0x00000010) {
 
0x08 Subheader {
 
0x04 int # Section identifier (0x00000010)
 
0x04 int # Size of Container
 
}
 
Container {
 
0x04 int # Number of Geometry Vertex structs (var %10)
 
0x14 unk # Padding?
 
0x0C struct # Geometry Vertex {
 
0x04 float # X position
 
0x04 float # Y position
 
0x04 float # Z position
 
} [•] Repeated %10 times.
 
}
 
}
 
  
??? section (0x00000013) {
 
  
 +
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
 +
----------------------------------------------------------------------------------------------------
 +
Header Chunk (0x0000) {
 +
0x08 Subheader {
 +
0x04 uint    # Opcode (0x00000000)
 +
0x04 uint    # Size of Container (Always 0x38)
 +
}
 +
Container {
 +
0x18 ???      # Padding?
 +
0x02 uint    # Year
 +
0x01 uint    # Month
 +
0x01 uint    # Day
 +
0x04 bitfield {
 +
00000000 00000000 00000000 00000001    # Scaling System ( 0=CLASSIC | 1=SOFTIMAGE )
 +
00000000 00000000 00000000 00000010
 +
00000000 00000000 00000000 00000100
 +
00000000 00000000 00000000 00001000    # ( 1=Using Vertex NBT )
 +
00000000 00000000 00000100 00000000
 +
}
 +
0x18 padding
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Vertexes (0x0010) {
 +
0x08 Subheader {
 +
0x04 uint    # Opcode (0x00000010)
 +
0x04 uint    # Size of Container
 +
}
 +
Container {
 +
0x04 uint    # Number of Packets (var %10)
 +
0x14 ???      # Padding?
 +
0x0C packet {    # Vertex Position
 +
0x04 float    # X position
 +
0x04 float    # Y position
 +
0x04 float    # Z position
 +
} [•] Repeated %10 times
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Vertex Colors (0x0013) {    # "COLOR0"
 +
0x08 Subheader {
 +
0x04 int    # Opcode (0x00000013)
 +
0x04 int    # Size of Container
 +
}
 +
Container {
 +
0x04 int    # Number of Packets (var %13)
 +
0x14 ???    # Padding?
 +
0x04 packet {    # Mesh Color Definition
 +
0x01 int    # Red
 +
0x01 int    # Green
 +
0x01 int    # Blue
 +
0x01 int    # Alpha (More like threshold?)
 +
} [•] Repeated %13 times
 
}
 
}
  
??? section (0x00000011) {
+
}
0x08 Subheader {
+
----------------------------------------------------------------------------------------------------
0x04 int # Section identifier (0x00000011)
+
Vertex Normals (0x0011) {
0x04 int # Size of Container
+
0x08 Subheader {
}
+
0x04 int     # Opcode (0x00000011)
Container {
+
0x04 int     # Size of Container
0x04 int # Number of ??? structs (var %11)
+
}
0x14 unk # Padding?
+
Container {
0x0C struct # ??? {
+
0x04 int     # Number of Packets (var %11)
0x04 float #  
+
0x14 ???    # Padding?
0x04 float #  
+
0x0C packet {    # Vertex Normal
0x04 float #  
+
0x04 float    # X vector
} [•] Repeated %11 times.
+
0x04 float    # Y vector
}
+
0x04 float    # Z vector
 +
} [•] Repeated %11 times
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Vertex NBT (0x0012) {
 +
0x08 Subheader {
 +
0x04 int    # Opcode (0x00000012)
 +
0x04 int    # Size of Container
 +
}
 +
Container {
 +
0x04 int    # Number of Packets (var %12)
 +
0x14 ???     # Padding?
 +
0x24 packet {     # 3 sets of vector3fs
 +
0x04 float    # Normal
 +
0x04 float    # ...
 +
0x04 float    # ...
 +
0x04 float    # Binormal
 +
0x04 float    # ...
 +
0x04 float    # ...
 +
0x04 float     # Tangent
 +
0x04 float     # ...
 +
0x04 float     # ...
 +
} [•] Repeated %12 times
 +
}
 
}
 
}
  
??? section (0x00000018) {
+
----------------------------------------------------------------------------------------------------
0x08 Subheader {
+
UV Mapping (0x0018) to (0x001F) {
0x04 int # Section identifier (0x00000018)
+
0x08 Subheader {
0x04 int # Size of Container
+
0x04 int     # Opcode (0x00000018)
}
+
0x04 int     # Size of Container
Container {
+
}
0x04 int # Number of ??? structs (var %18)
+
Container {
0x14 unk # Padding?
+
0x04 int     # Number of Packets? (var %18)
0x20 struct # ??? {
+
0x14 ???    # Padding?
0x04 float #
+
0x08 packet {    # Guessed from size of packet and count (vector2f?)
0x04 float #
+
0x04 float
0x04 float #  
+
0x04 float
0x04 float #  
+
} [•] Repeated %18 times
0x04 float #
+
}
0x04 float #
+
}
0x04 float #  
+
----------------------------------------------------------------------------------------------------
0x04 float #  
+
Textures (0x0020) {
} [•] Repeated %18 times.
+
0x08 Subheader {
}
+
0x04 int # Opcode (0x00000020)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of TXE Files (var %20)
 +
0x14 ??? # Padding?
 +
TXE file [•] Repeated %20 times
 +
}
 
}
 
}
 +
----------------------------------------------------------------------------------------------------
 +
Texture Attributes (0x0022) {
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000022)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 packet # Number of Packets? (var %22)
 +
0x14 ??? # Padding?
 +
0x0C struct { # Single Attribute
 +
0x02 int # Texture Index
 +
0x02 ??? # Probably for pallette
 +
0x01 uint # Wrap_S (0 = repeat, 1 = clamp, ...more?)
 +
0x01 uint # Wrap_T (0 = repeat, 1 = clamp, ...more?)
 +
0x02 uint # ? (1 if max LOD is present?)
 +
0x04 float # Max LOD (distance before mipmap is forced)
 +
} [•] Repeated %22 times??
 +
}
 +
)
 +
----------------------------------------------------------------------------------------------------
 +
Material Data (0x0030) { #Note: This chunk has several complexities not well documented currently
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000030)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of Packets (var %30)
 +
0x04 int
 +
0x10 ??? # Padding?
 +
0x0c packet { # Mesh Color Definition
 +
0x01 ???
 +
0x01 ??? # ??? (makes invisible)
 +
0x01 int # Texture Alpha Flag (Appendix #30a)
 +
0x01 int # Texture Application(?) Flag (Appendix #30b)
 +
0x04 ???
 +
0x04 struct { # RGB mesh color
 +
0x01 int # Red
 +
0x01 int # Green
 +
0x01 int # Blue
 +
0x01 int # Alpha?
 +
}
 +
} [•] Repeated %30 times
 +
}
 +
)
  
Textures (0x00000020) {
+
Saturation and sharpness??
0x08 Subheader {
+
Chunk is inaccurate
0x04 int # Section identifier (0x00000020)
+
----------------------------------------------------------------------------------------------------
0x04 int # Size of Container
+
Matrix Envelope (0x0041) {
}
+
0x08 Subheader {
Container {
+
0x04 int # Opcode (0x00000041)
0x04 int # Number of texture files (var %20)
+
0x04 int # Size of Container
0x14 unk # Padding?
+
}
TXE file {
+
Container {
} [•] Repeated %20 times.
+
0x04 int # Number of Packets? (var %41a)
}
+
0x14 ??? # Padding?
 +
0x?? packet { # Envelope Matrix
 +
0x02 int # Matrix Count (var %41b)
 +
0x?? packet { # Matrix
 +
0x02 int # ID
 +
0x04 float # Weight
 +
} [•] Repeated %41b times
 +
} [•] Repeated %41a times
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Matrix (0x0040) {
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000040)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of Packets? (var %40)
 +
0x14 ??? # Padding?
 +
0x20 packet { # ???
 +
0x04 int?
 +
0x1C ???
 +
} [•] Repeated %40 times??
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Meshes (0x0050) {
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000050)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of Meshes (var %50a)
 +
0x14 # Padding
 +
0x04 int # flags
 +
0x04 int # unk
 +
0x04 int # Number of Matrix Groups (var %50b)
 +
?? Matrix Group {
 +
0x04 int
 +
0x02 int # This doesn't appear to always be here
 +
0x04 int # Number of Display Lists (var %50c)
 +
0x?? Display List {
 +
0x04 int
 +
0x04 int
 +
0x04 int
 +
} [•] Repeated %50b times
 +
} [•] Repeated %50a times
 +
0x?? # Padding to next multiple of 0x20
 +
Mesh Data {
 +
???
 
}
 
}
 +
}
 +
}
 +
GX_POINTS        = 0xb8,
 +
GX_LINES        = 0xa8,
 +
GX_LINESTRIP    = 0xb0,
 +
GX_TRIANGLES    = 0x90,
 +
GX_TRIANGLESTRIP = 0x98,
 +
GX_TRIANGLEFAN  = 0xa0,
 +
GX_QUADS        = 0x80
 +
 +
 +
 +
0x0030
 +
 +
if > 0x0030
 +
0x0060
 +
0x0041
 +
0x0040
 +
0x0050
 +
0x0100
 +
0x0062
 +
0x0110
 +
 +
else
 +
0x0013
 +
0x0010
 +
0x0000
 +
0x0012
 +
0x0021
 +
0x0020
 +
0x0018
 +
to
 +
0x001F
 +
0x0023
  
??? section (0x00000022) {
 
0x08 Subheader {
 
0x04 int # Section identifier (0x00000022)
 
0x04 int # Size of Container
 
}
 
Container {
 
0x04 int # Number of ??? structs (var %22)
 
0x14 unk # Padding?
 
0x20 struct # ??? {
 
0x04 unk
 
0x04 data
 
0x18 unk
 
} [•] Repeated %22 times??
 
}
 
)
 
  
??? section (0x00000030) {
 
0x08 Subheader {
 
0x04 int # Section identifier (0x00000030)
 
0x04 int # Size of Container
 
}
 
Container {
 
0x04 int # Number of ??? structs (var %30)
 
0x14 unk # Padding?
 
0x20 struct # ??? {
 
0x04 int
 
0x04 unk
 
0x04 int?
 
0x14 unk
 
} [•] Repeated %30 times??
 
}
 
)
 
  
??? section (0x00000040) {
+
04 chunk opcode
0x08 Subheader {
+
04 chunk size
0x04 int # Section identifier (0x00000040)
+
04 packet count
0x04 int # Size of Container
+
14 padding
}
+
04 unk
Container {
+
04 unk
0x04 int # Number of ??? structs (var %40)
+
04 unk_val
0x14 unk # Padding?
+
if (unk_val != 0) {
0x20 struct # ??? {
+
allocate ( unk_val << 4 ) + 8 )
0x04 int?
+
construct_new_array of mtxGroups ( [__ct__8MtxGroupFv] is passed on r3 )
0x1C unk
+
array of mtxGroups[]
} [] Repeated %40 times??
 
}
 
 
}
 
}
  
??? section (0x00000050)
+
mtxGroup
0x08 Subheader {
+
04 unk_val
0x04 int # Section identifier (0x00000050)
+
if (unk_val != 0) {
0x04 int # Size of Container
+
allocate ( unk_val << 2 )
}
+
array of ???[]
Container {
+
02 unk
???
+
if that last thing is not 0, something happens
}
+
04 disp_list_count
 +
if that last thing is 0, abort
 +
 +
----------------------------------------------------------------------------------------------------
 +
Joints (0x0060) {
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000060)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of Packets? (var %60)
 +
0x14 ??? # Padding?
 +
0x4C? packet { # ?something?
 +
0x04 sint    # Parent index (-1 is null)
 +
0x04 uint    # flags
 +
0x18 struct {    # Volume
 +
0x04 float    # Min X
 +
0x04 float    # Min Y
 +
0x04 float    # Min Z
 +
0x04 float    # Max X
 +
0x04 float    # Max Y
 +
0x04 float    # Max Z
 +
}
 +
0x0C struct {    # Scale
 +
0x04 float    # X
 +
0x04 float    # Y
 +
0x04 float    # Z
 +
}
 +
0x0C struct {    # Rotation
 +
0x04 float    # X
 +
0x04 float    # Y
 +
0x04 float    # Z
 +
}
 +
0x0C struct {    # Translation
 +
0x04 float    # X
 +
0x04 float    # Y
 +
0x04 float    # Z
 +
}
 +
} [•] Repeated %60 times.
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Joint Names (0x0061) {
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000061)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x04 int # Number of Packets? (var %61a)
 +
0x14 ??? # Padding?
 +
0x?? packet {
 +
0x04 int # Length of string (var %61b)
 +
%61b string # "node name"
 +
} [•] Repeated %61a times?
 +
}
 
}
 
}
  
Floor Collision Geometry (0x00000060) {
+
----------------------------------------------------------------------------------------------------
0x08 Subheader {
+
Something with texname palettes chunk (0x0080) { # Unconfirmed in any MOD files
0x04 int # Section identifier (0x00000060)
 
0x04 int # Size of Container
 
}
 
Container {
 
0x04 int # Number of ?something? structs (var %60)
 
0x14 unk # Padding?
 
0x4C? struct # ?something? {
 
 
 
 
} [•] Repeated %60 times.
 
}
 
 
}
 
}
  
??? section (0x00000100) {
+
----------------------------------------------------------------------------------------------------
0x08 Subheader {
+
Collision Mesh (0x0100) {
0x04 int # Section identifier (0x00000100)
+
0x08 Subheader {
0x04 int # Size of Container
+
0x04 int # Opcode (0x00000100)
}
+
0x04 int # Size of Container
Container {
 
???
 
}
 
 
}
 
}
 +
Container {
 +
0x04 int # Number of Packets (var %100a)
 +
0x04 int # ??? (seen being 1 instead of 0)
 +
0x10 ??? # Padding?
 +
0x20 ???
 +
0x28 packet {
 +
0x04 bitfield { # MapCode
 +
00011000 00000000 00000000 00000000 # SlipCode (Appendix #100)
 +
11100000 00000000 00000000 00000000 # Attribute (Appendix #100)
 +
00000100 00000000 00000000 00000000 # isBald
 +
}
 +
0x04 int # Vertex C index (from 0x0010 chunk)
 +
0x04 int # Vertex B index (from 0x0010 chunk)
 +
0x04 int # Vertex A index (from 0x0010 chunk)
 +
0x02 ??? # Padding?
 +
0x02 int # Edge 3 neighbor (FFFF means no neighbor)
 +
0x02 int # Edge 2 neighbor (FFFF means no neighbor)
 +
0x02 int # Edge 1 neighbor (FFFF means no neighbor)
 +
0x04 float # Face Normal X
 +
0x04 float # Face Normal Y
 +
0x04 float # Face Normal Z
 +
0x04 float # Magnitude (Appendix #100)
 +
} [•] Repeated %100a times?
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
Collision Groups (0x0110) { Thank you Ambrosia for your help
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x00000110)
 +
0x04 int # Size of Container
 +
}
 +
Container {
 +
0x18 struct { # MapMgr bounding box
 +
0x04 float # min X
 +
0x04 float # min Y
 +
0x04 float # min Z
 +
0x04 float # max X
 +
0x04 float # max Y
 +
0x04 float # max Y
 +
}
 +
0x04 float # Collision Grid Scale (Always 64.0)
 +
0x04 int # Collision Grid width (X) [ ceil( ( |minX| + |maxX| ) / 64.0 ) ]
 +
0x04 int # Collision Grid depth (Z) [ ceil( ( |minX| + |maxX| ) / 64.0 ) ]
 +
Coll tris? {
 +
0x?? ints
 +
}
 +
}
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
EOF Chunk (0xFFFF) { # End of MOD.  Beginning of INI
 +
0x08 Subheader {
 +
0x04 int # Opcode (0x0000FFFF)
 +
0x04 int # Size of Container
 +
}
 +
0x18 Padding
 +
}
 +
----------------------------------------------------------------------------------------------------
 +
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
 +
APPENDIX
 +
#30a Each bit of the byte toggles a texture alpha mode.
 +
If multiple bytes are toggled, the Least Significant Bit is considered.
 +
Inverted Semi-Transparent is an exception to this rule.
 +
For it to be active, at least one of the other states must be active at the same time.
 +
It itself does not get modified by other states.
 +
State
 +
Binary Flags
 +
Preview
 +
Invalid State
 +
00000000
  
MapMgr bounds + Coll tris? (0x00000110) {
+
Disabled
0x08 Subheader {
+
00000001
0x04 int # Section identifier (0x00000110)
+
 
0x04 int # Size of Container
+
Mode 1
}
+
00000010
Container {
+
 
mapMgr bounds {
+
Mode 2
0x04 float # X1
+
00000100
0x04 float # Y1
+
 
0x04 float # Z1
+
Inverted Semi-Transparent
0x04 float # X2
+
10000XXX
0x04 float # Y2
+
 
0x04 float # Z2
+
 
}
+
#30b This feature has just been documented, so not much is known about it yet.
0x04 float
+
State
Coll tris? {
+
Binary Flags
0x?? ints
+
Preview
}
+
Invalid State
}
+
00000000
}
+
 
</pre>
+
Texture applied
 +
00000001
 +
 
 +
 
 +
#100 Slipcodes
 +
State
 +
Binary Flags
 +
No slip
 +
00
 +
Slip (weak)
 +
01
 +
Slip (stong)
 +
10
 +
Slip (weak)
 +
11
 +
 
 +
Attributes
 +
State
 +
Translation
 +
Binary Flags
 +
??
 +
soil
 +
000
 +
??
 +
stone
 +
001
 +
??
 +
grass
 +
010
 +
?
 +
wood
 +
011
 +
????
 +
mud
 +
100
 +
??
 +
water
 +
101
 +
??
 +
hole
 +
110
 +
????????
 +
nothing
 +
111
 +
Note: "hole" and "nothing" are sound identical to "soil".  Also, "mud" sounds like sand.  The "water" attribute is what causes Pikmin to drown.
  
 +
Calculating the Magnitude
 +
1) Solve for the center of the tri (average the three XYZ positions)
 +
2) If necessary, recalculate the face's normal with a cross factor
 +
3) magnitude = (avg_x * norm_x) + (avg_y * norm_y) + (avg_z * norm_z)</nowiki>
  
 +
Visit the document here:
 +
https://mega.nz/#F!Ek1RmI5R!8xYfk-REVLvFuMjJsOplUg
  
 
{{Credits|[[User:Minty_Meeo|Minty_Meeo]]}}
 
{{Credits|[[User:Minty_Meeo|Minty_Meeo]]}}

Latest revision as of 05:24, 8 March 2024

To do: Cleanup.

The entire MOD file documentation is currently being hosted online on a public MEGA folder containing a lot of information on the Pikmin 1 file formats.MOD files are also known to contain not only the models but also the route and collsion for that map or if it is just a enemy and not a map it would just have the model and collsion

Here is the document details:

MOD files practice 0x20 alignment for chunks and often sub-sections.

All Chunk Types
['0x00', '0x10', '0x11', '0x18', '0x20', '0x22', '0x30', '0x40', '0x50', '0x60', '0x100', '0x110', '0xffff', '0x41', '0x13', '0x19', '0x1a', '0x61', '0x12']

Ambrosia speculates that...
Chunk 0x0013 is vertex colors
Chunk 0x0019 has shadows?
Chunk 0x0040 0x0060 has rigging

I think that
Chunk 0x0060 has rigging







¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
----------------------------------------------------------------------------------------------------
Header Chunk (0x0000) {
0x08 Subheader {
0x04 uint     # Opcode (0x00000000)
0x04 uint     # Size of Container (Always 0x38)
}
Container {
0x18 ???      # Padding?
0x02 uint     # Year
0x01 uint     # Month
0x01 uint     # Day
0x04 bitfield {
00000000 00000000 00000000 00000001     # Scaling System ( 0=CLASSIC | 1=SOFTIMAGE )
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000100
00000000 00000000 00000000 00001000     # ( 1=Using Vertex NBT )
00000000 00000000 00000100 00000000
}
0x18 padding
}
}
----------------------------------------------------------------------------------------------------
Vertexes (0x0010) {
0x08 Subheader {
0x04 uint     # Opcode (0x00000010)
0x04 uint     # Size of Container
}
Container {
0x04 uint     # Number of Packets (var %10)
0x14 ???      # Padding?
0x0C packet {     # Vertex Position
0x04 float     # X position
0x04 float     # Y position
0x04 float     # Z position
} [•] Repeated %10 times
}
}
----------------------------------------------------------------------------------------------------
Vertex Colors (0x0013) {     # "COLOR0"
0x08 Subheader {
0x04 int     # Opcode (0x00000013)
0x04 int     # Size of Container
}
Container {
0x04 int     # Number of Packets (var %13)
0x14 ???     # Padding?
0x04 packet {     # Mesh Color Definition
0x01 int     # Red
0x01 int     # Green
0x01 int     # Blue
0x01 int     # Alpha (More like threshold?)
} [•] Repeated %13 times
}

}
----------------------------------------------------------------------------------------------------
Vertex Normals (0x0011) {
0x08 Subheader {
0x04 int     # Opcode (0x00000011)
0x04 int     # Size of Container
}
Container {
0x04 int     # Number of Packets (var %11)
0x14 ???     # Padding?
0x0C packet {     # Vertex Normal
0x04 float     # X vector
0x04 float     # Y vector
0x04 float     # Z vector
} [•] Repeated %11 times
}
}
----------------------------------------------------------------------------------------------------
Vertex NBT (0x0012) {
0x08 Subheader {
0x04 int     # Opcode (0x00000012)
0x04 int     # Size of Container
}
Container {
0x04 int     # Number of Packets (var %12)
0x14 ???     # Padding?
0x24 packet {     # 3 sets of vector3fs
0x04 float     # Normal
0x04 float     # ...
0x04 float     # ...
0x04 float     # Binormal
0x04 float     # ...
0x04 float     # ...
0x04 float     # Tangent
0x04 float     # ...
0x04 float     # ...
} [•] Repeated %12 times
}
}

----------------------------------------------------------------------------------------------------
UV Mapping (0x0018) to (0x001F) {
0x08 Subheader {
0x04 int     # Opcode (0x00000018)
0x04 int     # Size of Container
}
Container {
0x04 int     # Number of Packets? (var %18)
0x14 ???     # Padding?
0x08 packet {     # Guessed from size of packet and count (vector2f?)
0x04 float	
0x04 float	
} [•] Repeated %18 times
}
}
----------------------------------------------------------------------------------------------------
Textures (0x0020) {
0x08 Subheader {
0x04 int	# Opcode (0x00000020)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of TXE Files (var %20)
0x14 ???	# Padding?
TXE file [•] Repeated %20 times
}
}
----------------------------------------------------------------------------------------------------
Texture Attributes (0x0022) {
0x08 Subheader {
0x04 int	# Opcode (0x00000022)
0x04 int	# Size of Container
}
Container {
0x04 packet	# Number of Packets? (var %22)
0x14 ???	# Padding?
0x0C struct {	# Single Attribute
0x02 int	# Texture Index
0x02 ???	# Probably for pallette
0x01 uint	# Wrap_S (0 = repeat, 1 = clamp, ...more?)
0x01 uint	# Wrap_T (0 = repeat, 1 = clamp, ...more?)
0x02 uint	# ? (1 if max LOD is present?)
0x04 float	# Max LOD (distance before mipmap is forced)
} [•] Repeated %22 times??
}
)
----------------------------------------------------------------------------------------------------
Material Data (0x0030) {	#Note: This chunk has several complexities not well documented currently
0x08 Subheader {
0x04 int	# Opcode (0x00000030)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets (var %30)
0x04 int	
0x10 ???	# Padding?
0x0c packet {	# Mesh Color Definition
0x01 ???
0x01 ???	# ??? (makes invisible)
0x01 int	# Texture Alpha Flag (Appendix #30a)
0x01 int	# Texture Application(?) Flag (Appendix #30b)
0x04 ???
0x04 struct {	# RGB mesh color
0x01 int	# Red
0x01 int	# Green
0x01 int	# Blue
0x01 int	# Alpha?
}
} [•] Repeated %30 times
}
)

Saturation and sharpness??
Chunk is inaccurate
----------------------------------------------------------------------------------------------------
Matrix Envelope (0x0041) {
0x08 Subheader {
0x04 int	# Opcode (0x00000041)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets? (var %41a)
0x14 ???	# Padding?
0x?? packet {	# Envelope Matrix
0x02 int		# Matrix Count (var %41b)
0x?? packet {	# Matrix
0x02 int		# ID
0x04 float		# Weight
} [•] Repeated %41b times
} [•] Repeated %41a times
}
}
----------------------------------------------------------------------------------------------------
Matrix (0x0040) {
0x08 Subheader {
0x04 int	# Opcode (0x00000040)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets? (var %40)
0x14 ???	# Padding?
0x20 packet {	# ???
0x04 int?
0x1C ???
} [•] Repeated %40 times??
}
}
----------------------------------------------------------------------------------------------------
Meshes (0x0050) {
0x08 Subheader {
0x04 int	# Opcode (0x00000050)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Meshes (var %50a)
0x14 	# Padding
0x04 int	# flags
0x04 int	# unk
0x04 int	# Number of Matrix Groups (var %50b)
?? Matrix Group {
0x04 int
0x02 int	# This doesn't appear to always be here
0x04 int	# Number of Display Lists (var %50c)
0x?? Display List {
0x04 int
0x04 int
0x04 int
} [•] Repeated %50b times
} [•] Repeated %50a times
0x?? 		# Padding to next multiple of 0x20
Mesh Data {
???
}
}
}
GX_POINTS        = 0xb8,
GX_LINES         = 0xa8,
GX_LINESTRIP     = 0xb0,
GX_TRIANGLES     = 0x90,
GX_TRIANGLESTRIP = 0x98,
GX_TRIANGLEFAN   = 0xa0,
GX_QUADS         = 0x80



0x0030

if > 0x0030
0x0060
0x0041
0x0040
0x0050
0x0100
0x0062
0x0110

else
0x0013
0x0010
0x0000
0x0012
0x0021
0x0020
0x0018
to
0x001F
0x0023



04	chunk opcode
04	chunk size
04	packet count
14	padding
04	unk
04	unk
04	unk_val
if (unk_val != 0) {
	allocate ( unk_val << 4 ) + 8 )
	construct_new_array of mtxGroups ( [__ct__8MtxGroupFv] is passed on r3 )
	array of mtxGroups[]
}

mtxGroup
04	unk_val
if (unk_val != 0) {
	allocate ( unk_val << 2 )
	array of ???[]
		02	unk
		if that last thing is not 0, something happens
		04	disp_list_count
		if that last thing is 0, abort
		
----------------------------------------------------------------------------------------------------
Joints (0x0060) {
0x08 Subheader {
0x04 int	# Opcode (0x00000060)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets? (var %60)
0x14 ???	# Padding?
0x4C? packet {	# ?something?
0x04 sint     # Parent index (-1 is null)
0x04 uint     # flags
0x18 struct {     # Volume
0x04 float     # Min X
0x04 float     # Min Y
0x04 float     # Min Z
0x04 float     # Max X
0x04 float     # Max Y
0x04 float     # Max Z
}
0x0C struct {     # Scale
0x04 float     # X
0x04 float     # Y
0x04 float     # Z
}
0x0C struct {     # Rotation
0x04 float     # X
0x04 float     # Y
0x04 float     # Z
}
0x0C struct {     # Translation
0x04 float     # X
0x04 float     # Y
0x04 float     # Z
}
} [•] Repeated %60 times.
}
}
----------------------------------------------------------------------------------------------------
Joint Names (0x0061) {
0x08 Subheader {
0x04 int	# Opcode (0x00000061)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets? (var %61a)
0x14 ???	# Padding?
0x?? packet	{
0x04 int	# Length of string (var %61b)
%61b string	# "node name"
} [•] Repeated %61a times?
}
}

----------------------------------------------------------------------------------------------------
Something with texname palettes chunk (0x0080) {	# Unconfirmed in any MOD files
}

----------------------------------------------------------------------------------------------------
Collision Mesh (0x0100) {
0x08 Subheader {
0x04 int	# Opcode (0x00000100)
0x04 int	# Size of Container
}
Container {
0x04 int	# Number of Packets (var %100a)
0x04 int	# ??? (seen being 1 instead of 0)
0x10 ???	# Padding?
0x20 ???
0x28 packet	{
0x04 bitfield {	# MapCode
00011000 00000000 00000000 00000000	# SlipCode (Appendix #100)
11100000 00000000 00000000 00000000	# Attribute (Appendix #100)
00000100 00000000 00000000 00000000	# isBald
}
0x04 int	# Vertex C index (from 0x0010 chunk)
0x04 int	# Vertex B index (from 0x0010 chunk)
0x04 int	# Vertex A index (from 0x0010 chunk)
0x02 ???	# Padding?
0x02 int	# Edge 3 neighbor (FFFF means no neighbor)
0x02 int	# Edge 2 neighbor (FFFF means no neighbor)
0x02 int	# Edge 1 neighbor (FFFF means no neighbor)
0x04 float	# Face Normal X
0x04 float	# Face Normal Y
0x04 float	# Face Normal Z
0x04 float	# Magnitude (Appendix #100)
} [•] Repeated %100a times?
}
}
----------------------------------------------------------------------------------------------------
Collision Groups (0x0110) {	Thank you Ambrosia for your help
0x08 Subheader {
0x04 int	# Opcode (0x00000110)
0x04 int	# Size of Container
}
Container {
0x18 struct {	# MapMgr bounding box
0x04 float	# min X
0x04 float	# min Y
0x04 float	# min Z
0x04 float	# max X
0x04 float	# max Y
0x04 float	# max Y
}
0x04 float	# Collision Grid Scale (Always 64.0)
0x04 int	# Collision Grid width (X)	[ ceil( ( |minX| + |maxX| ) / 64.0 ) ]
0x04 int	# Collision Grid depth (Z)	[ ceil( ( |minX| + |maxX| ) / 64.0 ) ]
Coll tris? {
0x?? ints
}
}
}
----------------------------------------------------------------------------------------------------
EOF Chunk (0xFFFF) {	# End of MOD.  Beginning of INI
0x08 Subheader {
0x04 int	# Opcode (0x0000FFFF)
0x04 int	# Size of Container
}
0x18 Padding
}
----------------------------------------------------------------------------------------------------
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
APPENDIX
#30a	Each bit of the byte toggles a texture alpha mode.
If multiple bytes are toggled, the Least Significant Bit is considered.
	Inverted Semi-Transparent is an exception to this rule.
	For it to be active, at least one of the other states must be active at the same time.
	It itself does not get modified by other states.
State
Binary Flags
Preview
Invalid State
00000000

Disabled
00000001

Mode 1
00000010

Mode 2
00000100

Inverted Semi-Transparent
10000XXX


#30b	This feature has just been documented, so not much is known about it yet.
State
Binary Flags
Preview
Invalid State
00000000

Texture applied
00000001


#100	Slipcodes 
State
Binary Flags
No slip
00
Slip (weak)
01
Slip (stong)
10
Slip (weak)
11

Attributes
State
Translation
Binary Flags
??
soil
000
??
stone
001
??
grass
010
?
wood
011
????
mud
100
??
water
101
??
hole
110
????????
nothing
111
Note: "hole" and "nothing" are sound identical to "soil".  Also, "mud" sounds like sand.  The "water" attribute is what causes Pikmin to drown.

Calculating the Magnitude
1) Solve for the center of the tri (average the three XYZ positions)
2) If necessary, recalculate the face's normal with a cross factor
3) magnitude = (avg_x * norm_x) + (avg_y * norm_y) + (avg_z * norm_z)

Visit the document here: https://mega.nz/#F!Ek1RmI5R!8xYfk-REVLvFuMjJsOplUg

Credits: Minty_Meeo