revert(render): FW4 slices 4+5 - unanimous tri-review verdict

Reverts 0d6cd5c0 (slice 5) and f3a03efc (slice 4). All three
independent cathedral reviews (fable, opus, external) plus the DAT
geometry ground truth condemned both:

- Slice 5 misidentified its targets: owners 0x4F418012-15 are cell
  0xF4180106''s TORCHES + a prop + a plant (InteriorEntityIdAllocator
  namespace), not the falls - the real waterfall emitters are outdoor
  landblock objects in the 0xC namespace (0xCF418000-13). Moving torch
  flames pre-clear is the owner-reported in-cathedral particle
  regression.
- Slice 4''s straddle rule is invented (retail stages by actual
  shadow-cell membership), and its "emit once" contradicts retail''s
  deliberate mid-frame m_nFrameStamp re-arm @0x005a4886 (a part
  overlapping both scopes legitimately draws twice).

The synthesis of all seven review reports and the adjudicated fix plan
live in docs/research/2026-08-30-cathedral-synthesis.md (next commit).

Hermetic 6,762/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-30 20:50:52 +02:00
parent bb9212c70d
commit 7f500b97a3
3 changed files with 3 additions and 142 deletions

View file

@ -161,10 +161,6 @@ public sealed unsafe partial class ParticleRenderer : IDisposable
private readonly List<MeshParticleInstance> _meshRunScratch = new(64);
private readonly List<ParticleSubmission> _submissionScratch = new(128);
private readonly List<RuntimeParticleEmitter> _scopedEmitterScratch = new(64);
// ACDREAM_PROBE_WALK_ROOT companion (throwaway): rate limiter for the
// [walk-emit] interior-unattached emitter dump.
private uint _probeEmitterDumpCounter;
private readonly List<DeferredParticleDraw> _deferredAlpha = new(128);
private DeferredParticleDraw[] _preparedAlpha = new DeferredParticleDraw[256];
private uint[] _preparedInstanceOffsets = new uint[256];
@ -251,22 +247,6 @@ public sealed unsafe partial class ParticleRenderer : IDisposable
_scopedEmitterScratch,
excludedAttachedOwnerIds,
unattachedCellScope);
// ACDREAM_PROBE_WALK_ROOT companion (throwaway): identify WHICH
// emitters ride the interior-unattached route (the falls hunt) —
// owner cell, anchor position, attachment.
if (AcDream.Core.Rendering.RenderingDiagnostics.ProbeWalkRootEnabled
&& unattachedCellScope == UnattachedEmitterCellScope.InteriorCells
&& ++_probeEmitterDumpCounter % 120 == 0)
{
foreach (var em in _scopedEmitterScratch)
{
Console.WriteLine(
$"[walk-emit] cell={em.OwnerCellId:x8} attached={em.AttachedObjectId:x} "
+ $"anchor=({em.AnchorPos.X:F1},{em.AnchorPos.Y:F1},{em.AnchorPos.Z:F1}) "
+ $"active={em.ActiveCount} "
+ $"phase={AcDream.Core.Rendering.RenderingDiagnostics.WalkRootPhase}");
}
}
Matrix4x4.Invert(camera.View, out Matrix4x4 invView);
Vector3 cameraRight = Vector3.Normalize(new Vector3(invView.M11, invView.M12, invView.M13));
Vector3 cameraUp = Vector3.Normalize(new Vector3(invView.M21, invView.M22, invView.M23));