docs(N.5b T10): roadmap + ISSUES + CLAUDE.md + perf baseline updates
Document Phase N.5b shipping (terrain on the modern rendering path via
Path C — `TerrainModernRenderer` mirrors WB's `TerrainRenderManager`
pattern but consumes acdream's `LandblockMesh.Build` so retail's
`FSplitNESW` formula stays in lockstep with physics + visual mesh).
Changes:
- `docs/plans/2026-04-11-roadmap.md` — add N.5b row to the Shipped
table; promote N.5b's "Phases ahead" entry to ✓ SHIPPED with the
Path C resolution + perf reality check; refresh N.6 scope to note
Terrain has joined the modern path (legacy `Texture2D` retirement
scope narrows to Sky + Debug); update top-of-doc Status line.
- `docs/ISSUES.md` — close issue #51 (WB terrain-split formula
divergence). Move from OPEN to "Recently closed" with the Path C
resolution: never adopted WB's formula; modern dispatcher uses
retail's via `LandblockMesh.Build`. References `da56063` (the
black-terrain fix that landed within the N.5b ship chain).
- `CLAUDE.md` — add `TerrainModernRenderer.cs` to the WB integration
cribs list with the GL_INVALID_OPERATION caveat (use uvec2 +
`sampler2DArray(handle)` constructor, NOT direct
`uniform sampler2DArray` + `glProgramUniformHandleARB`). Update
the "Currently in flight" preamble: N.6 builds on N.5 + N.5b;
add an N.5b shipped paragraph linking the perf baseline doc.
- `docs/plans/2026-05-09-phase-n5b-perf-baseline.md` — new doc
capturing the radius=5 Holtburg perf measurement (modern 6.4-7.0
µs median vs legacy 1.5 µs — modern is ~4× SLOWER on CPU at
radius=5). Documents the spec acceptance criterion #5 amendment,
the architectural wins that DO hold (zero glBindTexture/frame,
constant-cost dispatch as A.5 raises radius, per-LB frustum cull),
and the three high-value gotchas surfaced during implementation.
User-memory updates (outside repo, not in this commit):
- `memory/project_phase_n5b_state.md` — full N.5b state file with
the three gotchas captured.
- `memory/MEMORY.md` — index entry pointing at the state file.
Build: dotnet build green. No code changes in this commit.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7dfa2af6c0
commit
083c10c514
4 changed files with 220 additions and 80 deletions
109
docs/ISSUES.md
109
docs/ISSUES.md
|
|
@ -46,64 +46,6 @@ Copy this block when adding a new issue:
|
|||
|
||||
# Active issues
|
||||
|
||||
## #51 — WB's terrain-split formula diverges from retail's `FSplitNESW`
|
||||
|
||||
**Status:** OPEN
|
||||
**Severity:** MEDIUM (blocks isolated N.2; affects sequencing of N-phase migration)
|
||||
**Filed:** 2026-05-08
|
||||
**Component:** terrain math / Phase N (WorldBuilder rendering migration)
|
||||
|
||||
**Description:** WB's `TerrainUtils.CalculateSplitDirection`
|
||||
([references/WorldBuilder/WorldBuilder.Shared/Modules/Landscape/Lib/TerrainUtils.cs:44](references/WorldBuilder/WorldBuilder.Shared/Modules/Landscape/Lib/TerrainUtils.cs:44))
|
||||
uses a different math expression from retail's `FSplitNESW`
|
||||
(documented in CLAUDE.md as **the** real AC terrain split formula,
|
||||
constants `0x0CCAC033` / `0x421BE3BD` / `0x6C1AC587` / `0x519B8F25`).
|
||||
Ours is a degree-2 polynomial in (x,y); WB's is linear in (x,y).
|
||||
They cannot be algebraically equivalent and disagree on a meaningful
|
||||
fraction of cells.
|
||||
|
||||
**Concrete impact:** On any cell where the formulas pick different
|
||||
diagonals, the same world position (X, Y) maps to different terrain
|
||||
heights — up to ~2m for a sloped cell with one elevated corner. If a
|
||||
caller mixes "WB-formula path" and "AC2D-formula path" for the same
|
||||
cell, the player physics floats above or sinks below the visible
|
||||
ground. This is the bug class fixed in
|
||||
[src/AcDream.Core/Physics/TerrainSurface.cs:113-120](src/AcDream.Core/Physics/TerrainSurface.cs:113)
|
||||
(diagonal-direction inversion).
|
||||
|
||||
**Files implicated:**
|
||||
- `src/AcDream.Core/Physics/TerrainSurface.cs` — uses AC2D formula via
|
||||
`IsSplitSWtoNE`
|
||||
- `src/AcDream.Core/World/TerrainBlending.cs` — visual mesh, also AC2D
|
||||
- `references/WorldBuilder/WorldBuilder.Shared/Modules/Landscape/Lib/TerrainUtils.cs:44`
|
||||
— WB's diverging formula
|
||||
- `references/WorldBuilder/Chorizite.OpenGLSDLBackend/Lib/TerrainGeometryGenerator.cs`
|
||||
— WB's render mesh (presumably also uses WB's formula in lockstep)
|
||||
|
||||
**Sequencing implication:** Phase N.2 (terrain math helpers
|
||||
substitution) cannot be shipped in isolation — it must land alongside
|
||||
visual terrain renderer migration (originally N.5, now moved to N.7
|
||||
scope), at which point both physics and visual mesh switch to WB's
|
||||
formula together. N.5 shipped entity rendering only; terrain remains
|
||||
on acdream's own pipeline through N.7.
|
||||
|
||||
**Research needed (when N.7 picks this up):**
|
||||
1. Quantify divergence: run WB's `CalculateSplitDirection` and our
|
||||
`IsSplitSWtoNE` across all (lbX, lbY, cellX, cellY) tuples for a
|
||||
representative landblock set; record disagreement rate.
|
||||
2. Confirm WB's `TerrainGeometryGenerator` uses WB's formula in its
|
||||
render mesh — if so, switching everything to WB's formula keeps
|
||||
visual + physics synced. (Highly likely.)
|
||||
3. Decide whether ANY retail-conformance test (e.g., physics matching
|
||||
server-authoritative Z within tolerance) is invalidated by the
|
||||
formula change.
|
||||
|
||||
**Acceptance:** Resolved when N.7 lands and both physics + visual
|
||||
terrain use WB's split formula, OR when we decide to keep the AC2D
|
||||
formula and patch WB's renderer in our fork.
|
||||
|
||||
---
|
||||
|
||||
## #50 — Road-edge tree at 0xA9B1 visible in acdream but not retail
|
||||
|
||||
**Status:** OPEN
|
||||
|
|
@ -1758,6 +1700,57 @@ Unverified. The likely culprits, ranked by suspected probability:
|
|||
|
||||
# Recently closed
|
||||
|
||||
## #51 — [DONE 2026-05-09 · da56063 + N.5b SHIP] WB's terrain-split formula diverges from retail's `FSplitNESW`
|
||||
|
||||
**Closed:** 2026-05-09
|
||||
**Commit:** `da56063` (black-terrain fix; landed within Phase N.5b — see
|
||||
`docs/superpowers/plans/2026-05-09-phase-n5b-terrain-modern.md` for the
|
||||
ship commit chain)
|
||||
**Component:** terrain math / Phase N.5b
|
||||
|
||||
**Resolution: Path C.** Phase N.5b lifted terrain rendering onto the
|
||||
modern path (bindless atlas + `glMultiDrawElementsIndirect`) WITHOUT
|
||||
adopting WB's `TerrainUtils.CalculateSplitDirection`. The pre-implementation
|
||||
divergence test (`tests/AcDream.Core.Tests/Terrain/SplitFormulaDivergenceTest.cs`)
|
||||
confirmed the two formulas disagree on **49.98%** of sweep cells —
|
||||
fundamentally incompatible with our shared physics + visual mesh, which
|
||||
both rely on retail's `FSplitNESW` (constants `0x0CCAC033` / `0x421BE3BD` /
|
||||
`0x6C1AC587` / `0x519B8F25`).
|
||||
|
||||
Path C: keep retail's `FSplitNESW` formula via `LandblockMesh.Build` →
|
||||
`TerrainBlending.CalculateSplitDirection`; mirror WB's `TerrainRenderManager`
|
||||
architectural pattern (single global VBO/EBO + slot allocator + bindless
|
||||
atlas + multi-draw indirect) but feed it acdream's mesh. Modern dispatcher
|
||||
(`TerrainModernRenderer`) replaces `TerrainChunkRenderer` (deleted in T9
|
||||
along with `TerrainRenderer` + `terrain.vert/.frag`).
|
||||
|
||||
Path A (substitute WB's formula) was killed by the divergence test.
|
||||
Path B (fork-patch WB's renderer to use retail's formula) was rejected
|
||||
for permanent maintenance burden. Path C ships the architectural
|
||||
pattern while preserving retail-formula compliance.
|
||||
|
||||
Visual mesh and physics both still consume retail's `FSplitNESW`; they
|
||||
remain in lockstep, no triangle-Z hover. The N.6 / N.7 sequencing
|
||||
implication this issue carried (substitute physics math only when the
|
||||
visual mesh migrates) is moot — neither side ever switches to WB's
|
||||
formula.
|
||||
|
||||
**Files added:**
|
||||
- `src/AcDream.App/Rendering/TerrainModernRenderer.cs`
|
||||
- `src/AcDream.Core/Terrain/TerrainSlotAllocator.cs`
|
||||
- `src/AcDream.App/Rendering/Shaders/terrain_modern.vert`
|
||||
- `src/AcDream.App/Rendering/Shaders/terrain_modern.frag`
|
||||
- `tests/AcDream.Core.Tests/Terrain/SplitFormulaDivergenceTest.cs` (the
|
||||
test that killed Path A)
|
||||
|
||||
**Files deleted (T9):**
|
||||
- `src/AcDream.App/Rendering/TerrainChunkRenderer.cs`
|
||||
- `src/AcDream.App/Rendering/TerrainRenderer.cs`
|
||||
- `src/AcDream.App/Rendering/Shaders/terrain.vert`
|
||||
- `src/AcDream.App/Rendering/Shaders/terrain.frag`
|
||||
|
||||
---
|
||||
|
||||
## #43 — [DONE 2026-05-05 · 9e4772a] Slope staircase on observed player remotes (anim-only fallback ignored slope)
|
||||
|
||||
**Closed:** 2026-05-05
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue