Umbra and Culling
Asset brain · Engine Integration · GfxWorld and Brush Models
Status
Umbra asset roots and culling consumers remain unmapped, but one worker-task initializer now has a provisional source/Replay role match. Replay ID 563 is q_s_workerCmdUmbraCullGlass_Init; this identifies the task-registration wrapper, not an Umbra asset schema or culling callback implementation.
Available evidence
The project’s renderer candidate scan includes R_Umbra_SetAllVisible as a held candidate because the corresponding source PDB start does not provide a unique exact identity. That candidate should not be promoted from name similarity alone. GfxWorld and transient-zone reports provide adjacent map-root context, but do not establish Umbra hierarchy, visibility-cell serialization, or culling runtime behavior.
Integration and safe use
Umbra/culling data belongs in the native visibility pipeline. A ZoneTool reconstruction needs exact asset roots, serialized bounds, visibility-cell/reference arrays, and the renderer consumer that reads them. No hook-based rendering workaround is appropriate for the conversion goal.
Open questions
- Identify exact source PDB symbols for Umbra asset roots and visibility consumers.
- Find Replay root dispatch, target function boundaries, and direct table/caller evidence.
- Separate serialized visibility data from runtime culling structures.
Evidence
- Renderer function candidate scan
- GfxWorld transient-zone root
DPVS visibility data now cross-referenced
Static/dynamic DPVS loader accesses now have paired Game-Test PDB member and Replay access evidence. The static data includes SModel/surface visibility pointer arrays and primary-light, probe, volumetric, decal, sorted-index, and sun-shadow fields. Dynamic data includes two-entry client word-count/cell-bit arrays and a 33-by-2 visibility pointer family. See GfxWorld and Brush Models for offsets, type mismatches, Postload children, and evidence links.
This narrows the visibility-data loader map but does not establish Umbra asset roots or prove that DPVS and Umbra are the same subsystem. Keep R_Umbra_SetAllVisible on hold until exact source identity and Replay target ownership are demonstrated.
Glass worker-task initializer — provisional role only
Replay ID 563 at RVA 0x3453B0 is now q_s_workerCmdUmbraCullGlass_Init, paired provisionally with Game-Test source static initializer PDB/Atlas ID 57427 at RVA 0xFC5F0. The Replay wrapper owns the unique UmbraCullGlass string, registers the exact named WorkerCmdUmbraCullGlass::ShouldWait callback ID 36279, passes a second callback pointer, and calls shared helper ID 36143 with the task value 0x3F. Source initializer ID 57427 calls Sys_InitWorkerCmd<UmbraCullGlassCmd,1> (source ID 57253). This supports a task/initializer-role identity; the source template body and Replay shared-helper decomposition differ, so retain q_.
Replay ID 36143 (sub_1412CA690) is a shared registration helper and is not the glass-specific source template by direct-name equivalence. The second callback pointer, sub_14180E3C0, remains unresolved. Do not assign it an Umbra culling implementation name from this registration alone. Replay ID 563 preserves size 59 and prototype __int64 sub_1403453B0(); source initializer extent is 71 bytes. No ABI, enum/task-slot mapping, layout, or serialized asset inference applies. In particular, Replay task value 0x3F is build-local and is not a transferred source enum value.
Evidence: worker initializer and callback review and guarded applied-name manifest.