MeshShape collision
MeshShape (0xB22B3E61) stores triangle collision separately from render Mesh resources. A byte-counted section run contains geometry and adjacency, followed by materials and bounds. Evidence includes two different-size fixtures, a 15,222-body section census and a 724-shape tree analysis. Observed
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 = 01 | ManagedObject byte | Unknown | Stored bytes; meaning is not established. |
| 0x1 | 4 | u32 | UserCategory | Observed | ObjectShape.UserCategory (registry enum UserResourceCategory, a u32, the base class's field, stored first): 0 (389), 63 (239), 33 (96) of 724 sampled; the same enum as the last u32 of a Mesh. Enumerators: 0 _Unknown, 33 ENV_Prop, 63 ENV_Procedural. |
| 0x5 | 4 | u32 | E37A7DC2 length L | Unknown | Stored bytes; meaning is not established. |
| 0x9 | L | bytes | E37A7DC2 (the sections) | Unknown | Stored bytes; meaning is not established. |
| 9+L | var | bytes | tail | Observed | the Tail box |
Little-endian. Section framing, face/material counts and tail buffers read across all 25,162 MeshShapes of the six installed forges with no refusals. Tree decoding semantics remain scoped to 724 sampled shapes.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 2 | u16 | section type | Proven | |
| 0x2 | 2 | u16 = 0xECD7 | marker | Proven | |
| 0x4 | 4 | i32 | size | Proven | its 8 header bytes included |
| 0x8 | size-8 | bytes | payload | Proven |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | var | char[n] | 0x0201 descriptor | Observed | NUL-terminated 'Name(0x<id>) MeshDescriptor' |
| var | 8 | bytes | 0x0301 | Unknown | Stored bytes; meaning is not established. |
| var | 12 | u32·3 | 0x1EEE counts | Observed | V, F, X |
| var | 12·V | f32·3V | 0x1EEF positions | Observed | |
| var | 6·F | u16·3F | 0x1EF0 faces | Observed | position indices |
| var | 2·F | u16·F | 0x1EF1 per-face polygon ids | Inferred | u16 per face, from 2 up to F+1 (724 of 724 shapes). Faces that share an id are coplanar in all but 27 of 37,036 shared groups: the id numbers the planar polygon a face belongs to (a reading; behaves as face-group ids) |
| var | 12·F | u32·3F | 0x1EF2 face edges | Observed | edge ids |
| var | 4·X | u16·2X | 0x1EF3 edge faces | Observed | 0xFFFF where an edge has one face |
| var | 28 | f32·6 + u32 | 0x1EFA bounds and node count | Observed | size (x, y, z), then minimum (x, y, z), then the node count F-1. The minimum equals the vertices' minimum, and the size is at least the vertices' extent (equal within 1e-3 relative), on 724 of 724 shapes; the u32 equals F-1 on all 724 and is the number of tree nodes in 0x1EF9 |
| var | 11·(F-1) | bytes | 0x1EF9 tree nodes | Observed | Node 0 is the root; every node 1..F-2 is the child of exactly one node and every face 0..F-1 is a leaf of exactly one node, on all 724 shapes. The 6 quantised bytes are not decoded |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 6 | u8·6 | child insets | Observed | byte k (k = 0..5: minimum x, y, z, maximum x, y, z) is the inset, in 255ths of the node's decoded extent on that axis, of the child named by flag bit 2+k; 0 at the root on the shapes read |
| 0x6 | 2 | u16 | child A | Observed | a face id if flag bit 0 is set, else a node id |
| 0x8 | 2 | u16 | child B | Observed | a face id if flag bit 1 is set, else a node id |
| 0xA | 1 | u8 | flags | Observed | bit 0: child A is a face (else a node); bit 1: child B is a face |
Little-endian. Section framing, face/material counts and tail buffers read across all 25,162 MeshShapes of the six installed forges with no refusals. Tree decoding semantics remain scoped to 724 sampled shapes.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | OneCollisionMaterialOnly | Proven | MeshShape.OneCollisionMaterialOnly (registry bool): 1 on 668 of 724 sampled (one material), 0 on 56 (a material per face) |
| 0x1 | 1 | u8 | MaterialUniqeIndex | Proven | MeshShape.MaterialUniqeIndex (registry spelling, a byte): 0 on 724 of 724 sampled |
| 0x2 | 4 | u32 | IndicesMaterialData count m | Proven | 0 (kind 1) or F (kind 0) (MeshShape.IndicesMaterialData, an array of bytes) |
| 0x6 | m | u8·m | IndicesMaterialData | Proven | index into the references, covering 0..n-1 |
| 6+m | 4 | u32 | TriangleMaterialData count n | Proven | |
| 10+m | 10·n | ref·n | TriangleMaterialData | Proven | every one a CollisionMaterial 0x74F7311D (registry array of CollisionMaterial) |
| 10+m+10n | 16 | vec4 | MinLocalAABBox | Proven | the positions' box; w 1.0 (registry vec4) |
| 26+m+10n | 16 | vec4 | MaxLocalAABBox | Proven | w 1.0 (registry vec4) |
Across the 724-shape tree sample, root node zero reaches every node and face exactly once; all non-root nodes have one parent. The six inset bytes describe child-box sides in 255ths of the parent’s extent, and flag bits 2–7 select the inset child for each side. Observed
Shared ids in 0x1EF1 group coplanar triangles in all but 27 of 37,036 shared-id groups. Interpreting the ids as polygon ids is supported by that fit rather than a declaration. Inferred
OneCollisionMaterialOnly selects a single surface; otherwise IndicesMaterialData has one byte per face indexing TriangleMaterialData. The spelling MaterialUniqeIndex follows registry metadata. Observed
Noncoplanar groups prevent a universal polygon-id invariant. The eight zero bytes of section 0x0301 also have no established meaning. Unknown
The complete six-archive section reader accepts all 25,162 MeshShape entries; the more detailed tree and polygon-id meanings above remain scoped to the 724-shape sample. Every section and tail is byte-accounted, without refusals. Proven · framing only
Shaun White Skateboarding
Section titled “Shaun White Skateboarding”only in SWS
Collision geometry is a MeshShape object (0xB22B3E61) with explicit triangles, held apart from the render meshes. The vertices are stored as float4 with a zero fourth component, the triangle indices as u16 triples, one surface byte per triangle, and an opaque Havok MOPP acceleration blob that needs no Havok packfile to read the triangles. The shape is in its own local frame, Z up. Observed · SWS[level 01]
Little-endian. Fields in stored order after the object prefix; exact on 1,561 of 1,561 shapes read.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 + 16n | u32 + f32[4][n] | Vertices | Observed | w is 0 |
| var | 4 + m | u32 + bytes | MoppCode | Observed | the Havok MOPP blob, kept opaque |
| var | 16 | f32[4] | MoppOffsetAndScale | Observed | |
| var | 4 + 6t | u32 + u16[3][t] | IndicesTriangles | Observed | |
| var | 4 + t | u32 + u8[t] | IndicesMaterial | Observed | one index per triangle into Materials |
| var | 4 + 4s | u32 + u32[s] | Materials | Observed | bare ids of collision surface objects |
| var | var | CollisionFilterInfo | filter | Observed | an inline box, class 0x43EF99C2 |
| var | 4 | u32 = 5 | MoppCodeVersionNumber | Observed | |
| var | 32 | f32[4][2] | local bounds | Observed | minimum and maximum |
The Havok SDK that produced the MOPP blob is unknown. The data is neither a packfile nor a tagfile. Observed
Other collision shapes occur in cells: capsule, sphere, box, a convex shape (BarrelShape), a list shape (ListShape, 0x86EBFD8D, whose body ends with a flag byte) and a MultiMeshShape (0x9A503477). Observed
Rigid bodies and placement
Section titled “Rigid bodies and placement”A prop’s collision is an InertComponent (0x0E5A450A, 150 bytes in 1,561 cases) on its entity: the component base, a damage enum, an inline RigidBody (0x228F402A: a CollisionFilterInfo box with layer and part, the shape id, mass, linear and angular damping, four flag bytes and a 16-float local inertia tensor) and a walkability enum, then 12 bytes. The managed byte of the inline body can be 0. RigidBody.Shape is a bare id; level 01 reaches 1,152 shapes inside the cell and 409 in other entries. The inertia tensor is not the placement. Observed · level 01
A MultiInertComponent (0x8BBEEE57) holds an inline MultiMeshShape of parallel arrays: five-byte entity handles (tag 0 and a u32) and bare shape ids. The container itself carries an identity matrix in the cell examined; each pair is placed at its contained entity’s matrix. The pairing matched on a cell of ten children: the six shapes that resolve locally have exactly the names of their entity’s Visual meshes. Observed · one cell of ten children
Level 01’s collision placements number 2,074, of 1,194 unique shape objects with 49 distinct surface ids, and every shape and entity reference resolves. Observed · level 01
What has no collision
Section titled “What has no collision”Collision belongs to an entity through a component (an InertComponent, a MultiInertComponent, or the class of the kickers below); an entity with only a Visual component is drawn and has nothing to stand on. Observed · SWS Large drawn areas are of that kind: level 03’s background hills (03_Island_BG_Ground_01 to _05b) are Visual-only, except _04b, whose collision is 16 flat triangles; level 06’s 06_Ground_Construction_01 covers about 79,000 m² of upward-facing render with no collision; SW_RoadB and SW_RoadC have none either. Observed · SWS Level 03 has no heightfield or terrain class among the 73 object classes of its forge, and of its 276 distinct MeshShape ids 273 are placed; the other three belong to props. Observed · SWS[level 03]
Sampling every upward-facing render surface on a 2 m grid against the placed collision (a render sample counts as covered when collision lies within 1.2 m) finds uncovered ground in every level. The counts include roofs, ceilings and background cliffs, so they bound the walkable gaps from above. Observed · SWS
| Level | Collision triangles | Upward render samples within 12 m of collision | Uncovered | Confidence |
|---|---|---|---|---|
| 01 | 123,102 | 35,219 | 10,244 | Observed · SWS |
| 02 | 106,174 | 57,257 | 21,756 | Observed · SWS |
| 03 | 96,361 | 16,055 | 5,726 | Observed · SWS |
| 04_Stronghold | 15,332 | 5,120 | 1,904 | Observed · SWS |
| 05 | 134,172 | 32,565 | 15,299 | Observed · SWS |
| SW | 44,347 | 4,519 | 848 | Observed · SWS |
Kickers, ramp boxes and shaping grinds (*_InfGP_Kicker_*, *_RampBox*, ShapingGrind_*) carry a component of class 0x0873AE87 instead of an InertComponent. Observed · SWS That their collision is a free-form hull of class 0xC3120087 is a guess. Inferred · SWS
Level 03 places 19 00_OutOfBound_Air_Trig_* slabs (8 × 1 × 10 m) along its district edges. Observed · SWS[level 03] Whether they respawn a player who leaves the collision is not established. Unknown
Whether the game keeps the player off the uncollided hills and roads, through the out-of-bound triggers or otherwise, is not established.