fix(render): FW4 slice 2 - exit seals stamp the walk''s own flood
The cathedral falls shine-through (owner report at the #456 terrace seam, toggling with the camera''s side of the seam): the probe''s new phase tags pinned the falls emitters to the cell-owners route submitting POST-depth-clear on interior roots - retail''s own timing, safe only because seals own the aperture depth by the end-of-frame alpha drain. Our seal SET still came from the old apparatus''s flood, which misses exit portals at the #456 seam band (its never-drawn panel family), so the drain z-passed across the unsealed opening. DrawWalkExitPortalMasks now stamps the walk''s own ordered interior flood (WalkFrameDriver.InteriorFloodCells, captured at OnInteriorFloodDrawTurn - retail PView::DrawCells pc:432785-432786), keeping the old assembly''s per-cell slice clips where present and sealing unclipped where the old apparatus had no entry (benign: the exact dat aperture polygon, z-tested). The legacy path keeps the old seal draw. Also: ACDREAM_PROBE_WALK_ROOT gains [walk-part]/[walk-alpha] phase-tagged submission/drain lines (the apparatus that pinned this). Hermetic 6,762/0, Walk lane 213/1, InstalledDat walk conformance 40/1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
37febd1fe6
commit
c40aecfc8c
8 changed files with 136 additions and 4 deletions
|
|
@ -180,6 +180,8 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
public void BeginFrame()
|
||||
{
|
||||
_particleClassifications.BeginFrame();
|
||||
if (AcDream.Core.Rendering.RenderingDiagnostics.ProbeWalkRootEnabled)
|
||||
AcDream.Core.Rendering.RenderingDiagnostics.WalkRootPhase = "pre";
|
||||
}
|
||||
|
||||
/// <summary>Campaign FW3.2b-2: the shared dispatcher, for
|
||||
|
|
@ -510,6 +512,7 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
DisableClipDistances();
|
||||
|
||||
_particleClassifications.ReplaceOutdoor(context.ParticleOwnerIds);
|
||||
ProbeWalkParticleRoute("static-owners", _particleClassifications.Outdoor);
|
||||
if (_particleClassifications.Outdoor.Count > 0
|
||||
&& _particles is not null
|
||||
&& _particleRenderer is not null)
|
||||
|
|
@ -569,7 +572,12 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
DisableClipDistances();
|
||||
}
|
||||
|
||||
public void ClearInteriorDepth() => _surface.ClearInteriorDepth();
|
||||
public void ClearInteriorDepth()
|
||||
{
|
||||
if (AcDream.Core.Rendering.RenderingDiagnostics.ProbeWalkRootEnabled)
|
||||
AcDream.Core.Rendering.RenderingDiagnostics.WalkRootPhase = "post";
|
||||
_surface.ClearInteriorDepth();
|
||||
}
|
||||
|
||||
public void DrawExitPortalMask(
|
||||
RetailPViewFrameInput frame,
|
||||
|
|
@ -598,6 +606,8 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
// hardware clip slot made effects vanish by view direction (zero
|
||||
// outside slices in view = zero submissions) — invented behavior.
|
||||
DisableClipDistances();
|
||||
ProbeWalkParticleRoute(
|
||||
outdoorCells ? "unattached-outdoor" : "unattached-interior", null);
|
||||
_particleRenderer.DrawForOwners(
|
||||
frame.Camera,
|
||||
frame.CameraWorldPosition,
|
||||
|
|
@ -610,6 +620,30 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
: UnattachedEmitterCellScope.InteriorCells);
|
||||
}
|
||||
|
||||
/// <summary>ACDREAM_PROBE_WALK_ROOT companion (throwaway, dies with the
|
||||
/// cathedral falls investigation): logs each particle submission route
|
||||
/// with its owner count + the pre/post-depth-clear phase tag.</summary>
|
||||
private static void ProbeWalkParticleRoute(string route, IReadOnlySet<uint>? owners)
|
||||
{
|
||||
if (!AcDream.Core.Rendering.RenderingDiagnostics.ProbeWalkRootEnabled)
|
||||
return;
|
||||
string ids = "";
|
||||
if (owners is not null)
|
||||
{
|
||||
var sb = new System.Text.StringBuilder();
|
||||
int shown = 0;
|
||||
foreach (uint id in owners)
|
||||
{
|
||||
if (shown++ == 6) { sb.Append(",…"); break; }
|
||||
if (sb.Length > 0) sb.Append(',');
|
||||
sb.Append(id.ToString("x"));
|
||||
}
|
||||
ids = $" n={owners.Count} ids=[{sb}]";
|
||||
}
|
||||
Console.WriteLine(
|
||||
$"[walk-part] {route}{ids} phase={AcDream.Core.Rendering.RenderingDiagnostics.WalkRootPhase}");
|
||||
}
|
||||
|
||||
public void FlushLandscapeAlpha() => _alpha.Flush();
|
||||
|
||||
public void FlushLandscapeAlphaFartherThan(float minViewerDistance) =>
|
||||
|
|
@ -633,6 +667,7 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
return;
|
||||
|
||||
DisableClipDistances();
|
||||
ProbeWalkParticleRoute("cell-owners", visible);
|
||||
// Retail never clips cell particles to a portal view: the owner
|
||||
// cell's walls own occlusion via the depth test at the alpha flush.
|
||||
_particleRenderer.DrawForOwners(
|
||||
|
|
@ -658,6 +693,7 @@ internal sealed partial class RetailPViewPassExecutor :
|
|||
return;
|
||||
|
||||
DisableClipDistances();
|
||||
ProbeWalkParticleRoute("dyn-owners", dynamics);
|
||||
_particleRenderer.DrawForOwners(
|
||||
frame.Camera,
|
||||
frame.CameraWorldPosition,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue