Skate guidance edges
Every grindable edge of Shaun White Skateboarding is data on an entity: a guidance component holds the edges, their surface type and the links that join them. Four component classes share one layout; they differ in what an edge is used for. Observed
| Class | Id | Role | Level 01 |
|---|---|---|---|
SWSkateGuidanceSystem |
0x5CDCA222 |
Rails, ledges and copings | 6,118 edges on its components |
SWSkateFreeFormGuidanceSystem |
0x359BE54E |
Free-form grind edges | 95 |
Scale |
0x6A1CFF2F |
Shapeable props (kickers, benches, planters) | 25 |
Morph |
0x081AF61A |
Props that change between stored states | 5 |
The class ids equal the CRC-32 of the class names. Proven · computed from the names
Guidance system component
Section titled “Guidance system component”Little-endian. The 78-byte object records are exact and their lengths agree with the geometry on all 6,118 level-01 edges.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 = 0x5CDCA222 | class | Proven | |
| 0x4 | 4 | u32 | id | Observed | the resource reference id |
| 0x8 | 4 | u32 | reference class | Observed | |
| 0xC | 1 | u8 | kind | Observed | 0xFE on scale components; meaning unknown |
| 0xD | 4 | u32 | object count n | Observed | |
| 0x11 | 78n | GuidanceObject[n] | objects | Observed | 78 bytes each, below |
Little-endian.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 = 0 | zero | Observed | |
| 0x4 | 4 | u32 = 0x344FA659 | class | Observed | |
| 0x8 | 1 | u8 | Valid | Observed | |
| 0x9 | 4 | u32 | SubType | Observed | 0 none, 9 curved vert; the enum names stand last-first in the executable |
| 0xD | 4 | u32 | Index0 | Observed | index of the edge's first point |
| 0x11 | 4 | u32 | Index1 | Observed | index of the edge's second point |
| 0x15 | 16 | f32[4] | first face normal | Observed | three floats and a zero word |
| 0x25 | 16 | f32[4] | second face normal | Observed | three floats and a zero word |
| 0x35 | 25 | inline object | SWSkateGuidanceObjectData | Observed | [00][id u32][class 0x98A53374][u32 0][end link u32][start link u32][length f32] |
An edge joins the points Index0 and Index1 of the component’s point list. The links name the neighbouring edges; the value 0x1FFF means none. An end link joins an edge that holds Index1; in 8% of the links the connection runs the other way. Observed · level 01
The points follow the objects as a u32 count of u16 values and then u16 triples, each coordinate (v − 32767) / 200 metres in the entity’s local frame. Over all 6,118 edges of level 01 the world length of the decoded points equals the stored length to within 2 cm. Observed · level 01
The two face normals give the kind of edge: a ledge has one normal up and one level; a rail has both tilted by 25 to 60 degrees (fences, stair rails, clothes lines); a curved vert, the lip of a vert wall or quarter pipe, has SubType 9. Observed · level 01
Shaping components
Section titled “Shaping components”The four classes share the layout up to the partitioner: a resource reference, the guidance objects, a u16 point list, an edge filter and a partitioner. The edge filter is an inline object ([00][id][0xDF7FF220], 27 bytes: the floats 1/√2, π/8 and π/4, a zero u16, the words 46 and 60, the float 0.2 and a zero byte). The partitioner ([00][id][0x4661AAEF]) stores a root index, an array of leaf indices, a minimum and a maximum corner and an array of nodes ([00 00 00 00][0x5374195C], a type u32, two u16 and a float for the middle). For free-form and scale components its box equals the bounds of the points to within one u16 step; for morph components it covers the morph states as well. Observed · level 01
Of the class-hash hits in level 01, 95, 25 and 5 are real free-form, scale and morph components (the other hits are entries of an entity’s component list). Observed
- A free-form component (named
00_ShP_FFGrind5m_NNN) has one 5 m edge from (0, 0, 0) to (0, 5, 0), then au32id of a shared object of class0xB5403F20(131 bytes with one edge of 0.25 m and two floats). Level 01 uses the object0x901687FCfor all of them; levels 02 to 05 also use0x766A4B87and0x7CD6EC02with the same content. Observed - A scale component stores nothing after the partitioner, and its reference kind is
0xFE. Observed - A morph component has a
u32state count (2 in level 01, up to 7 in level 06) and per state an inline object (0xCB13AC37) with a guidance object array and a point list of the same length as the system’s. State 0 is the system’s own objects and points (largest point difference 0.0041 to 0.005, oneu16step, on 5 of 5). On the wave prop01_B_Inf_WaveFlatall 220 points lie on vertices of the mesh within 8e-6, and state 1’s points lie on the vertices of the mesh’s second vertex stream within 8e-6 with the same 2 cm deltas on 220 of 220. The largest point movement of a state equals the morph target’s (1.6 m for the wave, 3.2 m for the park shapes). Observed
Levels 02 to 06 contain 109, 106, 50, 62 and 11 free-form components, 32, 19, 19, 0 and 2 scale components and 1, 10, 11, 1 and 1 morph components. A plain guidance system in level 05 holds a link that names an edge which does not hold the point it should; it is read as no link. Observed