Files
BT411/context/rendering.md
T
arcattackandClaude Opus 4.8 f914fc040a context-system: complete migration -> CLAUDE.md is now a 160-line router (zero context lost)
Full migration of the 2236-line monolithic CLAUDE.md into the progressive-context
knowledge graph (per spark-lesson / expert-seed.md), so the deep RE knowledge loads
on-demand instead of every session.

ZERO CONTEXT LOST:
- docs/PROGRESS_LOG.md = the complete old CLAUDE.md, VERBATIM (byte-identical) -- the
  lossless safety net + the "full detail" quick-lookup fallback.
- 18 context/*.md topic files (1343 lines) digest every section (§1-3 -> project-overview,
  §4 -> content-archives, §5 -> asset-formats/bgf-format, §5a -> source-completeness,
  §5b/§8 -> wintesla-port, §7/§10 -> locomotion, §10a -> build-and-run, §10b ->
  reconstruction-method, §10c -> combat-damage + reconstruction-gotchas, §10d -> subsystems,
  render notes -> rendering, gauges -> gauges-hud, MP -> multiplayer, §9 -> open-questions).
- reference/glossary.yaml (53 terms). decomp-reference.md = the offsets/ClassIDs/addresses hub.

CLAUDE.md (160 lines) = router: identity, answer/reason protocols, quick-lookup table,
evidence tiers (T0 engine-truth / T1 decompiled+verified / T2 reconstructed+runtime /
T3 guarded / T4 hypothesis), conventions + DO-NOT (the systemic bug classes), structure.
Retains the load-bearing work directives (build recipe pointer, "keep current" mandate).

Knowledge graph validates CLEAN (scratchpad/checkctx.py -- all [[links]] + quick-lookup +
docs refs resolve; [[name]] -> topic file or glossary term). docs/*.md ledgers stay as the
detailed logs; context/*.md are the curated digests that route into them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 22:19:50 -05:00

4.9 KiB
Raw Blame History

id, title, status, source_sections, related_topics, key_terms, open_questions
id title status source_sections related_topics key_terms open_questions
rendering Rendering — the D3D9 pipeline, materials, sky, beams, performance established PROGRESS_LOG.md §10 (render-fidelity notes); docs/BGF_FORMAT.md
bgf-format
asset-formats
wintesla-port
locomotion
pod-hardware
L4D3D
material-ramp
BSL
LOD
DPL
beam
Replacement-LOD for NON-additive multi-LOD models; day/night material path priority (BT_MATPRI)

Rendering

The port renders via the WinTesla L4D3D/L4VIDEO Direct3D9 path (wintesla-port), carrying our BT loader (bgfload.cpp) + fidelity work. The goal: match the authentic pod footage. Geometry/LOD mechanics are in bgf-format; this topic covers the D3D9 draw path + the fidelity fixes. Full detail: docs/PROGRESS_LOG.md §10.

The IG-board shading model (from libDPL DPLTYPES.H)

Shading is selected PER-GEOMETRY by vertex type: no-normal geometry (terrain/mesas/sky/buildings/ mech — WHITE baked verts) is UNLIT, colorized by the material's 2-endpoint material-ramp (dpl_SetMaterialRamp — texture luminance indexes a low→high gradient); normal-bearing geometry (~150 vehicle/missile files) is LIT by the map light. Applying the ramp to lit geometry = the "dusty white blobs" bug (gate on hasNormals). [T2]

The big render-fidelity fixes (dbase/desert matched to pod footage)

  • Geometry: CONN is a flat trilist (not fan); CONN+PCONN coexist — see bgf-format. Malformed fan-garbage was the "faceted mountains" bug. [T2]
  • RAMP colorize (default-on BT_RAMP) + day/night material priority (default-on BT_MATPRI for the ramps): the mat\day libs carry the warm ramps; the generic GEO libs are gray. Terrain/mesas render warm tan; the sky's dsky_mtl ramp (0→0.99) gives bright clouds. hasNormals gate keeps vehicles LIT (colored trucks). Ramp tint rule: explicit diffuse + NEUTRAL ramp ⇒ tint; coloured ramp ⇒ white. [T2]
  • Sky: a *sky.bgf dome/plane drawn in a dedicated fullbright PASS_SKY (LIGHTING off, extended far=9000 + world fog); tagged drawAsSky at load (the .x sidecar path doesn't exist). [T2]
  • The env pipeline (DPLReadEnvironmentDPLReadINIPage, reads content/BTDPL.INI via L4DPLCFG): resolves map+time → clip/fog/ambient + a directional sun. Bring-up stubs (EnsureValidProjection / per-frame ambient / uninit cloud colours) had clobbered it — now they RE-ASSERT the env values. Debug: copy BTDPL.INI → *DBG.INI with debug=True. [T2]

Backface culling (default CW, BT_CULL)

The bring-up D3DCULL_NONE drew interior/back faces (the "dark wedge" shapes = mesh insides). CW is correct for the BGF quad triangulation [a b c][a c d]. [T2]

LODs (default: shipping-engine first-LOD + ADDITIVE_LODS; BT_ADDLOD/BT_LOD_SCALE/BT_PUNCH)

See bgf-format for the √3 range decode, the ADDITIVE_LODS cumulative rule, PUNCH cutouts, and the coplanar-shell submission-order depth bias. Replacement LOD selection for NON-additive multi-LOD models is deferred (needs the board's hot-spot semantics). [T2]

Mech skins (BSL bit-slice — the rainbow-mech fix)

.BSL is a bit-sliced container (6 grayscale sub-images per file); the BMF 0x18 BITSLICE tag picks the slice. Reading it as RGB overlaid 2-3 gray sheets = the "rainbow/graffiti" bug. Fixed: image.cpp decodeBSL slice-decodes; bgfload threads the 0x18 channel; a cross-library RAMP registry resolves the mech-skin softer ramp (defined in OTHER libs). Every mech renders authentic gray-metal paint now. See asset-formats. [T2]

Weapon beams (the unported dpl_* layer)

The dpl_* beam renderable was never ported → beams are drawn by BTPushBeam/BTDrawBeams (L4VIDEO). The real look is the ermlaser.bgf TUBE (native Z 0..2000, UVs tiled) with the scrolling bexp grit texture (from the .VMF SCROLL). ER lasers red, PPC blue, standard yellow. The beam origin re-anchors to the live muzzle every frame (can't run out from under your own beam). See combat-damage for fire-rate/muzzle. [T2]

Performance — the 10fps→60fps fix (~50-80× render speedup)

The 10fps baseline had THREE stacked causes, all fixed (engine tree): (1) D3DCREATE_SOFTWARE_ VERTEXPROCESSING — every vertex transformed+lit on the CPU → HARDWARE first; (2) D3DX DrawSubset attribute-table scan (our double-sided tris broke OptimizeInplace) → explicit SetAttributeTable + direct DrawIndexedPrimitive; (3) no frustum culling → bounding-sphere culling per frame. ⚠ LESSON: the user plays the DEBUG build, but the 10fps was NOT the debug build (RelWithDebInfo identical) — split draw-vs-present + check the DEVICE flags before blaming the compiler. Diagnostics kept: [spike]/[loadobj]/[rstat]. [T2]

Key Relationships