Materials, Techsets, and Glass
Asset brain · Engine Integration · Asset System Overview · GfxWorld and Brush Models
Status
GlassWorld Load/Preload/Postload pointer-wrapper names are resolved to exact source PDB identities and current Replay rows. Source case 0x15 maps to Replay case/type 0x19, whose pool name is glass_map and element size is 0x10. This supports asset-family identity; it does not transfer enum values or establish shared ABI, serialized layout, or live rendering behavior. Replay ID 20036 Load_MaterialTechniqueSetPtr also has an exact source PDB and paired parent/child Load routes; array/stream coverage and payload layout remain open. Material marking remains q-prefixed.
GlassWorld build provenance
- Game-Test source:
E:\1-game-test\1-game_test.exe, SHA-256269D6137A465DA9D5F5DF68961000D683B9A868FDE5E7800743177C05D059E99. - Replay target:
E:\IW8\Builds\1.20-replay\game_dx12_ship_replay.exe, SHA-25668FB1CBCB2924182724004039DE55A4C50152BB6561803C4898B7930B38132F0. - Replay analysis database:
game_dx12_ship_replay.exe.sqlite; recorded program MD51C238FE327F2ECC3B0DB924C5B425439identifies the database input, not the executable.
GlassWorld phase dispatch
Exact Game-Test source dispatchers call the phase pointer wrappers on case 0x15. The corresponding Replay dispatchers call the wrappers on type/case 0x19. Replay's type-0x19 pool table entry is named glass_map, with element size 0x10.
| Phase | Game-Test case and callsite → exact PDB pointer wrapper | Replay case and callsite → resolved target row |
|---|---|---|
| Load | 0x15; Load_XAssetHeader call at 0x5BAC44 → Load_GlassWorldPtr source RVA 0x71BEF0 |
0x19; Replay Load_XAssetHeader ID 18573 call at 0xDBE134 → ID 19554, RVA 0xDF3290, Load_GlassWorldPtr |
| Preload | 0x15; Preload_XAssetHeader call at 0x5EE574 → Preload_GlassWorldPtr source RVA 0x759E80 |
0x19; Replay Preload_XAssetHeader ID 18730 call at 0xDCC444 → ID 19677, RVA 0xDFAAA0, Preload_GlassWorldPtr |
| Postload | 0x15; Postload_XAssetHeader call at 0x5D7D34 → Postload_GlassWorldPtr source RVA 0x745760 |
0x19; Replay Postload_XAssetHeader ID 18669 call at 0xDC6A64 → ID 19628, RVA 0xDF7750, Postload_GlassWorldPtr |
The cases are local observations from each build and are not interchangeable type IDs. The GlassWorld family association is independently supported by the pointer wrappers' phase-root calls and the Replay pool row. A pool element size of 0x10 is not by itself proof of serialized root layout.
Pointer wrapper rows and complete .pdata chains
The source PDB extents and Replay SQLite sizes match the total bytes in each image's complete chained .pdata range. Replay sizes and prototypes remain as stored.
| Phase | Source PDB function extent | Source .pdata chain (RVA, exclusive end) |
Replay row, SQLite size / full .pdata extent |
Replay .pdata chain (RVA, exclusive end) |
|---|---|---|---|---|
| Load | Load_GlassWorldPtr, 0x71BEF0, 246 bytes |
[0x71BEF0,0x71BF57); [0x71BF57,0x71BFC1); [0x71BFC1,0x71BFD2); [0x71BFD2,0x71BFE6) — 4 chained entries, total 246 |
ID 19554 Load_GlassWorldPtr, 239 / 239 bytes |
[0xDF3290,0xDF32F7); [0xDF32F7,0xDF335A); [0xDF335A,0xDF336B); [0xDF336B,0xDF337F) — 4 chained entries, total 239 |
| Preload | Preload_GlassWorldPtr, 0x759E80, 168 bytes |
[0x759E80,0x759ECA); [0x759ECA,0x759F19); [0x759F19,0x759F28) — 3 chained entries, total 168 |
ID 19677 Preload_GlassWorldPtr, 161 / 161 bytes |
[0xDFAAA0,0xDFAAEA); [0xDFAAEA,0xDFAB32); [0xDFAB32,0xDFAB41) — 3 chained entries, total 161 |
| Postload | Postload_GlassWorldPtr, 0x745760, 264 bytes |
[0x745760,0x7457E0); [0x7457E0,0x745843); [0x745843,0x745868) — 3 chained entries, total 264 |
ID 19628 Postload_GlassWorldPtr, 234 / 234 bytes |
[0xDF7750,0xDF77B2); [0xDF77B2,0xDF7815); [0xDF7815,0xDF7826); [0xDF7826,0xDF783A) — 4 chained entries, total 234 |
The wrapper DBStreamStart argument role is paired positionally in each phase, but these observations do not establish identical prototypes, register widths, stream semantics, pointer fields, or object layouts.
Direct root and asset-helper routes
| Phase | Game-Test source route | Replay route |
|---|---|---|
| Load | Load_GlassWorldPtr calls exact PDB Load_GlassWorld RVA 0x71BCD0 at 0x71BFA3 (through a linker stub), then Load_GlassWorldAsset RVA 0xC0F020 at 0x71BFAB (through a linker stub). |
ID 19554 calls root ID 19553 Load_GlassWorld RVA 0xDF31E0 at 0xDF333C, then asset helper ID 24713 Load_GlassWorldAsset RVA 0xF61410 at 0xDF3344. |
| Preload | Preload_GlassWorldPtr calls exact PDB Preload_GlassWorld RVA 0x759C90 at 0x759F02 (through a linker stub). |
ID 19677 calls root ID 19676 Preload_GlassWorld RVA 0xDFAA00 at 0xDFAB1B. No asset-registration helper is shown on this Preload route. |
| Postload | Postload_GlassWorldPtr calls exact PDB Postload_GlassWorld RVA 0x745520 at 0x745825 (through a linker stub), then Load_GlassWorldAsset RVA 0xC0F020 at 0x74582D (through a linker stub). |
ID 19628 calls root ID 19627 q_Postload_GlassWorld RVA 0xDF76A0 at 0xDF77F7, then helper ID 24713 Load_GlassWorldAsset RVA 0xF61410 at 0xDF77FF. |
The separately named Load_GlassWorldAsset handler is an exact 46-byte source/Replay match by PDB start, body shape, .pdata, and AddXAsset/PostAddXAsset argument/result flow. It registers source type 0x15 and Replay type 0x19. Replay Postload's root remains q-prefixed; resolving the pointer-wrapper name does not silently resolve every nested root.
Confidence: name, type/pool, and layout
- Function-name identity — strong static match. Three exact source PDB starts are selected from the corresponding source phase dispatchers. The paired Replay dispatchers call the exact rows; the rows have complete
.pdatachains and phase-appropriate root calls. Source and Replay extents differ by phase and remain distinct. - GlassWorld type/pool association — strong static family evidence. Source case/type
0x15and Replay case/type0x19lead through the Load/Preload/Postload wrappers to GlassWorld phase roots. Replay's pool table independently names type0x19glass_mapand reports element size0x10. Do not reuse numeric type0x15or0x19across builds. - Schema, serialized layout, and ABI — not established. The root
0x10stream/pool size and wrapper call sequence do not reveal the complete GlassWorld payload, all pointer fixups, or equivalent field offsets. Source and Replay argument types/prototypes are not presumed identical. - Runtime behavior — not established. Static registration calls and handler structure do not prove that a map loaded or that GlassWorld data reached a live renderer.
Materials and techsets
The source PDB identifies exact Mark_Material at RVA 0x8041E0 (256 bytes), with named source Handle and HandleArray parent paths. Replay q_Mark_Material at RVA 0xE11430 remains a candidate based on the source pointer graph and generic array loop. This does not establish the material or techset file layout.
Replay ID 24731 at RVA 0xF61780 is Load_MaterialTechniqueSetAsset, size 46. Its exact Game-Test PDB counterpart starts at RVA 0xC0F3C0; source and Replay .pdata extents are both 46 bytes, with a matching AddXAsset/PostAddXAsset wrapper sequence. Source type immediate is 0x0E; Replay uses 0x12. Replay pool metadata identifies type 0x12 as techset and type 0x0E as vertexshader. The adjacent row ID 24732/RVA 0xF617B0 is q_Load_VertexShaderAsset; its source/owner chain remains disputed. Keep the immediates build-specific and do not infer asset payload ABI from handler identity.
MaterialTechniqueSet pointer Load route
Replay ID 20036 at RVA 0xE0D400 is now named Load_MaterialTechniqueSetPtr, paired with exact Game-Test PDB ID 21323 at RVA 0x7CFAA0. The source PDB extent is 246 bytes; the four chained source .pdata entries cover [0x7CFAA0,0x7CFB96). Replay's four chained entries cover [0xE0D400,0xE0D4EF), exactly 239 bytes, matching the existing SQLite size=239. The Replay prototype remains __int64 __fastcall sub_140E0D400(__int64 a1); it was not changed.
Two independent parent routes call the paired wrapper: Load_Material in each build and Load_XAssetHeader in each build. The paired wrapper then calls the corresponding Load_MaterialTechniqueSet root and Load_MaterialTechniqueSetAsset helper in that order. This corroborates the pointer-loader name and role. The source helper uses type immediate 0x0E; Replay uses 0x12, which its pool table calls techset. These are per-build dispatch/pool values, not interchangeable asset type IDs.
This only documents the Load pointer-wrapper route. Array/Stream siblings and full phase/caller coverage remain unresolved. The report explicitly does not establish identical ABI, struct members, serialized layout, or live renderer behavior. The existing Load_MaterialTechniqueSetAsset mapping remains a separate 46-byte handler correspondence; it does not fill the unresolved array/stream coverage.
Evidence: pointer-loader cross-reference report, six positional/call-route observations, and apply/readback manifest. Earlier caller/boundary analysis: MaterialTechniqueSet follow-up.
MaterialTechnique scalar and pointer Load rows
The source PDB chain is Load_MaterialTechniqueSet ID 21321 → Load_MaterialTechniquePtr ID 21318 → Load_MaterialTechnique ID 21316; each source signature takes DBStreamStart. Replay now carries the corresponding names on IDs 20035 → 20034 → 20033, retaining prototypes void __fastcall sub_140E0D2A0(unsigned int a1), __int64 __fastcall sub_140E0D1E0(__int64 a1), and __int64 __fastcall sub_140E0CED0(__int64 a1) respectively. The parent/child chain is independently supported by direct source and Replay calls; the Replay Array/Stream caller routes are not established, so this name chain does not imply full caller coverage.
Replay ID 20033 has SQLite size 727 while its chained .pdata extent is 772 bytes; ID 20034 has size/extent 187 bytes. The parent ID 20035 has SQLite size 241 while .pdata totals 348 bytes. These metadata/extents stay as recorded. Source Load_MaterialTechnique PDB extent is 438 bytes and the source Load_MaterialTechniquePtr/Set extents are 198/348 bytes. These differing function extents, Replay prototypes, and source DBStreamStart signatures are not ABI or layout equivalence. Replay source/target technique data sizes and call structure differ; do not transfer offsets or serialized record sizes.
Evidence: Load-chain reassessment and caller/boundary report, applied adjacent-name review, and coordinator applied-name manifest.
MaterialTechniqueSet Mark routes
Replay ID 20092 is now Mark_MaterialTechniqueSetPtr, paired to unique source PDB ID 21797 (RVA 0x8050D0, 127 bytes; source signature int __cdecl Mark_MaterialTechniqueSetPtr(void)). Replay retains size 127 and prototype __int64 sub_140E11960(). Both complete bodies have matching 127-byte .pdata extents and the same helper/root call structure. Its paired direct parents include Mark_XAssetHeader and Mark_Material on both builds. Replay ID 24844 Mark_MaterialTechniqueSetAsset pairs with source PDB ID 36767 (source signature int __cdecl Mark_MaterialTechniqueSetAsset(MaterialTechniqueSet *, int)) as a 16-byte leaf wrapper; both route to the corresponding generic mark worker. Replay retains size 16 and prototype __int64 __fastcall sub_140F626B0(__int64 a1, unsigned int a2).
The source asset helper uses type immediate 0x0E; Replay uses 0x12. Those are build-specific values, consistent with the separately documented type shift, not transferable enum values. These names establish function roles only, not target/source ABI or material/techset layout. Nearby Replay ID 20094 remains the generic sub_140E11A60; its generated wrapper shape and case-0xE route do not uniquely identify it as this MaterialTechniqueSet handler. Replay q_Mark_Material is another distinct unresolved row.
Evidence: Mark MaterialTechniqueSet reassessment, applied-name manifest, and ID 20094 owner census hold.
Image and decal-mask Mark leaves
Replay image-data loader observations are separated under the GfxImage page; these Mark helpers establish reachability only and do not define the image payload format.
Replay ID 24824 is Mark_GfxImageAsset at RVA 0xF62570, size 16, with preserved prototype __int64 __fastcall sub_140F62570(__int64 a1, unsigned int a2). Its exact source helper is ID 36750 at RVA 0xC10D50, 16 bytes, signature int __cdecl Mark_GfxImageAsset(GfxImage *, int). Two exact parent pairs independently call it twice: source Mark_GfxImagePtr ID 26073/RVA 0x8F0EB0 ↔ Replay ID 20409/RVA 0xE313C0 (98 bytes), and source Mark_GfxImagePtrArray ID 26074/RVA 0x8F0F30 ↔ Replay ID 20410/RVA 0xE31430 (156 bytes). The source has additional AlwaysloadedFlags callers; Replay caller ID 20406 remains unmatched in this review.
Replay ID 24822 is Mark_GfxDecalVolumeMask at RVA 0xF62550, size 16, with preserved prototype __int64 __fastcall sub_140F62550(__int64 a1, unsigned int a2). The relevant source overload is the exact 16-byte helper ID 36748 at RVA 0xC10D10, signature Mark_GfxDecalVolumeMask(GfxDecalVolumeMask *, int), not the distinct 58-byte no-argument Mark_GfxDecalVolumeMask root at RVA 0x803110. The paired pointer parent is source Mark_GfxDecalVolumeMaskPtr ID 21747 (173 bytes) ↔ Replay ID 20077 at RVA 0xE10C70 (173 bytes); each calls its mask helper twice and then the named GfxImagePtr helper. The source has an additional PtrArray caller without an established Replay counterpart.
These Mark helper immediates are build-local: Mark_MaterialTechniqueSetAsset uses source/Replay 0x0E/0x12, Mark_GfxImageAsset uses 0x0F/0x13, and Mark_GfxDecalVolumeMask uses 0x6C/0x70. They tail-jump to build-local mark workers. Do not transfer type IDs, argument ABI, globals, image/mask layout, or serialized offsets. See the GfxImageAsset reassessment and manifest, plus the GfxDecalVolumeMask reassessment and manifest.
Integration and open questions
GlassWorld has a verified phase-dispatch and root/helper route. Material references also appear in world/model surface contexts, while techsets identify rendering programs/state; this page does not close those dependency routes or payload formats.
- Establish GlassWorld payload members, pointer fixups, and stream order from independent Replay accesses.
- Resolve
q_Mark_Materialand the GlassWorld Mark-type conflict independently; do not transfer Load/Preload/Postload routes into Mark handlers. - Find exact Replay techset roots and the material-to-techset dependency traversal.
- Link loaded GlassWorld contents to specific native renderer consumers before making runtime claims.
Evidence
- Coordinator GlassWorld pointer-phase result
- Pointer-phase observations
- Pointer-phase manifest and readback
- GlassWorld handler body review
- GlassWorld type-shift and pool evidence
- GlassWorld Mark-type conflict
- Material marking follow-up
- Material/techset owner-collision resolution