Collision Index Data (File Format)

The collision index data structure defines collision geometry and materials. It can be found in the MREA format as well as the DCLN format.

Format

The structure is basically just a sequence of arrays. In Metroid Prime 2, the collision material field was extended from 32 bits to 64 bits, and a new array was added in between the triangle and vertex arrays. Other than that, the format is the same across all games.

Type Count Name Notes MP1 MP2+
u32 1 Collision Material Count Count of collision materials in the mesh.
u32/u64 Collision Material Count Collision Material Array Array of bitfields that controls the collision material/properties. This is a 32-bit field in Metroid Prime, and a 64-bit field in every game after. See below for details.
u32 1 Vertex Index Count Count of vertex material indices. Matches the number of vertices in the collision mesh.
u8 Vertex Index Count Vertex Index Array Array of vertex material indices. Each entry maps the corresponding vertex to a collision material from the Collision Material Array.
u32 1 Edge Index Count Count of edge material indices. Matches the number of edges in the collision mesh.
u8 Edge Index Count Edge Index Array Array of edge material indices. Each entry maps the corresponding edge to a collision material from the Collision Material Array.
u32 1 Triangle Index Count Count of triangle material indices. Matches the number of triangles in the collision mesh.
u8 Triangle Index Count Triangle Index Array Array of triangle material indices. Each entry maps the corresponding triangle to a collision material from the Collision Material Array.
u32 1 Edge Count Count of edges in the collision mesh.
Edge Edge Count Edge Array Array defining all edges in the collision mesh. Each edge is defined with two vertex indices.
u32 1 Triangle Count Count of triangles in the next array. Note this is technically a count of the number of indices in the next array, not the number of triangles, so you need to divide it by 3 to calculate the actual triangle count.
Triangle Triangle Count / 3 Triangle Array Array defining all triangles in the collision mesh. Each triangle is defined with three edge indices. If the triangle's material has the Flipped Tri flag enabled, then reverse winding order; otherwise use the indices in order.
u32 1 Unknown Index Count This array is only in Metroid Prime 2 and later.
u16 Unknown Index Count Unknown Index Array This array is only in Metroid Prime 2 and later.
u32 1 Vertex Count Count of vertices in the next array.
Vector3f Vertex Count Vertex Array Array defining all vertices in the collision mesh.

Edge

Offset Type Name
0x0 u16 Vertex Index A
0x2 u16 Vertex Index B
0x4 End of Edge

Triangle

Offset Type Name
0x0 u16 Edge Index A
0x2 u16 Edge Index B
0x4 u16 Edge Index C
0x6 End of Triangle

Collision Materials

Collision materials are basically properties mapped to every vertex, edge, and triangle in the collision mesh that controls how the game reacts when an object touches it. It controls things like, for example:

  • What sound effect plays when the player walks on the surface
  • Which actors are allowed to pass through the collision
  • Whether the player is allowed to stand on the surface or if it should be treated as a wall

... among some other things. This field is 32 bits in Metroid Prime, and was extended to 64 bits in Metroid Prime 2 and every game after. Prime 2 and 3 share the same property values, whereas Prime 1 and DKCR have unique property sets. In Prime 2 and on, the majority of the fields in the upper 32 bits are only meant for internal use and aren't used by MREA or DCLN collision assets. (These bits exist internally in Prime 1 as well, but they aren't exposed to the collision file format.)

The surface type properties controls what physical material the surface is made of, which changes the sound effect that plays when the player walks/jumps on the surface and in some cases, what particle effect plays on it. In the Metroid Prime series, rather than embedding an enum to set the surface type, each surface type is assigned its own bit. This technically allows for multiple surface types to be set on the same geometry. For sound effect playback, the bit with the largest value takes priority.

Metroid Prime

Bit Hex Name Description
0 0x00000001 Unknown This is a default flag set on most surface types. (Note: This isn't an unknown flag, it's just literally named "Unknown".)
1 0x00000002 Stone Stone surface type.
2 0x00000004 Metal Metal surface type.
3 0x00000008 Grass Grass surface type.
4 0x00000010 Ice Ice surface type.
5 0x00000020 Pillar This flag is toggled on most pillar structures. Unknown function (possibly has something to do with how the morph ball camera interacts with the surface?).
6 0x00000040 Metal Grating Metal grating surface type.
7 0x00000080 Phazon Phazon surface type. If the active AreaAttributes object in this room has the Phazon Type enum set, this collision will cause the player to take Phazon-type damage.
8 0x00000100 Dirt Dirt surface type.
9 0x00000200 Lava Lava surface type. The sound effects for this surface type are in the LavaWorld AGSC, so it won't play back correctly outside of Magmoor.
10 0x00000400 Unknown Unknown surface type found in a few rooms in Magmoor (some walls in Geothermal Core and Plasma Processing, the floors in Save Station A, and the ceiling in Save Station B). Footstep SFX sounds like stone.
11 0x00000800 Snow Snow surface type.
12 0x00001000 Slow Mud Slow mud surface type. The player's speed is reduced while walking on this surface. This is normally unused (only found in a few spots where you can't actually walk on it).
13 0x00002000 Halfpipe Indicates this surface is a half-pipe, which changes how morph ball physics are calculated.
14 0x00004000 Mud Mud surface type. Same as Slow Mud except it doesn't slow down the player. This is normally unused (only found in a few strange spots in Life Grove).
15 0x00008000 Glass Glass surface type.
16 0x00010000 Shield Shield surface type. Generally used on collision for force fields.
17 0x00020000 Sand Sand surface type.
18 0x00040000 Shoot Thru If this flag is enabled, projectiles can pass through this surface. This is used liberally in Prime 1 to make projectile collision appear more accurate.
19 0x00080000 Solid If this flag is disabled, no actors can collide with this surface.
20 0x00100000 Unknown Seems to be set on everything? Not a surface type and no noticeable effect from turning it on/off.
21 0x00200000 Camera Thru If this flag is enabled, the morph ball camera can pass through this surface.
22 0x00400000 Wood Wood surface type.
23 0x00800000 Organic Organic surface type.
24 0x01000000 Unknown
25 0x02000000 Redundant Edge/Flipped Tri Triangles with this flag enabled are flipped around.
26 0x04000000 See Thru Indicates this surface is an invisible wall. Unknown function.
27 0x08000000 Scan Thru If this flag is enabled, this surface doesn't block lock-ons in any visor.
28 0x10000000 AI Walk Thru If this flag is enabled, AI actors can pass through this surface.
29 0x20000000 Ceiling Indicates this surface is a ceiling.
30 0x40000000 Wall Indicates this surface is a wall.
31 0x80000000 Floor Indicates this surface is a floor.

Metroid Prime 2/3

Bit Hex Name Description
0 0x00000000 00000001 Unknown This is a default flag set on most surface types. (Note: This isn't an unknown flag, it's just literally named "Unknown".)
1 0x00000000 00000002 Stone Stone surface type.
2 0x00000000 00000004 Metal Metal surface type.
3 0x00000000 00000008 Grass Grass surface type.
4 0x00000000 00000010 Ice Ice surface type.
5 0x00000000 00000020 Pillar This flag is toggled on most pillar structures. Unknown function (possibly has something to do with how the morph ball camera interacts with the surface?).
6 0x00000000 00000040 Metal Grating Metal grating surface type.
7 0x00000000 00000080 Phazon Phazon surface type. This collision will cause the player to take Phazon-type damage.
8 0x00000000 00000100 Dirt Dirt surface type.
9 0x00000000 00000200 SP_Metal Alternate metal surface type.
10 0x00000000 00000400 Glass Glass surface type.
11 0x00000000 00000800 Snow Snow surface type.
12 0x00000000 00001000 Fabric Fabric surface type.
13 0x00000000 00002000 Halfpipe Indicates this surface is a half-pipe, which changes how morph ball physics are calculated.
14 0x00000000 00004000 Unused3 Unused in Prime 2. Unknown in Prime 3.
15 0x00000000 00008000 Unused4 Unused in Prime 2. Unknown in Prime 3.
16 0x00000000 00010000 Shield Shield surface type. Generally used on collision for force fields.
17 0x00000000 00020000 Sand Sand surface type.
18 0x00000000 00040000 Moth Organics/Seed Organics Alternate organic surface type; used for moth materials in Prime 2 and used in the Leviathan Core rooms in Prime 3.
19 0x00000000 00080000 Web Spider web surface type.
20 0x00000000 00100000 Shoot Thru If this flag is enabled, projectiles can pass through this surface. (Presumably has no effect unless projectiles are configured to use the collision geometry instead of the render geometry.)
21 0x00000000 00200000 Camera Thru If this flag is enabled, the morph ball camera can pass through this surface.
22 0x00000000 00400000 Wood Wood surface type.
23 0x00000000 00800000 Organic Organic surface type.
24 0x00000000 01000000 Redundant Edge/Flipped Tri Triangles with this flag enabled are flipped around.
25 0x00000000 02000000 Rubber Rubber surface type.
26 0x00000000 04000000 See Thru Indicates this surface is an invisible wall. Unknown function.
27 0x00000000 08000000 Scan Thru If this flag is enabled, this surface doesn't block lock-ons in any visor.
28 0x00000000 10000000 AI Walk Thru If this flag is enabled, AI actors can pass through this surface.
29 0x00000000 20000000 Ceiling Indicates this surface is a ceiling.
30 0x00000000 40000000 Wall Indicates this surface is a wall.
31 0x00000000 80000000 Floor Indicates this surface is a floor.
32 0x00000001 00000000 Player (Internal) Internal use only.
33 0x00000002 00000000 Character (Internal) Internal use only.
34 0x00000004 00000000 Trigger (Internal) Internal use only.
35 0x00000008 00000000 Projectile (Internal) Internal use only.
36 0x00000010 00000000 Bomb (Internal) Internal use only.
37 0x00000020 00000000 Ground Collider (Internal) Internal use only.
38 0x00000040 00000000 No Static World Collision (Internal) Internal use only.
39 0x00000080 00000000 Scannable (Internal) Internal use only.
40 0x00000100 00000000 Target (Internal) Internal use only.
41 0x00000200 00000000 Orbit (Internal) Internal use only.
42 0x00000400 00000000 Occluder (Internal) Internal use only.
43 0x00000800 00000000 Immovable (Internal) Internal use only.
44 0x00001000 00000000 Debris (Internal) Internal use only.
45 0x00002000 00000000 Power Bomb (Internal) Internal use only.
46 0x00004000 00000000 Targetable Projectile (Internal) Internal use only.
47 0x00008000 00000000 Collision Only Actor (Internal) Internal use only.
48 0x00010000 00000000 AI Block (Internal) Internal use only.
49 0x00020000 00000000 Platform (Internal) Internal use only.
50 0x00040000 00000000 Non Solid Damageable (Internal) Internal use only.
51 0x00080000 00000000 Show on Radar (Internal) Internal use only.
52 0x00100000 00000000 Platform Slave (Internal) Internal use only.
53 0x00200000 00000000 No Ice Spread (Internal) Internal use only.
54 0x00400000 00000000 Grapple Thru (Internal) Internal use only.
55 0x00800000 00000000 Can Jump on Character (Internal) Internal use only.
56 0x01000000 00000000 Exclude from Line of Sight Test (Internal) Internal use only.
57 0x02000000 00000000 Don't Show on Radar (Internal) Internal use only.
58 0x04000000 00000000 Jump Not Allowed If this flag is enabled, the player won't be able to stand on this surface and instead will slide off it.
59 0x08000000 00000000 Solid (Internal) Internal use only.
60 0x10000000 00000000 Complex (Internal) Internal use only.
61 0x20000000 00000000 Spider Ball If this flag is enabled, the player will be able to use Spider Ball on this surface. This is used for irregularly-shaped spider ball attraction surfaces (like spheres).
62 0x40000000 00000000 Screw Attack Wall Jump If this flag is enabled, the player can wall jump from this wall using Screw Attack.
63 0x80000000 00000000 Seek (Internal) Internal use only.

Donkey Kong Country Returns

Bit Hex Name Description
0 0x00000000 00000001 Unknown
1 0x00000000 00000002 Unknown
2 0x00000000 00000004 Unknown
3 0x00000000 00000008 Unknown
4 0x00000000 00000010 Unknown
5 0x00000000 00000020 Unknown
6 0x00000000 00000040 Unknown
7 0x00000000 00000080 Unknown
8 0x00000000 00000100 Ceiling Indicates this surface is a ceiling.
9 0x00000000 00000200 Wall Indicates this surface is a wall.
10 0x00000000 00000400 Floor Indicates this surface is a floor.
11 0x00000000 00000800 Player Walk Thru If this flag is enabled, the player can pass through this surface.
12 0x00000000 00001000 Unknown
13 0x00000000 00002000 Unknown
14 0x00000000 00004000 AI Walk Thru If this flag is enabled, AI actors can pass through this surface.
15 0x00000000 00008000 Unknown
16 0x00000000 00010000 Unknown
17 0x00000000 00020000 Unknown
18 0x00000000 00040000 Unknown
19 0x00000000 00080000 Unknown
20 0x00000000 00100000 Unknown
21 0x00000000 00200000 Unknown
22 0x00000000 00400000 Unknown
23 0x00000000 00800000 Unknown
24 0x00000000 01000000 Unknown
25 0x00000000 02000000 Unknown
26 0x00000000 04000000 Unknown
27 0x00000000 08000000 Unknown
28 0x00000000 10000000 Redundant Edge/Flipped Tri Triangles with this flag enabled are flipped around.
29 0x00000000 20000000 Unknown
30 0x00000000 40000000 Unknown
31 0x00000000 80000000 Unknown
32 0x00000001 00000000 Unknown
33 0x00000002 00000000 Unknown
34 0x00000004 00000000 Unknown
35 0x00000008 00000000 Unknown
36 0x00000010 00000000 Unknown
37 0x00000020 00000000 Unknown
38 0x00000040 00000000 Unknown
39 0x00000080 00000000 Unknown
40 0x00000100 00000000 Unknown
41 0x00000200 00000000 Unknown
42 0x00000400 00000000 Unknown
43 0x00000800 00000000 Unknown
44 0x00001000 00000000 Unknown
45 0x00002000 00000000 Unknown
46 0x00004000 00000000 Unknown
47 0x00008000 00000000 Unknown
48 0x00010000 00000000 Unknown
49 0x00020000 00000000 Unknown
50 0x00040000 00000000 Unknown
51 0x00080000 00000000 Unknown
52 0x00100000 00000000 Unknown
53 0x00200000 00000000 Unknown
54 0x00400000 00000000 Unknown
55 0x00800000 00000000 Unknown
56 0x01000000 00000000 Unknown
57 0x02000000 00000000 Unknown
58 0x04000000 00000000 Unknown
59 0x08000000 00000000 Unknown
60 0x10000000 00000000 Unknown
61 0x20000000 00000000 Unknown
62 0x40000000 00000000 Unknown
63 0x80000000 00000000 Unknown