Skip to content

Models (.model)

Insomniac engineGeometryApplies toSunset

A .model asset (8,780 in the install) is a DAT1 container with the type magic 0x6AE15C79. All 8,780 are LZ4-compressed with a zero wrapper tail. Observed Five have no geometry sections (portal, cine_traincrash_rearrooffire_spawner, tb_testbldg_globe_fountain, test_trash_can_breakable_stump, empty_weapon); the other 8,775 all have the vertex, index, mesh, look, UV and material sections below. Observed The geometry is +Y up. Observed

Numbers on this page are from a recorded census of the PC build 3373500; the install is no longer available. Observed

Tag Name Size Content Confidence
283D0383 Model Built 72 B bounds and the vertex quantisation Observed
A98BE69B vertices 16 B each packed position, normal and tangent Observed
0859863D indices u16 plain 16-bit indices, no delta coding Observed
78D9CBDE meshes 64 B each one record per submesh Observed
06EB7EFC look 16 B four LODs, each (first mesh, mesh count) Observed
16F3BA18 UV0 4 B per vertex half-float u, v Observed
3250BB80 materials 32 B each material path and name offsets Observed
5CBA9DE9 vertex colour in 1,425 models Observed
DCA379A2 skin data in 3,470 models Observed
Model Built72 bytesSunset44% known

Little-endian; floats are indexed from 0 in the census.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x012f32[3]bounds centreObserved
0xC4f32bounding sphere radiusObserved
0x1012f32[3]box half-extentsObservedthe box is centre ± half-extents
0x1C4u32quantisation wordObservedthe low nibble N gives the position scale 2^−N; bits 4 to 15 take only the values 0, 16, 32, 48 and are unexplained
0x204f32unknownUnknown
0x2412f32[3]LOD switch distancesInferred15, 30, 110 in 6,335 models
0x3012f32[3]unknownUnknown
0x3C4f32unknownUnknown2 in almost every model
0x404f32unknownUnknown8 in almost every model
0x444u32unknownUnknown

The position scale is 2^−(word & 0xF) with no offset. Observed Evidence: the decoded minimum and maximum equal the stored box within two quanta in all 5,305 static models (and in 1,078 of 3,470 skinned ones; the other 2,392 skinned models exceed their box); 1x1_plane (nibble 12) decodes to ±0.5 and its y of 41 to 0.01001 equal to the built centre; seafloor_8x8 (nibble 12) to ±4.005 and seafloor_96x96 (nibble 9) to ±48.01 equal their half-extents (a fixed 1/4096 would give 6.0 for the latter). Observed Nibble distribution: 12 → 7,603 models, 8 → 516, 11 → 366, 10 → 193, 9 → 62, 7 → 22, 5 → 13, 6 → 5. Observed

Vertex16 bytesSunset75% known
ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x06i16[3]positionObserved× 2^−N, no offset
0x62i16wObserved±32767 in most models; possibly a bitangent sign
0x84u32packed normalObservedthe plane's word 0x200FFE00 decodes to (0, 1, 0) with the ALERT decoder
0xC4u32tangentUnknownprobably a packed tangent

The layout is the same as ALERT’s Sunset Overdrive branch. Sourced · ALERT Whether the normals are unit length over all vertices, and the vertex-colour format (probably a u32 per vertex), are not checked. Unknown

Mesh entry64 bytesSunset53% known
ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x016f32[4]bounding sphereObservedcentre xyz and radius
0x104u32vertex startObserved
0x144u32index startObserved
0x184u32index countObserveda multiple of 3
0x1C4u32vertex countObservedupper 16 bits always 0
0x202u16flagsObservedbit 0x10: indices are relative to the vertex start
0x222u16material indexInferred0 to 49; from ALERT's layout
0x2428u8[28]unknownUnknown

Over 37,148 meshes: vertex start + vertex count never exceeds the vertex count, index start + index count never exceeds the index count. Observed Flag 0x10 means the indices are relative to the vertex start. All 17,152 meshes with the flag have indices below their vertex count; of the 13,418 meshes without it and with a vertex start above 0, all have absolute indices within [vertex start, vertex start + vertex count); no mesh fits neither. Observed ALERT’s OBJ writer tests (flags & 0x10) == 0 for “relative”, the opposite. Observed

In 3,365 models the per-mesh vertex counts do not sum to the vertex total (the sum equals it in 5,410 of 8,775); the cause (LODs or meshes sharing vertex ranges, overlap versus gaps) is not established. Unknown

Four (u16 first mesh, u16 mesh count) pairs, one per LOD. Over the 8,775 models with geometry the distinct ranges are contiguous and together cover every mesh exactly. A model with fewer LODs repeats the last range: 4,225 models have 1 distinct LOD, 698 have 2, 3,759 have 3 and 93 have 4. Observed

Half-float u, v at 4 bytes per vertex. On the 1 × 1 plane it gives (0,0), (0,1), (1,1), (1,0) with u = x + 0.5 and v = z + 0.5. Some models use 8 bytes per vertex (the ALERT get_uv variant); the second pair is probably a second UV set. Their count is not established. Observed

Per entry a u32 string offset for the .material path, a u32 for the material name, then six u32 (zero in the fixtures). The layout is taken from ALERT and the sampled strings match. Sourced · ALERT

The 1 × 1 plane is symmetric and cannot show a mirror. Triangle (0, 1, 2) of the plane winds counter-clockwise about +Y in a right-handed frame, but whether the engine’s frame is left- or right-handed has not been decided. Unknown

What is the handedness of Sunset Overdrive’s world?

It needs an asymmetric reference: text geometry, a decal carrying text, or the minimap overlaid with zone placements (the hex placements are in world coordinates, Zones).

What do the unexplained bits of the quantisation word, the vertex w and the 8-byte UV variant mean?

Bits 4 to 15 of the word at +28 of Model Built take only 0, 16, 32, 48; vertex w is ±32767 in most models; some models carry a second UV pair. Skinned models (3,470) exceed their box, so skinning is needed to place them, which was not decoded.

Sources

  • ALERT (Tkachov) — vertex layout of the i16 branch and the packed-normal decoder; its OBJ writer reads the index flag inverted