Area Collision (File Format)

From Retro Modding Wiki
Jump to navigation Jump to search

The format for area collision stores the collision geometry for levels, and can be found in the MREA format. Most of it is shared with the DCLN format, but there are a few parts that are exclusive to MREA.

Format

Offset Type Count Name Notes
0x0 u32 1 Unknown Always 0x01000000
0x4 u32 1 Collision Section Size Size of the collision section (not including these first two values).
0x8 u32 1 Magic Always 0xDEAFBABE
0xC u32 1 Version Possible values:
  • 0x3: Metroid Prime
  • 0x4: Metroid Prime 2/3
  • 0x5: Donkey Kong Country Returns
0x10 AABox 1 Collision Bounding Box Bounding box of the collision mesh. This is also the bounding box of the root node of the octree.
0x28 u32 1 Octree Root Node Type Node type for the root node. This is almost always 1 (Branch) but there ARE some areas that use other values for this.
0x2C u32 1 Octree Size Size of the collision octree.
0x30 Collision Octree 1 Collision Octree Octree for the collision mesh. This is used to quickly locate triangles that an actor could potentially be colliding with.
Collision Index Data 1 Collision Index Data Index data for the collision mesh. This data section is what actually defines the collision mesh itself. This part of the format is shared with DCLN.
End of MREA Collision Section

Collision Octree

To do:
In DKCR the octree format was modified to partition in 2D instead of 3D. Need to document changes.

The collision octree is a node tree that allows an actor to quickly locate any triangles it might be colliding with without needing to check every triangle in the mesh. The type of the root node of the tree is determined by the Octree Root Node Type value in the header, but it's usually a branch node.

Branch Node

A branch node has eight child nodes. Each child occupies one octant of the branch's bounding box.

Offset Type Count Name Notes
0x0 u16 1 Child Node Type Flags Bitfield that specifies the node type of each child node. Each child is allocated two bits, which will be either 0, 1, or 2. The lower bits correspond to the first children.
0x2 u16 1 Padding Padding to align the file to four bytes.
0x4 u32 8 Child Node Offsets Offset of each child node. These are relative to the start of the first child node.
0x24 Octree Node 8 Child Nodes Octree child nodes. The type of the node is determined by the node type enum set for this child in the Child Node Type Flags. If the value is 0, then this child doesn't contain any triangles so it doesn't exist. Otherwise, it will be either a branch or a leaf.
End of Branch Node

Leaf Node

A leaf node marks the end of a tree branch. It contains a list of triangles that an object in this leaf could be colliding with.

Offset Type Count Name Notes
0x0 AABox 1 Leaf Bounding Box Bounding box of the leaf. This is fitted more cleanly to the triangles in the node, so it won't match the bounding box generated for this node by subdividing the parent's bounds.
0x18 u16 1 Triangle Count Number of triangles inside this leaf node.
0x1A u16 Triangle Count Triangle Index List List of triangles that are contained in this leaf. At this point, an actor inside this leaf would need to look up each triangle in this list and check for collisions against each of them.
Pad to 4 bytes
End of Leaf Node

Octree Node Type Enum

ID Type
0 None
1 Branch
2 Leaf