acdream/src/AcDream.App
Erik 0cb1059765 feat(render): Campaign V slice V4d-1 - converge terrain's view and projection
terrain_modern.vert took uView and uProjection as two mat4 uniforms and formed
`uProjection * uView` per vertex. GpuPushConstants carries one ViewProjection,
so terrain could not reach the pinned push-constant block until these became
one uniform. This does that change and nothing else.

The transform is unchanged. System.Numerics is row-vector and stores row-major;
uploaded untransposed, GLSL reads those bytes as column-major, which is the
transpose. So the CPU's camera.View * camera.Projection arrives in the shader as
(View*Proj)^T = Proj^T * View^T - exactly the uProjection * uView it replaces.
The product it now uses is the same one Draw already computed for the per-cell
visibility pass, so no new work is done either.

What genuinely changes is where the multiply happens: per-vertex on the GPU
before, once on the CPU now. Two float32 matrix products with different
association and rounding are not bit-identical, and terrain fills most of the
gate's frame, so this was split into its own commit to make that effect
attributable rather than buried in the V4d-2 plumbing diff.

It is not measurable. The gate run against c7f5f251 reported 32 differing
pixels of 563,200 (fraction 5.68e-05, 17.6x under the 0.001 threshold). Because
32 sits just above the plan's recorded 8-29 noise band, the difference was
characterised rather than accepted: three captures were taken at this commit and
compared every way.

  cross-commit (c7f5f251 vs here):  32, 26, 26
  same-commit  (here vs here):      28, 27,  8

The distributions are the same distribution. Two cross-commit pairs (26, 26)
differ by LESS than two same-commit pairs (27, 28), and a systematic shift
cannot produce that - it would floor every cross-commit comparison above every
same-commit one. maximumChannelDelta is 48-49 in all six comparisons, including
the pure same-commit controls, so the few large-delta pixels are a property of
the capture, not of this change. The 32 was the high draw of a noise
distribution whose floor today spans roughly 8 to 32; a same-commit control
measured 17 at cb0182a0 earlier in the session, so the band drifted on its own,
with an unchanged binary, by more than this change moved anything.

Gates. Release build green with TreatWarningsAsErrors. App tests 3,846 passed /
3 skipped over two consecutive clean runs. A third run failed only
UiDatFontTests.InstanceMeasureWidth_ReusesGlyphTableWithoutAllocating, which is
the known issue #250 flake on an unchanged tree. Two files changed, CRLF and
UTF-8 preserved.

No divergence-register row: the transform is identical and no retail-facing
behaviour changes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 21:17:04 +02:00
..
Audio Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Combat refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
Composition feat(render): Campaign V slice V4c - move the world draw path onto the RHI 2026-07-27 20:55:25 +02:00
Diagnostics Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Input Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Interaction refactor(runtime): unify generation reset for direct hosts 2026-07-27 00:43:26 +02:00
Net feat(headless): hydrate isolated collision worlds 2026-07-27 09:25:58 +02:00
Physics Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Platform feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
Plugins Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Rendering feat(render): Campaign V slice V4d-1 - converge terrain's view and projection 2026-07-27 21:17:04 +02:00
Runtime feat(headless): complete deterministic bot command parity 2026-07-27 08:23:36 +02:00
Settings feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
Spells Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Streaming Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Studio Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
UI feat(render): Campaign V slice V4a - port TextRenderer/BitmapFont/DebugLineRenderer/TextureCache UI path onto IGpuDevice 2026-07-27 19:37:19 +02:00
Update refactor(runtime): cut graphical host over to canonical root 2026-07-26 19:06:09 +02:00
World Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
AcDream.App.csproj feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
GlobalUsings.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Program.cs feat(linux): gate graphical backends and capabilities 2026-07-27 12:26:58 +02:00
RuntimeOptions.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00