acdream/docs/plans
Erik 43e3abed4d fix(render): correct foliage-wind classification, receiver/caster desync, and frame binding (Campaign VM VM6 review)
Opus dual-lens review of the three VM6 commits (0930c35d, 39e8408c,
6cc5e183) found two blockers and two should-fix issues; all landed here
along with the review's nits and documentation corrections.

Blockers:
- A1: the procedural-scenery classifier tested bit 31 alone instead of
  the full top nibble (0xF000_0000 == 0x8000_0000), so it also matched
  LandblockStaticEntityIdAllocator's 0xC... namespace (fences/gates/
  building shells with a cutout subset), the 0xDA11_D0xx paperdoll id,
  and the 0xFFFF_FF01 portal-tunnel id as procedural scenery — all
  three would have swayed. ProceduralSceneryIdAllocator.IsInNamespace
  now does the exact top-nibble test; FoliageWindClassification
  delegates to it.
- A2: GroupKey (the receiver's instance-batching key) did not carry
  FoliageFlags while the caster's dedup key already did, so a scenery
  instance and a non-scenery instance sharing a mesh subset coalesced
  into one receiver InstanceGroup whose flags were last-writer-wins —
  disagreeing with the correctly-keyed caster. GroupKey now carries
  FoliageFlags, computed before key construction and set exactly once
  at group creation; the imperative re-stamp is gone, and CachedBatch's
  now-redundant FoliageFlags field is removed.

Should-fix:
- A3: the world receiver pass bound UniformAtmosphericFrame only by
  accident (leftover from the caster pass, which runs first each
  frame, since Vulkan binding state isn't reset between passes).
  DirectionalShadowFrameBinding now carries the caster's exact
  AtmosphericFrameBufferBinding and BindDirectionalShadowReceiver binds
  it explicitly.
- A4: a Setup-composed tree's opaque trunk part never got the trunk
  flag because HasCutoutSubset is cached per GfxObj part, not per
  entity. FoliageWindClassification.ComputeEntityHasCutoutSubset now
  ORs HasCutoutSubset across an entity's resolved sibling parts once
  per entity, threaded into ClassifyBatches/AddDirectionalShadowBatches
  via a new optional override parameter.

Nits: A5 hashes the per-vertex flutter seed relative to the instance
origin instead of absolute world XY (fp32 sin() precision loss at far
landblock corners), mirrored in both foliage_wind.glsl and
FoliageWindModel; A7 documents the max(maxHeight, 0.5) divide-guard as
a deliberate pseudocode divergence; A8 switches FoliageWindExclusions'
construction to ToFrozenSet() and softens the "never stale" doc
comment to "no slower than one frame behind."

Tests added: top-nibble classification (0xFFFFFFFFu now correctly
false), GroupKey inequality across entity-driven scenery/landblock-
static classification, a caster-batch test proving the same pairing
never coalesces, ComputeEntityHasCutoutSubset unit + end-to-end
two-part-Setup tests, the caster→receiver AtmosphericFrame binding
carry-through, flutter-hash translation invariance relative to
instance origin, and a Storm-wind mid-height displacement floor
guarding against a "no motion" regression.

Docs: plan VM6 body corrected to the five-row WeatherKind table, "bits
1 and 2", "all four" caster shaders, and top-nibble wording throughout;
the owner gate checklist's Rain/Storm step; the stale v1-only shader-
interface compatibility entry; semantic-bindings-v1.md's v2 members
folded into the main 192-byte block; the IA-25 register row's top-
nibble wording; AtmosphericFrameInputs.cs's ABI size reference.

foliage_wind.glsl's A5 change recompiled exactly the five shaders that
include it (mesh_atmospheric.vert, the four directional_shadow_world_*
casters) plus the manifest; no other .spv changed.

Verify: Release build 0 warnings/0 errors. App hermetic-lane filter
6,041/0 failed (no environment-specific failures this run).
RenderPackValidator 30/30. Full hermetic-filtered solution: 15,269/0
failed across 15 projects.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-23 01:54:36 +02:00
..
2026-04-10-phase-1-terrain-and-plugin-scaffold.md docs: phase 1 implementation plan 2026-04-10 09:17:49 +02:00
2026-04-10-phase-2-static-meshes-design.md docs(phase-2): refine design after DatReaderWriter spike 2026-04-10 17:18:43 +02:00
2026-04-10-phase-2-static-meshes-plan.md docs: phase 2 implementation plan (tasks 1-10 full, 11-18 sketch) 2026-04-10 17:27:53 +02:00
2026-04-10-phase-2b-design.md docs: phase 2b design — atlas textures, neighbors, dual cameras, plugin api 2026-04-10 20:00:23 +02:00
2026-04-10-phase-2b-plan.md docs: phase 2b implementation plan (9 tasks) 2026-04-10 20:13:03 +02:00
2026-04-10-phase-3c-terrain-blending-plan.md docs(plan): Phase 3c terrain blending plan 2026-04-10 23:43:04 +02:00
2026-04-10-phase-4-networking-design.md docs(plan): Phase 4 networking design 2026-04-10 22:31:26 +02:00
2026-04-10-plugin-architecture-design.md docs: plugin architecture design 2026-04-10 09:11:52 +02:00
2026-04-11-roadmap.md docs(plans): Campaign VM — VisualMaster plan + the Campaign AR review it closes 2026-08-22 18:17:08 +02:00
2026-04-13-rendering-rebuild.md fix(movement): jump works locally (airborne velocity preserved) 2026-04-14 00:12:11 +02:00
2026-04-23-sky-weather-lightning-port.md docs(sky): port plan for PhysicsScript/fog/lightning/crossfade 2026-04-24 10:53:46 +02:00
2026-04-24-ui-framework.md docs(ui): align architecture with retained runtime 2026-07-10 16:57:44 +02:00
2026-04-27-phase-c1-pes-particles.md feat(vfx): Phase C.1 — PES particle renderer + post-review fixes 2026-04-28 22:47:11 +02:00
2026-04-29-movement-collision-conformance.md docs(phys L.2g): slice 1 shipped handoff + B.4 gap discovery + plan-of-record 2026-05-12 23:17:05 +02:00
2026-04-30-sky-pes-port.md docs(plans): #36 sky-PES dispatch port plan + .gitignore for retail-debugger scratch 2026-04-30 23:00:46 +02:00
2026-05-08-phase-n5-perf-baseline.md phase(N.5): retirement amendment — InstancedMeshRenderer + StaticMeshRenderer + WbFoundationFlag deleted 2026-05-08 22:01:36 +02:00
2026-05-09-phase-n5b-perf-baseline.md docs(N.5b T10): roadmap + ISSUES + CLAUDE.md + perf baseline updates 2026-05-09 13:03:14 +02:00
2026-05-10-perf-tiers-2-3-roadmap.md docs(perf): roadmap for Tier 2 + Tier 3 entity-dispatcher optimizations 2026-05-10 09:38:38 +02:00
2026-05-11-phase-n6-perf-baseline.md docs(perf #N6.1): apply final-review fixes — spec, baseline doc, issue #55 2026-05-11 12:51:10 +02:00
2026-05-12-milestones.md docs: hand off placement campaign finish 2026-08-03 12:54:47 +02:00
2026-05-12-phase-c1.5b-handoff.md docs(vfx #C.1.5b): handoff for next slice (issue #56 + EnvCell statics) 2026-05-11 18:22:01 +02:00
2026-06-11-building-render-port-plan.md test: separate diagnostic apparatus from release gates 2026-08-18 11:06:08 +02:00
2026-07-02-retail-motion-animation-rewrite.md fix(motion): restore retail object manager order 2026-07-19 21:40:14 +02:00
2026-07-20-automated-world-lifecycle-gate.md docs(runtime): close deterministic world lifecycle gate 2026-07-21 00:00:31 +02:00
2026-07-21-gamewindow-slice-1-selection-interaction.md docs(architecture): close selection extraction slice 2026-07-21 09:04:31 +02:00
2026-07-21-gamewindow-slice-2-live-animation-presentation.md docs(architecture): close live animation slice 2026-07-21 10:03:20 +02:00
2026-07-21-gamewindow-slice-3-live-session.md docs(architecture): close live-session ownership slice 2026-07-21 12:44:48 +02:00
2026-07-21-gamewindow-slice-4-live-entity-integration.md docs(plan): complete GameWindow slice 4 2026-07-21 19:29:04 +02:00
2026-07-21-gamewindow-slice-5-landblock-presentation.md docs(architecture): close GameWindow slice 5 2026-07-21 23:45:45 +02:00
2026-07-21-gamewindow-slice-6-update-frame-orchestration.md docs(architecture): close GameWindow slice 6 2026-07-22 03:54:11 +02:00
2026-07-22-gamewindow-slice-7-render-frame-orchestration.md docs(architecture): close GameWindow render slice 2026-07-22 08:40:52 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-g-runtime-settings.md refactor(settings): own two-phase runtime settings 2026-07-22 13:30:22 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-h-resource-ownership.md refactor(lifetime): own render resource prefixes 2026-07-22 14:42:14 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i-ordered-composition.md refactor(app): close ordered startup composition 2026-07-22 19:20:20 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i6-ui-live-presentation.md refactor(app): compose live presentation startup 2026-07-22 17:55:15 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i7-session-player.md refactor(app): compose session and player startup 2026-07-22 18:28:32 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i8-frame-roots-session-start.md refactor(app): make session start terminal 2026-07-22 19:06:00 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-j-lifetime-shutdown.md refactor(app): extract focused window lifetime 2026-07-22 19:43:52 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-l-closeout.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-22-gamewindow-slice-8-composition-lifecycle.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-23-world-interaction-completion.md docs: world-interaction program CLOSEOUT — all six slices complete, vendors user-accepted end to end 2026-08-08 17:56:42 +02:00
2026-07-24-modern-runtime-architecture.md docs: reconcile project state and refresh README 2026-07-27 12:53:31 +02:00
2026-07-24-modern-runtime-slice-b-envcell-dedup.md docs(perf): close Slice B with full-bake evidence 2026-07-24 14:10:50 +02:00
2026-07-24-modern-runtime-slice-c-prepared-assets.md perf(content): close prepared asset cutover 2026-07-24 15:49:24 +02:00
2026-07-24-modern-runtime-slice-d-unified-residency.md docs(render): close unified residency slice 2026-07-24 17:06:17 +02:00
2026-07-24-modern-runtime-slice-e-cost-budgeted-streaming.md fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
2026-07-24-modern-runtime-slices-f-g-render-scene.md docs(rendering): close retained-scene G5 2026-07-25 13:55:38 +02:00
2026-07-25-modern-runtime-slice-h.md fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
2026-07-25-modern-runtime-slice-i.md fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
2026-07-25-modern-runtime-slice-j.md docs(runtime): close Slice J and activate Slice K 2026-07-27 01:01:41 +02:00
2026-07-25-modern-runtime-slice-j2.md docs(runtime): close J2 session lifetime gate 2026-07-25 19:46:47 +02:00
2026-07-25-modern-runtime-slice-j3-object-table.md docs(runtime): close J3.4 and plan J3.5 2026-07-26 06:09:28 +02:00
2026-07-25-modern-runtime-slice-j3-projection-store.md docs(runtime): close J3.3 and hand off J3.4 2026-07-25 22:29:34 +02:00
2026-07-25-modern-runtime-slice-j3.md docs(runtime): close canonical entity object lifetime 2026-07-26 07:35:42 +02:00
2026-07-26-modern-runtime-slice-j3-delta-stream.md docs(runtime): close J3.5 and plan J3.6 2026-07-26 06:54:47 +02:00
2026-07-26-modern-runtime-slice-j3-hardening.md docs(runtime): close canonical entity object lifetime 2026-07-26 07:35:42 +02:00
2026-07-26-modern-runtime-slice-j4.md docs(runtime): close gameplay-state ownership 2026-07-26 10:17:39 +02:00
2026-07-26-modern-runtime-slice-j5.md docs(runtime): close simulation ownership 2026-07-26 16:29:28 +02:00
2026-07-26-modern-runtime-slice-j6.md docs(runtime): close exact world host ownership 2026-07-26 18:41:24 +02:00
2026-07-26-modern-runtime-slice-j7.md docs(runtime): close the accepted J7 visual gate 2026-07-27 00:12:26 +02:00
2026-07-26-modern-runtime-slice-j8.md docs(runtime): close Slice J and activate Slice K 2026-07-27 01:01:41 +02:00
2026-07-26-modern-runtime-slice-k.md docs(headless): close modern runtime slice K 2026-07-27 11:31:19 +02:00
2026-07-26-modern-runtime-slice-l.md docs(linux): park Slice L at L1 checkpoint 2026-07-27 12:35:47 +02:00
2026-07-27-vulkan-campaign.md docs(render): Campaign V is closed - the deferred reruns pass on the GL-free tree 2026-07-29 07:49:29 +02:00
2026-07-29-network-transport-campaign.md docs: Campaign N CLOSED - user-accepted; #260 closed; #262 filed 2026-07-29 17:48:45 +02:00
2026-07-29-physics-parity-campaign.md test(physics): harden TS-4 production chronology 2026-07-31 14:08:51 +02:00
2026-07-29-post-vulkan-work-intake.md docs: VTank requirements research - the plugin-automation milestone model 2026-07-29 16:29:49 +02:00
2026-07-30-physics-parity-visual-matrix.md docs(physics): close Campaign P visual matrix 2026-07-31 10:20:48 +02:00
2026-08-02-placement-cutover.md docs: close the placement cutover ledger — #280 user-passed, remaining gates NOT RUN 2026-08-06 11:05:49 +02:00
2026-08-03-recent-regression-cleanup.md docs: close the recent-regression cleanup plan 2026-08-03 14:34:07 +02:00
2026-08-06-collision-fidelity-campaign.md test(physics): S6 — the camera provably reaches both PerfectClip TOI tails; contained, not dormant 2026-08-07 09:21:40 +02:00
2026-08-07-morning-gate-checklist.md docs: morning gate G1 user-passed — AD-65 downhill slope feel accepted 2026-08-07 06:50:58 +02:00
2026-08-08-audio-parity-campaign.md feat(audio): Ctrl+M instant mute + inn-chatter investigation closed as server content 2026-08-09 14:09:24 +02:00
2026-08-09-chat-parity-campaign.md fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
2026-08-10-options-panel-campaign.md docs: park Campaign OP — gate-4 fixes committed, user re-check owed at resume 2026-08-11 23:11:43 +02:00
2026-08-11-fellowship-allegiance-campaign.md docs: FA7 closeout — Campaign FA CODE-COMPLETE 2026-08-12 10:30:19 +02:00
2026-08-14-launcher-campaign.md Merge campaign-cc2: CC2 CharacterCreate wire, review-closed 2026-08-15 13:39:08 +02:00
2026-08-15-character-creation-campaign.md docs: Campaign CC connected gate PASSED — campaign CLOSED user-accepted 2026-08-16 2026-08-16 19:13:36 +02:00
2026-08-18-release-stabilization.md docs: record stabilization merge handoff 2026-08-18 17:49:09 +02:00
2026-08-19-launcher-usability-campaign.md docs: close Campaign LU with its ledger and the four gate traps 2026-08-20 08:13:29 +02:00
2026-08-21-atmospheric-rendering.md feat(render): weather-driven foliage wind for procedural scenery, shadows follow (Campaign VM VM6b) 2026-08-23 00:56:34 +02:00
2026-08-21-chat-text-tag-campaign.md feat(chat): CT-B4 — @log, and the research block that was a wrong question 2026-08-21 11:28:20 +02:00
2026-08-21-contract-tracker-campaign.md docs(quest): Campaigns QT and QJ closed user-accepted 2026-08-21 18:31:25 +02:00
2026-08-21-journal-campaign.md docs(quest): Campaigns QT and QJ closed user-accepted 2026-08-21 18:31:25 +02:00
2026-08-22-visualmaster-campaign.md fix(render): correct foliage-wind classification, receiver/caster desync, and frame binding (Campaign VM VM6 review) 2026-08-23 01:54:36 +02:00
animation-system-audit.md docs(anim): Phase L.1a animation system audit 2026-04-28 10:38:58 +02:00