Skip to content

LODs and clusters

ForzaTechGeometryApplies toFH6

A placed object is a template: a name that maps to one model stem, which has several .modelbin files for its levels of detail and, for smashables, its fragments. The files are called <template>_clusterNNN.i.modelbin. The shipping build stripped every LOD that no draw profile uses, so a building piece typically ships LOD0, LOD1 and LOD3 only. Observed

All counts are from a recorded census of the Tokyo track Brio; the install is no longer available. Observed

In 9,467 of 34,191 LOD files (27.7%) the cluster number and the LOD differ. The patterns seen are: 0,1,2,3,4; Houdini roofs 0,4; smashables 0, fragments..., 3, 2, 1; multi-part templates 0,1,2,3,0,1,2,3 (two parts per level). Observed

The LOD of a file is in its Modl blob (Models): either has LOD 1, min LOD = max LOD = k, LOD flags = 1 << (k + 1) (34,191 files) or has LOD 0, 0, 0, 0xFFFF (9,343 files: smashable fragments or the only file of a single-piece template). A mesh’s (LOD flags, level 1, level 2) is (1 << (k+1), k, k) or (0xFFFF, 30, 255). Observed

Over all 113,868 modelbins of GeoChunk0 (407,461 meshes): in .i.modelbin files every mesh’s flags equal its file’s Modl flags. Observed

Modl LOD flags Files
0x2 (LOD0) 29,122
0x4 (LOD1) 25,337
0x8 (LOD2) 21,362
0x10 (LOD3) 19,341
0x20 (LOD4) 8,276
0x40 (LOD5) 11
0xFFFF (has LOD 0) 10,414

Bit 0 occurs only inside 0xFFFF (13,730 meshes, all in the 10,414 all-LOD files); no mesh sets bit 0 with any other combination, so it has no meaning of its own, and the test for a LOD is flags & (1 << (k + 1)). Observed The five .a.modelbin files give each mesh one LOD bit (89 meshes); two have no LOD0 mesh (flags 0x1C, LOD1 to LOD3). Observed

LOD distances are stored only in the hand-placed instance file’s LOD profile table (Hand-placed instances):

LOD profile record50 bytesFH698% known

In the .pvs. u32 group count, then per group a u32 n and n records. Little-endian.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x02u16tierObserved0 to 4; what selects it is below
0x22u16passObserved
0x436band[6]bandsObservedper band: f16 distance, f16 fade, u8 0, u8 last
0x281u8 = 1oneObserved
0x291u8unknownUnknown
0x2A8f32[2] = 1.0, 1.0two floatsObserved

LOD k is drawn in [max(dist_0..dist_k−1), dist_k); a zero-width band skips the LOD; nothing is drawn beyond the band marked last. Observed Pass 2 is the main view and the only pass with fades; passes 4, 10 and 11 equal dist − fade/2 exactly, pass 7 min(dist − fade/2, 100). Observed

The Tokyo track’s table holds, by (pass, tier): in passes 2, 4, 7, 10, 11 and 12, 14 tier 0, 153 tier 1, 17 tier 2, 114 tier 3 and 3 tier 4 records each; in passes 0, 1 and 9, 68 tier 1, 1 tier 2 and 36 tier 3; in pass 8, 71 tier 1, 1 tier 2 and 39 tier 3, and no tier 0 or 4 record in those four passes. Observed A group does not hold a record of every tier: of the 1,140 hand-placed instances around the Shibuya Scramble, 741 have no pass 2 record of tier 0, 7 none of tier 1, 741 none of tier 2, 414 none of tier 3 and 821 none of tier 4. Observed So the tier selects among a group’s records, but whether it is a quality setting, and what the game draws for a group with no record of its tier, is not established. Unknown

A hand-placed instance’s group is its transform byte +56. A .pgeo template’s group is that of its catalogue copy: the one unplaced ribbon instance of the template at exactly (0, 0, 0), which exists for 1,882 of 2,010 .pgeo templates; the rest ship no modelbin. Observed The LODs the build stripped equal the LODs the profile never draws for 98.6% of model sets. Observed

The game’s global LOD distance scales are in the encrypted render settings: DefaultLODDistanceScale 1.0 at every geometry quality, with a DrawDistanceType per quality (Settings files). Proven Which draw-behaviour slot or LOD-profile tier a DrawDistanceType selects is not in any file. Unknown

For vegetation and props, the distances come from the instance template libraries instead: a draw behaviour slot lists distance bands, and the template’s set for that slot lists model LODs. See Template libraries. Observed