Asset System Overview
Asset brain · Engine Integration · Map Asset Integration · GfxWorld and Brush Models · XModels and Surfaces · SModels · CModels and Clipmaps · Materials, Techsets, and Glass · Lighting, Light Grids, and Shadows · Umbra and Culling · Animations · Transient Zones
Purpose and confidence boundary
This page is a broad index to the map-related asset families and their reviewed integration evidence. It identifies which function/type/pool links are supported, which links remain candidates, and where the current vault has no mapping. It is not a complete ZoneTool schema or a runtime trace.
- Game-Test source:
E:\1-game-test\1-game_test.exe, SHA-256269D6137A465DA9D5F5DF68961000D683B9A868FDE5E7800743177C05D059E99. - Replay 1.20 executable:
E:\IW8\Builds\1.20-replay\game_dx12_ship_replay.exe, SHA-25668FB1CBCB2924182724004039DE55A4C50152BB6561803C4898B7930B38132F0. - Replay SQLite:
E:\IW8\Builds\1.20-replay\game_dx12_ship_replay.exe.sqlite; its recorded program MD5 is1C238FE327F2ECC3B0DB924C5B425439, not the executable hash.
An exact name can identify a function while its type meaning is unsettled; a type/pool table can identify an asset class while its stream layout is unknown; and parser code can establish reads without proving a live renderer/physics consumer. Keep those evidence layers distinct.
System route
For the evidence-backed cross-family graph, see Map Asset Integration.
XAssetHeader phase dispatch (Load / Preload / Postload / Mark)
-> build-specific type case and pointer wrapper
-> root loader/postloader and nested pointer/stream work
-> registration callback / DB_AddXAsset / asset pool metadata
-> zone-name and transient-zone selection/lifetime code
-> native render, animation, or collision consumers
The full arrow chain is not verified for every asset. The GfxWorld transient-zone path is the best joined static example: Load_XAssetHeader → GfxWorld pointer/root → GfxWorldDraw pointer array → transient-zone pointer/root → Replay type-0x20 registration/pool and deferred-release callback. Even there, the chain combines callsites, type tables, and lifetime code; it does not prove a game ran the path. The central evidence and caveats are in Engine Integration and Transient Zones.
Cross-build type-index anchors
| Asset family | Game-Test source type/case | Replay type/case | Evidence and limitation |
|---|---|---|---|
| GfxWorld | 0x1B |
0x1F |
Load pointer/root and Load_GfxWorldAsset routes; do not copy numeric enum values or source layout. |
| GfxWorld transient zone | 0x1C |
0x20 (gfx_map_trzone) |
GfxWorld child consumer, pool name/size, registration argument, and deferred release align. Replay type 0x1C is TacGraph. |
| XModel | 0x09 |
0x09 |
Matching phase dispatch and exact root routes; equal case is local to these two verified dispatchers, not a universal rule. |
| XModelSurfs | 0x08 |
0x08 |
Pointer/helper route is mapped; Replay Postload pointer helper remains generic and pointee layout is open. |
| GlassWorld | 0x15 |
0x19 |
Asset callback body and AddXAsset/PostAddXAsset flow align; Mark type mapping is held. |
| MaterialTechniqueSet | 0x0E |
0x12 (techset) |
Exact 46-byte handler and pool identity; adjacent Replay 0x0E is vertexshader, whose source/owner mapping remains q/held. |
| SModel placement, CModel/clipMap, Umbra | Not assigned here | Not assigned here | Do not derive type IDs from neighboring cases, family names, DPVS, or collision child calls. |
These are function/registration identity observations, not serialized structure layouts. Evidence includes the XAssetHeader phase crosswalk, GfxWorld type-index evidence, GfxWorld transient-zone type/pool analysis, GlassWorld handler review, and techset/vertex-shader owner resolution.
Family map
| Family | Source ↔ Replay anchors | What is linked to registration or consumers | Confidence / open boundary |
|---|---|---|---|
| GfxWorld | Game-Test exact Load/Preload/Postload roots; Replay Load_GfxWorld ID 18182, Load_GfxWorldPtr ID 18189, Load_GfxWorldAsset ID 24711; Mark chain: ID 18268 Mark_GfxWorldPtr → root ID 18266 Mark_GfxWorld with child ID 18265 Mark_GfxPrecomputedSkyIllumination → asset leaf ID 24825 Mark_GfxWorldAsset. q_Postload_GfxWorld ID 18328 and pointer ID 18335. Replay ID 18181 q_Load_GfxVoxelTreeArray ↔ source array ID 7302; false imported Load_GfxVoxelTree label on ID 10689 was cleared to sub_1405425E0. |
Replay type 0x1F; root reaches mapped draw, DPVS, static-model, brush, lighting, transient, voxel-array and related render children. The pointer/root/asset-helper order is paired; root child identity is partly unresolved, and source PtrArray has no established Replay counterpart. Root PDATA is 691 bytes versus stored size 688. |
Strong static dispatch/root route; incomplete root schema and caller coverage. ID 18181 SQLite size 70 remains distinct from its 599-byte IDA/PDATA extent; source/Replay element strides differ. Mark immediates are build-local. See GfxWorld and Brush Models. |
| XModels / XModelSurfs | Replay q roots: ID 20329 q_Load_XModel, 20368 q_Preload_XModel, 20357 q_Postload_XModel; Load_XModelSurfsPtr ID 20337 → Load_XModelSurfs ID 20336 → q_Load_XSurface ID 20339. Subdivision child ID 20342 q_Load_XSurfaceSubdivLevelArray ↔ source array PDB ID 24866. Mark phase: Replay ID 20351 Mark_XModelPtrArray ↔ source ID 25025, anchored by paired Mark_ScriptableDef (+0xAE) and Mark_WeaponAttachment (+0xC4/+0xF2) callers; Replay PDATA 176 B vs SQLite 172 B. |
XAssetHeader cases 9 (XModel) and 8 (surfaces); the XModelSurfs loop calls scalar XSurface; subdivision source parent calls a scalar child while Replay parent calls a counted array child. Replay subdivision count loop advances by target-local 0x238; source array wrapper uses 0x128. | Names/roles remain q-qualified; source/Replay stride and child granularity differ. Replay ID20342 has 810-byte size across three PDATA fragments; body score is weak. XSurface caller coverage remains unresolved (source five direct callers; Replay export one while indegree says 81). No layout transfer; DObj/render chain remains open. See XModels and Surfaces and XModel Fastfile to DObj Flow. |
| SModels | ClipMap static-collision source PDB list/model IDs 21538/21536 → Replay q IDs 20052/20051 under Load_clipMap_t ID 20057; collision-tile lifecycle q IDs 39071/39074/39075/39097. Render: Replay ID 50616 q_R_AddAllStaticModelSurfacesSunShadow ↔ source PDB ID 87368, anchored by callback string/pointer registration; child ID 50625 q_R_EmitSingleSModelSurf. |
ID 50616 has transformed helper flow; its chained PDATA totals 288 bytes vs SQLite size 285. IDs 50617 (camera-only source candidate conflicts with SunShadow parent) and 50614 remain held. GfxWorld DPVS visibility metadata remains separate. | Do not merge collision, visibility, and placement/draw data. q retained for body/prototype/helper-decomposition differences; the full placement/render representation remains open. See SModels and CModels and Clipmaps. |
| CModels / clipMaps | Source Load_clipMap_t ID 21575 and Replay Load_clipMap_t ID 20057; child list/model candidates above. StaticModels collision-tile source PDB anchors map provisionally to Replay q IDs 39071/39074/39075/39097. Source Postload list PDB ID 22263 has no resolved separate Replay child. |
Replay DB_ReleaseClipMap ID 24635 calls stored WorldCollision_RemoveClipMap ID 40587; separate StaticModels child routes cover shape creation/destruction and zone-index cleanup. |
Load parser chain supported; collision-tile names are qualified, not layout or ABI proof; postload and runtime field semantics held. No direct path yet joins serialized PhysicsAsset references to a runtime consumer. See CModels and Clipmaps. |
| Materials / techsets | Replay Load chain IDs 20036 Load_MaterialTechniqueSetPtr → 20035 Load_MaterialTechniqueSet → 20034 Load_MaterialTechniquePtr → 20033 Load_MaterialTechnique, plus asset ID 24731. Mark leaves: 20092 Mark_MaterialTechniqueSetPtr, 24844 Mark_MaterialTechniqueSetAsset, 24824 Mark_GfxImageAsset, 24822 Mark_GfxDecalVolumeMask. |
Source/Replay parent-child routes support these function roles; source/Replay helper immediates are build-local (0x0E/0x12, 0x0F/0x13, 0x6C/0x70 as applicable). |
Names are reviewed/applied; caller coverage, payload, and dependency traversal remain open. Type values, ABI, and layout do not transfer. Replay q_Mark_Material remains separate; ID 20094 stays generic. See Materials, Techsets, and Glass. |
| GlassWorld | Source/Replay Load_GlassWorldAsset; Replay ID 24713 at 0xF61410, 46 bytes. |
Handler body and AddXAsset/PostAddXAsset flow match; source type 0x15, Replay 0x19. |
Strong static handler correspondence; Mark mapping held; payload layout not established. |
| Lighting / light grids / shadows | Replay ID 18172 Load_GfxLightAABB at 0xD92480 ↔ exact source PDB; q loader ID 18170 q_Load_GfxGpuLightGridTransientData; q lightmap/light-grid atlas pointer routes. DPVS static/dynamic/planes IDs 18185/18183/18184. |
Load_GfxWorld calls the light-AABB child between shadow geometry and DPVS static in both builds; sizes are 185 Replay / 192 source bytes. |
One child loader identity is confirmed; array children, full payload, field offsets, and layout remain build-specific or unresolved. See GfxWorld and Brush Models and Lighting, Light Grids, and Shadows. |
| Brush models | Replay Load_GfxBrushModelArray ID 18923 at 0xDD1750; source and Replay reports identify two parent routes. |
GfxWorld and AddonMapEnts parent paths reach the array loader; observed stride is 96 bytes. | Strong static loader role; stride does not alone prove serialized ABI. See GfxWorld and Brush Models. |
| Umbra / culling | Replay ID 563 q_s_workerCmdUmbraCullGlass_Init ↔ source static initializer ID 57427 for s_workerCmdUmbraCullGlass; Replay task string and named ShouldWait callback support a provisional task/role match. |
ID 36143 is a shared registration helper; second callback sub_14180E3C0 remains unresolved. DPVS visibility data under GfxWorld is adjacent, not an Umbra mapping. |
No Umbra asset root or culling implementation is resolved. The initializer name does not establish callback identity, ABI, enum, layout, or serialized asset schema. R_Umbra_SetAllVisible remains held. See Umbra and Culling. |
| Animations | Source PDB Load_XAnimDynamicBoneNoiseProperties RVA 0x62F6F0 → Replay q ID 18947 at 0xDD2B20. |
Reached within XAnim dynamic-bone property loading; does not establish the runtime suit animation helpers as loader/schema functions. | Strong body/parent role with extent caveat (Replay .pdata 197 bytes vs SQLite/source size 190); serialized child schema and runtime consumers remain open. See Animations. |
| Transient zones | Load roots/ptr: Replay IDs 18190/18191. Postload roots/ptr: IDs 19645 Postload_GfxWorldTransientZone and 19646 Postload_GfxWorldTransientZonePtr; paired source PDB identities. Neighbor parser child: ID 20405 Load_TransientSets under q_Load_TransientInfo, XAssetHeader case source 0x3F / Replay 0x43. |
Replay type 0x20 pool gfx_map_trzone, size 0x148; type-0x20 release slot reaches deferred-zone callback ID 24649. Postload case 0x1C is paired dispatch evidence; TransientSets is a separate parser path. |
Postload names and TransientSets name are statically supported; caller coverage and layouts remain build-specific. Do not merge case/type values or identify TransientSets with the GfxWorld type-0x20 asset. No live activation trace. See Transient Zones. |
Relationship ledger: proven links versus hypotheses
Directly supported static links in the reviewed corpus:
- XAssetHeader phase dispatch → specific pointer wrapper where the case and call target were verified by bytes.
- GfxWorld pointer → asset callback/root; GfxWorld root → mapped children; GfxWorldDraw → the 0x600 transient-zone pointer array → transient-zone root.
DB_ReleaseXAssetReplay type0x20→ deferred-zone release callback.DB_ReleaseClipMap→ stored Replay world-collision cleanup row; the source-name identity for that cleanup row remains uncertain.- XModel pointer/surface loader calls and selected Map/World parent routes documented in XModel Fastfile to DObj Flow.
Still hypotheses or gaps:
- Converting source PDB UDT members, source pointer sentinels, or source numeric type IDs into Replay ABI or serialized file offsets.
- Assuming a handler with a matching name is the corresponding registration slot when pool/type metadata conflicts.
- Joining CModel static-collision child parsing directly to runtime WorldCollision/PhysicsAsset consumption.
- Identifying actual SModel placement data from collision records or DPVS visibility arrays.
- Joining XModelSurfs loader output to a specific Replay DObj/render submission function.
- Treating a static function/table route as proof of live loading, zone activation, rendering, animation, or collision.
Navigation and evidence
Start with Engine Integration for system ordering and evidence rules. The asset-family pages above link the exact source/Replay reports and target rows for each domain. For current symbol methodology and review history, see the mapping guide, symbol register, and handler conflict review.
StaticModels collision-tile proposals and their q-prefixed status are documented in CModels and Clipmaps and Transient Zones; see the linked reports/manifests there for exact paired routes and extent caveats.