file #131 (portal swirl gone through doorways) + #132 (candle flame vs aperture background) + the [outstage] capture probe
Two user reports from the #124 gate session, both axioms: - #131: "the portal swirl is missing, when I look out from inside a house. Appears when I walk out again." Mechanism frame: under an interior root an outdoor dynamic's particles draw ONLY via the landscape slice's Scene pass (#118 outside-stage routing; #121 excludes them from the last-pass particle callback) - if any link fails, the swirl draws nowhere exactly when indoors. Desk-exonerated already: filter key conventions uniform, the routing predicate correct, sphere from vertex bounds. - #132: "I have a candle ... when a wall is behind it it shows, but if I turn a bit and the opening through a house is behind it candle light disappears." Background-dependent => per-pixel depth/blend at the aperture region, not owner culling. Possible overlap with the #124 look-in sub-pass (new pre-clear content in those pixels) - the pre-77cef4c check is in the issue. Apparatus (env-gated, zero cost off): ACDREAM_PROBE_OUTSTAGE=1 -> [outstage] per-slice outside-stage routing + cone verdict per dynamic (print-on-change, RetailPViewRenderer) + [outstage-pt] slice Scene-particle id set + live attached-emitter match count (GameWindow). One capture standing inside looking at the portal pins which link breaks. Suites: App 259+1skip / Core 1439+2skip / UI 420 / Net 294 green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
77cef4cd86
commit
eeb1c59ded
4 changed files with 127 additions and 0 deletions
|
|
@ -397,6 +397,8 @@ public sealed class RetailPViewRenderer
|
|||
if (viewcone.SphereVisibleInOutsideSlice(probeSliceIndex, c, r))
|
||||
_outdoorStaticScratch.Add(e);
|
||||
}
|
||||
if (AcDream.Core.Rendering.RenderingDiagnostics.ProbeOutStageEnabled)
|
||||
EmitOutStageProbe(probeSliceIndex, viewcone);
|
||||
probeSliceIndex++;
|
||||
ctx.DrawLandscapeSlice(new RetailPViewLandscapeSliceContext(slice, _outdoorStaticScratch));
|
||||
}
|
||||
|
|
@ -420,6 +422,32 @@ public sealed class RetailPViewRenderer
|
|||
UseIndoorMembershipOnlyRouting();
|
||||
}
|
||||
|
||||
// #131 [outstage] probe state (2026-06-12, throwaway): print-on-change —
|
||||
// which outdoor dynamics were routed to the outside stage and which
|
||||
// survived the slice viewcone. Strip with the probe when #131 closes.
|
||||
private string? _lastOutStageSig;
|
||||
|
||||
private void EmitOutStageProbe(int sliceIndex, ViewconeCuller viewcone)
|
||||
{
|
||||
var sb = new System.Text.StringBuilder(192);
|
||||
sb.Append("slice=").Append(sliceIndex)
|
||||
.Append(" outStage=").Append(_outsideStageDynamics.Count).Append(" [");
|
||||
for (int i = 0; i < _outsideStageDynamics.Count; i++)
|
||||
{
|
||||
var e = _outsideStageDynamics[i];
|
||||
EntitySphere(e, out var c, out float r);
|
||||
bool pass = viewcone.SphereVisibleInOutsideSlice(sliceIndex, c, r);
|
||||
if (i > 0) sb.Append(' ');
|
||||
sb.Append(System.FormattableString.Invariant(
|
||||
$"0x{(e.ServerGuid != 0 ? e.ServerGuid : e.Id):X8}:{(pass ? "PASS" : "CULL")}:r={r:F1}"));
|
||||
}
|
||||
sb.Append(']');
|
||||
string sig = sb.ToString();
|
||||
if (sig == _lastOutStageSig) return;
|
||||
_lastOutStageSig = sig;
|
||||
Console.WriteLine("[outstage] " + sig);
|
||||
}
|
||||
|
||||
// §4 flap [clip-route] probe state (2026-06-10, throwaway): print-on-change signature +
|
||||
// monotonic sequence so held-flap vs healthy frames diff cleanly in one capture.
|
||||
private string? _lastClipRouteSig;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue