acdream/src/AcDream.App/Rendering
Erik ce9445b270 fix(render): the near plane is col3, not col4 + col3 (#248)
`FrustumPlanes.FromViewProjection` extracted the near plane with the
Gribb-Hartmann form written for OpenGL's `[-1,1]` clip-space z range. Every
acdream projection comes from `Matrix4x4.CreatePerspectiveFieldOfView` or
`CreateOrthographic`, whose range is `[0,1]`. Under `[-1,1]` the near plane is
the locus of `clip.z = -clip.w`, which is `col4 + col3`; under `[0,1]` it is
`clip.z = 0`, which is `col3` alone.

Concretely, the mismatch put the effective near threshold at `-n·f/(2f-n)` —
about 0.5 m where the retail chase camera asks for 1.0 m. That error only ever
kept geometry the true frustum would have dropped, never the reverse, which is
why it produced no visible defect and was filed instead of hot-fixed during
Campaign V. It is still wrong, and it is the same mistake that *was* visible in
`PortalProjection`, where it culled the cell behind a doorway the camera stood
close to.

The far plane is `col4 - col3` under both conventions and is untouched. A test
pins it anyway, so that a future edit to this function cannot drift it while
nobody is looking.

The acceptance criterion asked for a unit test pinning the extracted near
distance to the camera's near value, and that is what landed: a theory over four
near/far pairs asserting the plane is unit-length, faces down -Z, and stands off
the eye by exactly `nearDistance`, plus a kept/dropped pair straddling it. The
test was checked against the old formula before commit and fails all four cases
there — it measures the fix rather than merely accompanying it.

The other half of the acceptance criterion — unchanged culling in the offline
pixel gate and the connected route — could not be run: #259 has Win32 surface
creation failing machine-wide, so no gate that needs a window is available
tonight. Recorded as outstanding rather than assumed.

Solution build 0 errors; `AcDream.Core.Tests` 3,898 passed / 2 skipped / 3,900.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 03:33:20 +02:00
..
Gpu docs(render): V11 closeout — register, architecture, code structure, issues 2026-07-29 03:20:04 +02:00
Residency Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Scene refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
Selection feat(rendering): prove packed dispatcher output parity 2026-07-25 01:31:56 +02:00
Shaders feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
Sky feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
Vfx Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Wb feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
AnimationPresentationDiagnostics.cs refactor(animation): extract live PartArray presenter 2026-07-21 09:37:02 +02:00
AttachmentUpdateOrder.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
BackendNeutralWorldTextures.cs feat(render): Campaign V slice V6i-2 commit 2 — world texture creation crosses to IGpuTexture 2026-07-28 13:57:43 +02:00
BitmapFont.cs feat(render): put the retained UI and debug lines on both backends 2026-07-28 08:51:32 +02:00
BoundedUnownedResourceCache.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
CameraController.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CameraFrameController.cs refactor(camera): extract the update frame 2026-07-22 03:08:58 +02:00
CellVisibility.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ChaseCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ClipFrame.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
ClipFrameAssembler.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ClipPlaneSet.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
CompositeTextureArrayCache.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
CreatureAppraisalPresentation.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
DatLiveEntityProjectionMaterializer.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
DebugLineRenderer.cs feat(render): Campaign V slice V6l commit 1 - particles draw on Vulkan 2026-07-28 17:20:59 +02:00
DebugVmRenderFactsPublisher.cs refactor(render): extract frame presentation diagnostics 2026-07-22 05:02:31 +02:00
DevToolsRuntimeSources.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
DisplayFramePacingController.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
DollCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DollEntityBuilder.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
DynamicBufferCapacity.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
EquippedChildRenderController.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
FixedEntityTextureOwnerLease.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
FlyCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
FramebufferResizeController.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
FramePacingController.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
FramePacingPolicy.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
FramePacingWaiterFactory.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
FrustumCuller.cs fix(render): the near plane is col3, not col4 + col3 (#248) 2026-07-29 03:33:20 +02:00
GameFrameGraphSlot.cs refactor(app): compose atomic frame roots 2026-07-22 19:02:08 +02:00
GameRenderResourceLifetime.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
GameWindow.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
GameWindowLifetime.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
GpuDeviceFrameLifetime.cs feat(render): Campaign V slice V4a - port TextRenderer/BitmapFont/DebugLineRenderer/TextureCache UI path onto IGpuDevice 2026-07-27 19:37:19 +02:00
GpuFrameFlightController.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
GpuRetiredTerrainSlotAllocator.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
HostQuiescenceGate.cs refactor(app): own native window callback lifetime 2026-07-22 09:59:10 +02:00
IAnimationHookCaptureSink.cs refactor(runtime): extract the live object frame 2026-07-22 00:42:26 +02:00
ICamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ICameraCollisionProbe.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
ILiveAnimationPresentationContext.cs refactor(animation): extract live PartArray presenter 2026-07-21 09:37:02 +02:00
ILiveStaticPartFrameSource.cs fix(animation): harden presentation phase handoffs 2026-07-21 10:01:25 +02:00
IndoorDrawPlan.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
InteriorEntityPartition.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LinuxMonotonicFramePacingWaiter.cs feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
LiveAnimationPresentationContext.cs fix(runtime): restore interaction completion ownership 2026-07-23 05:51:51 +02:00
LiveEntityAnimationPresenter.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
LiveEntityAnimationScheduler.cs refactor(runtime): own projectile simulation 2026-07-26 14:17:42 +02:00
LiveEntityAnimationState.cs fix(animation): harden presentation phase handoffs 2026-07-21 10:01:25 +02:00
LiveEntityAppearanceBinding.cs refactor(world): extract live projection mechanics 2026-07-21 16:17:03 +02:00
LiveEntityCreateSupersessionRecovery.cs refactor(world): extract live entity hydration 2026-07-21 17:32:45 +02:00
LiveEntityPartArrayLifecycle.cs refactor(update): cut over the frame orchestrator 2026-07-22 03:31:38 +02:00
LiveStaticAnimationResidency.cs refactor(runtime): extract the live object frame 2026-07-22 00:42:26 +02:00
NdcScissorRect.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
OrbitCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
OrderedResourceTeardown.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
OutdoorCellNode.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
OwnerScopedResourceRegistry.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PaperdollFramePresenter.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
PaperdollViewportRenderer.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
ParticleEmitterRetirementTracker.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
ParticleRenderer.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
ParticleRenderer.Rhi.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
ParticleSubmissionOrdering.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
PhysicsCameraCollisionProbe.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PortalDepthMaskRenderer.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
PortalDepthMaskRenderer.Rhi.cs feat(render): Campaign V slice V6l commit 2 - the portal mask draws on Vulkan 2026-07-28 17:36:45 +02:00
PortalProjection.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PortalTunnelCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PortalTunnelPresentation.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
PortalView.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PortalVisibilityBuilder.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
PrivateEntityViewportRenderer.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
PrivatePresentationRenderer.cs feat(ui): port retail creature appraisal presentation 2026-07-23 12:55:24 +02:00
QuadClipper.cs fix(ui): render live component counts 2026-07-15 18:11:02 +02:00
RenderFrameDiagnosticsController.cs perf(diagnostics): expose prepared asset source counters 2026-07-24 15:16:32 +02:00
RenderFrameDiagnosticSources.cs refactor(runtime): own world environment state 2026-07-26 16:45:04 +02:00
RenderFrameOrchestrator.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RenderFramePreparationController.cs feat(render): Campaign V slice V11 commit 1 - delete ImGui, Studio, and the DevTools frontend 2026-07-28 23:56:04 +02:00
RenderFrameResourceController.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
ResourceCleanupGroup.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
ResourceShutdownTransaction.cs refactor(app): extract focused window lifetime 2026-07-22 19:43:52 +02:00
RestoredTextureBindingMutation.cs refactor(lifetime): own render resource prefixes 2026-07-22 14:42:14 +02:00
RetailAlphaQueue.cs perf(render): bound animation and alpha scratch residency 2026-07-24 16:34:28 +02:00
RetailChaseCamera.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RetailCursorManager.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RetailCursorResolver.cs fix(rendering): bound portal resource lifetime 2026-07-18 21:35:16 +02:00
RetailParticleGeometryClassifier.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RetailPViewPassExecutor.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
RetailPViewRenderer.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
RetailStaticAnimatingObjectScheduler.cs feat(rendering): index incremental scene queries 2026-07-24 22:12:26 +02:00
RollingTimingSampleWindow.cs refactor(render): extract frame presentation diagnostics 2026-07-22 05:02:31 +02:00
RuntimeResourceSlots.cs refactor(lifetime): own render resource prefixes 2026-07-22 14:42:14 +02:00
SceneLightingUboBinding.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
ScreenPolygonClip.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
SilkWindowCallbackBinding.cs refactor(app): own native window callback lifetime 2026-07-22 09:59:10 +02:00
SkyPesFrameController.cs refactor(render): extract world frame preparation 2026-07-22 05:54:00 +02:00
SpawnMotionInitializer.cs refactor(world): extract live entity hydration 2026-07-21 17:32:45 +02:00
StandaloneBindlessTextureCache.cs feat(render): Campaign V slice V6l commit 1 - particles draw on Vulkan 2026-07-28 17:20:59 +02:00
StaticLiveRootCommitter.cs refactor(runtime): extract the live object frame 2026-07-22 00:42:26 +02:00
SyntheticEntityMeshReferenceOwner.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
TeleportViewPlaneController.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
TerrainAtlas.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
TerrainDrawDiagnosticsController.cs refactor(app): key live projections by runtime identity 2026-07-25 21:50:58 +02:00
TerrainModernRenderer.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
TerrainModernRenderer.Rhi.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
TerrainTextureTilingTable.cs feat(render): Campaign V slice V6f-2 - terrain's tiling table becomes a buffer 2026-07-28 10:11:00 +02:00
TextRenderer.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
TextureCache.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
UiTextureTableHandle.cs feat(render): put the retained UI and debug lines on both backends 2026-07-28 08:51:32 +02:00
ViewconeCuller.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
WindowsHighResolutionFramePacingWaiter.cs fix #225: stabilize render pacing and frame CPU 2026-07-19 06:29:30 +02:00
WorldPassScope.cs feat(render): Campaign V slice V6l commit 3 - the offscreen viewports draw on Vulkan 2026-07-28 18:05:24 +02:00
WorldPassSurface.cs feat(render): Vulkan campaign V11 step 2 — delete the OpenGL backend 2026-07-29 02:19:53 +02:00
WorldRenderDiagnostics.cs feat(render): Vulkan campaign V11 step 3 — drop the GL packages and shaders 2026-07-29 02:58:15 +02:00
WorldRenderFrameBuilder.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
WorldRevealRenderResourceScheduler.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
WorldSceneDiagnosticsController.cs test(render): add blank-world attribution apparatus and a post-world GL sample 2026-07-28 00:08:10 +02:00
WorldScenePassExecutor.cs feat(render): Campaign V slice V6j commit 2 - Dereth draws on Vulkan 2026-07-28 15:46:54 +02:00
WorldSceneRenderer.cs perf(rendering): retire production entity partition 2026-07-25 10:50:57 +02:00
WorldSceneRuntimeSources.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00