Visuals and mesh instances
A Visual names a graphic object and its instance data. The common path is Visual → LODSelectorInstance → MeshInstanceData; direct MeshInstanceData also occurs. Five instance slots align to five selector descriptors in all 2,839 sampled selector instances. Observed
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | ManagedObject byte | Unknown | 0 on all |
| 0x1 | 1 | u8 | Active | Observed | |
| 0x2 | 1 | u8 | IsAnOptimizedComponent | Observed | |
| 0x3 | 1 | u8 | IsPartiallyOptimized | Observed | Component.IsPartiallyOptimized: 0 on nearly all |
| 0x4 | 10 | ref | object | Observed | what it shows: a LODSelector on most, a Mesh on some; or none (03) |
| 0xE | 1 | u8 | instance tag | Observed | 00: an instance object follows; 03: none, the tail follows at 15 |
| 0xF | 8 | u64 | instance id | Observed | |
| 0x17 | 4 | u32 | instance type | Observed | LODSelectorInstance 0x01437462, MeshInstanceData 0x536E963B, LightInstance 0x554C614C (311 bytes, tail included), SplashFXInstanceData 0xB8B08A89 |
| 0x1B | var | bytes | instance body | Observed | by its type (the LODSelectorInstance and MeshInstanceData boxes) |
| var | 125 | bytes | Visual tail | Observed | the Visual tail box (none after a LightInstance) |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | instance count k | Observed | |
| 0x4 | 64·k | matrix4·k | instance matrices | Observed | column-major; none: placed once by its owner |
| 4+64k | 40 | bytes | bounds | Observed | BoundingVolume |
| 44+64k | 10 | bytes | InstanceShaderConstants pointer, LODSelector link | Observed | the 10 bytes are GraphicObjectInstanceData.InstanceShaderConstants (a pointer, 03 = null) and LODSelectorInstance.LODSelector (a 9-byte link: tag 01 + the LODSelector's id): (03, 01) on 624,564 of 624,564 |
| 54+64k | var | bytes | five level slots | Observed | each 03 (empty), or 00 + u64 + u32 type and the slot's body: MeshInstanceData 0x536E963B or ImpostorInstanceData 0xB3F06BC3 |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | instance count n | Observed | |
| 0x4 | 64·n | matrix4·n | instance matrices | Observed | column-major |
| 4+64n | 40 | bytes | bounds | Observed | BoundingVolume |
| 44+64n | 1 | u8 | InstanceShaderConstants pointer | Observed | GraphicObjectInstanceData.InstanceShaderConstants (a pointer): 03 = null |
| 45+64n | 1 | u8 | IsFake | Observed | MeshInstanceData.IsFake (bool): 1 on 2,036 of 2,195 |
| 46+64n | 1 | u8 | IsNearFake | Observed | MeshInstanceData.IsNearFake (bool): 1 on 0 of 2,195 |
| 47+64n | 4 | u32 | FakeMeshIndex | Observed | MeshInstanceData.FakeMeshIndex (u32): non-zero on 2,034 of 2,195 (e.g. 434 with IsFake) |
| 51+64n | 1 | u8 | CompiledMeshInstance pointer tag | Observed | 00 (present); the pointer's class id is the next u32 |
| 52+64n | 8 | u64 | CompiledMeshInstance: object id | Observed | 0 |
| 60+64n | 4 | u32 = 0x4368101B | CompiledMeshInstance type | Observed | |
| 64+64n | 1 | u8 | VertexFormat | Observed | CompiledMeshInstance.VertexFormat (registry byte): 11 2,036, 0 103, 2 46 |
| 65+64n | 4 | u32 | Streams count | Observed | CompiledMeshInstance.Streams (array of CompiledMeshInstanceStream): count 0 2,195 |
| 69+64n | 4 | u32 | PlatformVersion | Observed | CompiledMeshInstance.PlatformVersion: 31 2,195 |
| 73+64n | 8 | u64 | MeshHash | Observed | CompiledMeshInstance.MeshHash (u64): non-zero on 2,195 of 2,195 |
| 81+64n | 4 | u32 | material-info count a | Observed | |
| 85+64n | 41·a | bytes | material infos | Observed | the Material info box |
| 85+64n+41a | 4 | u32 | instance bounds count b | Observed | |
| 89+64n+41a | 40·b | bytes | instance bounds | Observed | BoundingVolume per instance |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 = 00 | tag | Observed | |
| 0x1 | 8 | u64 | id | Observed | |
| 0x9 | 4 | u32 = 0x995BFBF5 | type | Observed | |
| 0xD | 1 | u8 = 02 | tag | Observed | |
| 0xE | 8 | u64 | owner | Observed | |
| 0x16 | 1 | u8 = 00 | tag | Observed | |
| 0x17 | 8 | u64 | source Material | Observed | |
| 0x1F | 2 | bytes = 01 01 | tag | Observed | |
| 0x21 | 8 | u64 | replacement Material | Observed |
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 4 | u32 | instance count n | Observed | |
| 0x4 | 64·n | matrix4·n | instance matrices | Observed | |
| 4+64n | 40 | bytes | bounds | Observed | BoundingVolume |
| 44+64n | 10 | bytes | impostor | Observed | kept as stored: 03 00 + an Impostor's ClassID |
Material-info entries identify a source Material ClassID and replacement Material ClassID, rather than an ordinal mesh range. Replacement modes 01 01 and 01 04 occur. Observed
The ten bytes after LODSelectorInstance bounds are a null InstanceShaderConstants pointer (03) and nine-byte selector link (01 + id) on 624,564 checked instances. They are not a ten-byte resource reference. Observed
The standard Visual tail is 125 bytes when its optional pointer is null. Its last 32 bytes are VisualShaderConstants data, interpreted by DataLayout; they are not universally a tint color. Material-layout values occur on user-content editor props, while the default view usually ends in four f32 ones. Observed
Little-endian. Offsets are relative to this structure.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 1 | u8 | CanBeOccluder | Observed | Visual bool 1 of the 4 stored bools (registry order): see the pattern below |
| 0x1 | 1 | u8 | HasUnshareContext | Observed | Visual bool 2 |
| 0x2 | 1 | u8 | OptimizedPackedLOD | Observed | Visual bool 3 |
| 0x3 | 1 | u8 | CopyInstanceDataOnDuplicate | Observed | Visual bool 4. The four bytes: 01000000 630,674, 00000000 12 |
| 0x4 | 4 | u32 | DisplayOrder | Observed | Visual.DisplayOrder (a u32 bit field): 0 630,684, 1 2 |
| 0x8 | 1 | u8 | pointer tag | Observed | a pointer field not in the class list (03 = null on all read) |
| 0x9 | 8 | bytes | unaccounted | Unknown | zero (0000000000000000 630,686) |
| 0x11 | 8 | u64 | VisualShaderConstants: object id | Observed | 0 on all |
| 0x19 | 4 | u32 = 0xBFF5DF99 | VisualShaderConstants: class id | Observed | = 0xBFF5DF99 |
| 0x1D | 4 | u32 | DataLayout | Observed | 0 Default, 1 UI, 2 Skin; values 3 and 4 correspond to Gear and Material views. |
| 0x21 | 8 | u64 | DefaultLayout: object id | Observed | 0 |
| 0x29 | 4 | u32 = 0xD74FA591 | DefaultLayout: class id | Observed | = 0xD74FA591 (no stored fields) |
| 0x2D | 8 | u64 | UILayout: object id | Observed | 0 |
| 0x35 | 4 | u32 = 0x9FAF160F | UILayout: class id | Observed | = 0x9FAF160F (no stored fields) |
| 0x39 | 8 | u64 | SkinLayout: object id | Observed | 0 |
| 0x41 | 4 | u32 = 0x605001B7 | SkinLayout: class id | Observed | = 0x605001B7 (no stored fields) |
| 0x45 | 8 | u64 | 62FA1E14 (GearLayout): object id | Unknown | 0 |
| 0x4D | 4 | u32 = 0xF54C16B8 | GearLayout: class id | Observed | = 0xF54C16B8 (no stored fields) |
| 0x51 | 8 | u64 | 2C2D56DE (MaterialLayout): object id | Unknown | 0 |
| 0x59 | 4 | u32 = 0xF977AE02 | MaterialLayout: class id | Observed | = 0xF977AE02 (no stored fields) |
| 0x5D | 16 | u32·4 | VisualShaderConstants data, first 16 bytes | Observed | View selected by DataLayout; exact material-view channel mapping unresolved. |
| 0x6D | 16 | f32·4 | VisualShaderConstants data, last 16 bytes | Observed | Four f32 values; usually (1, 1, 1, 1) in DefaultLayout. |
Registry names and sampled values identify the views, but the material view’s exact channel meanings and non-null optional-pointer variants remain incomplete. Unknown
Shaun White Skateboarding
Section titled “Shaun White Skateboarding”only in SWS
A Visual component shows one object. In level 01 the shown object is a Mesh on 3,587 Visuals, a LODSelector on 200, a ParticleSystem on 122, an OmniLight on 110, a SpotLight on 79, a RealTreeMesh on 30, an object of class 0xC3120087 on 20 and a DynamicMesh on 7; a further 3,021 name objects of other cells or entries. Of 6,861 entities, 5,797 have at least one Visual. Observed · level 01
A Visual is [component base object][InstanceData pointer][44 unnamed bytes]. The instance data is one of the following. Observed
| Instance data | Layout | Confidence |
|---|---|---|
MeshInstanceData (0x536E963B) |
[Mesh pointer, external][PRT id][n x inline pointer to SubMeshInstanceData {SubMesh link, AO id}][inline pointer to CompiledMeshInstance] |
Observed |
CompiledMeshInstance |
[Data byte array][u32 21][u32 32][u64 hash][u32 key] |
Observed |
LightInstance |
[Light pointer, external][Flare: LightFlare] |
Observed |
LODSelectorInstance |
as in Assassin’s Creed II | Inferred |
The Mesh pointer of a MeshInstanceData is always external and the SubMesh pointer is always a link. Observed
Little-endian. Exact on 221 of 221 selectors of level 01.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 9 | bytes | managed byte, id, class | Observed | |
| 0x9 | 4 | u32 | Category | Observed | enum |
| 0xD | 1 | u8 | Generated | Observed | |
| 0xE | 85 | LODDescriptor[5] | slots | Observed | per slot, 17 bytes: 8 bytes before the object id (first slot's object id is at byte 22 of the body), u32 object id, f32 SwitchDistance, u8 flag |
| 0x63 | 1 | u8 | trailing byte | Unknown |
Slot 0 is LOD 0: vertex counts fall with the slot index in 214 of the 214 selectors that reach two or more known meshes. An object id of 0 marks an unused slot. The switch distances are not monotonic across the slots. Observed · level 01