← 1.20 ReplayEntropic Dev

REPLAY 1.20 · RESEARCH NOTES

The asset brain

A linked map of loading, rendering, and collision evidence.

34 notes · Latest source update
SOURCE NOTE · Updated 2026-09-28 09:56:08 UTC
On this page

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.