refactor(render): delete superseded alpha sidecars

Remove the dead classic-group CachedBatch/InstanceGroup sort-center sidecar and its cache, append, reset, and diagnostic-digest plumbing. Remove the discarded camera parameter chain from grouped alpha deferral and dispatcher submission diagnostics while preserving walk/particle CYpt keys, FIFO submission ordinals, and opaque camera distance.

Add production-facing reflection/source pins for the deleted shapes and camera chain, retained per-cell and opaque owners, the exact three AlphaFlushCounts reasons, and deleted alpha-order symbols. Update directly affected cache/digest/group lifecycle tests and record the complete section 22 result.

Gates: Release 0W/0E; focused App 132/132 plus Core 29/29; new pins 4/4; real allocation pins 2/2 at 0 B; shaders 32/32; hermetic 16755/16755; InstalledDat exactly 385 pass, 10 documented fail, 1 skip; diff-check clean.

Mutations: InstanceGroup and CachedBatch sidecars fail their Assert.Null pins; Defer and digest camera parameters fail method-shape pins; false count prose fails the exact-reason pin; RetailAlphaOrdering resurrection fails the deletion pin. Each was restored independently before the final matrix.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-09-04 15:02:23 +02:00
parent a0523e6057
commit 26e97ba412
7 changed files with 224 additions and 105 deletions

View file

@ -345,6 +345,54 @@ public sealed class WalkStaticStreamPopulatorTests
Assert.Contains("0x005A06B7..0x005A0720", register, StringComparison.Ordinal);
}
[Fact]
public void ClassicGroupedAlphaSourceTruth_DeletesDeadOrderingChainAndPreservesLiveOwners()
{
string root = FindRepoRoot();
string dispatcher = File.ReadAllText(Path.Combine(
root, "src", "AcDream.App", "Rendering", "Wb", "WbDrawDispatcher.cs"));
string cachedBatch = File.ReadAllText(Path.Combine(
root, "src", "AcDream.App", "Rendering", "Wb", "CachedBatch.cs"));
string walkClassifier = File.ReadAllText(Path.Combine(
root, "src", "AcDream.App", "Rendering", "Wb", "WbDrawDispatcher.WalkClassify.cs"));
string alphaProduction = dispatcher + cachedBatch + walkClassifier;
Assert.Contains(
"Vector3.DistanceSquared(cameraWorldPosition, groupPosition)",
dispatcher,
StringComparison.Ordinal);
Assert.Contains("group.SortDistance =", dispatcher, StringComparison.Ordinal);
Assert.Contains("Vector3 LocalSortCenter", walkClassifier, StringComparison.Ordinal);
Assert.Contains("float SortDistanceSq", walkClassifier, StringComparison.Ordinal);
Assert.DoesNotContain("RetailAlphaOrdering", alphaProduction, StringComparison.Ordinal);
Assert.DoesNotContain("FlushFartherThan(", alphaProduction, StringComparison.Ordinal);
Assert.DoesNotContain("viewerDistance", alphaProduction, StringComparison.Ordinal);
Assert.DoesNotContain("_ = cameraWorldPosition", dispatcher, StringComparison.Ordinal);
}
[Fact]
public void AlphaFlushCountKnownFailure_StatesOnlyTheThreeExactReasons()
{
string root = FindRepoRoot();
string alphaTranscript = File.ReadAllText(Path.Combine(
root,
"tests",
"AcDream.App.Tests",
"Rendering",
"Walk",
"WalkTraceConformanceTests.AlphaDepthTranscript.cs"));
Assert.Contains("THREE independent reasons", alphaTranscript, StringComparison.Ordinal);
Assert.Contains("GfxObj/particle mesh content at all", alphaTranscript, StringComparison.Ordinal);
Assert.Contains("AP-238 coalesces transparent", alphaTranscript, StringComparison.Ordinal);
Assert.Contains("one token per <c>(cell,list)</c>", alphaTranscript, StringComparison.Ordinal);
Assert.Contains("AP-239/AP-240 change", alphaTranscript, StringComparison.Ordinal);
Assert.Contains(
"former broad \"per instance versus per subset\" explanation was false.",
alphaTranscript,
StringComparison.Ordinal);
}
private static string FindRepoRoot()
{
string? directory = AppContext.BaseDirectory;
@ -907,7 +955,7 @@ public sealed class WalkStaticStreamPopulatorTests
"DeferTransparentGroups",
BindingFlags.Instance | BindingFlags.NonPublic)!;
defer.Invoke(fx.Dispatcher, [Vector3.Zero, Matrix4x4.Identity]);
defer.Invoke(fx.Dispatcher, [Matrix4x4.Identity]);
Assert.Equal(0, fx.AlphaQueue!.PendingCount);
Assert.Contains(
@ -947,7 +995,6 @@ public sealed class WalkStaticStreamPopulatorTests
Translucency = TranslucencyKind.AlphaBlend,
};
group.Matrices.Add(Matrix4x4.Identity);
group.LocalSortCenters.Add(Vector3.Zero);
group.SubmissionOrders.Add(0);
group.Slots.Add(0);
group.LightSets.Add(WbDrawDispatcher.InstanceLightSet.Disabled);

View file

@ -1,4 +1,5 @@
using System.Numerics;
using System.Reflection;
using AcDream.App.Rendering.Scene;
using AcDream.App.Rendering.Wb;
using AcDream.Core.Meshing;
@ -104,7 +105,6 @@ public class InstanceGroupClearTests
deferTransparent: true,
opaque: [],
transparent: [first, second],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
var reversedMaterialGroups =
WbDrawDispatcher.CreateDispatcherSubmission(
@ -113,7 +113,6 @@ public class InstanceGroupClearTests
deferTransparent: true,
opaque: [],
transparent: [second, first],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
Assert.Equal(
@ -128,7 +127,6 @@ public class InstanceGroupClearTests
deferTransparent: true,
opaque: [],
transparent: [first, second],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
Assert.NotEqual(
@ -154,7 +152,6 @@ public class InstanceGroupClearTests
deferTransparent: false,
opaque: [],
transparent: [],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
CurrentRenderDispatcherSubmission actual =
WbDrawDispatcher.CreateDispatcherSubmission(
@ -163,7 +160,6 @@ public class InstanceGroupClearTests
deferTransparent: false,
opaque: [stale],
transparent: [stale],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
Assert.Equal(expected, actual);
@ -188,7 +184,6 @@ public class InstanceGroupClearTests
deferTransparent: true,
opaque: [],
transparent: [ordinary],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
CurrentRenderDispatcherSubmission buildingSubmission =
WbDrawDispatcher.CreateDispatcherSubmission(
@ -197,7 +192,6 @@ public class InstanceGroupClearTests
deferTransparent: true,
opaque: [],
transparent: [building],
cameraWorldPosition: Vector3.Zero,
alphaScratch: scratch);
Assert.NotEqual(
@ -208,6 +202,63 @@ public class InstanceGroupClearTests
buildingSubmission.TransparentSetDigest);
}
[Fact]
public void ClassicGroupedShapes_DeleteDeadSortCenterSidecarsButRetainWalkCyptKey()
{
Assert.Null(typeof(CachedBatch).GetProperty("LocalSortCenter"));
Assert.Null(typeof(WbDrawDispatcher.InstanceGroup).GetField("LocalSortCenters"));
Type walkBatch = typeof(WbDrawDispatcher).GetNestedType(
"WalkClassifiedBatch",
BindingFlags.NonPublic)
?? throw new InvalidOperationException("WalkClassifiedBatch was not found.");
Assert.Equal(typeof(Vector3), walkBatch.GetProperty("LocalSortCenter")?.PropertyType);
Assert.Equal(typeof(float), walkBatch.GetProperty("SortDistanceSq")?.PropertyType);
}
[Fact]
public void AlphaSubmissionShapes_DeleteDeadCameraChainButRetainOpaqueCameraDistance()
{
Type dispatcher = typeof(WbDrawDispatcher);
MethodInfo defer = dispatcher.GetMethod(
"DeferTransparentGroups",
BindingFlags.Instance | BindingFlags.NonPublic)
?? throw new InvalidOperationException("DeferTransparentGroups was not found.");
MethodInfo transparentDigest = dispatcher.GetMethod(
"BuildTransparentSubmissionDigest",
BindingFlags.Static | BindingFlags.NonPublic)
?? throw new InvalidOperationException("BuildTransparentSubmissionDigest was not found.");
MethodInfo createSubmission = dispatcher.GetMethod(
"CreateDispatcherSubmission",
BindingFlags.Static | BindingFlags.NonPublic)
?? throw new InvalidOperationException("CreateDispatcherSubmission was not found.");
MethodInfo observeCurrent = dispatcher.GetMethod(
"ObserveCurrentDispatcherSubmission",
BindingFlags.Instance | BindingFlags.NonPublic)
?? throw new InvalidOperationException("ObserveCurrentDispatcherSubmission was not found.");
MethodInfo observeClassified = dispatcher.GetMethod(
"ObserveClassifiedDispatcherSubmission",
BindingFlags.Instance | BindingFlags.NonPublic)
?? throw new InvalidOperationException("ObserveClassifiedDispatcherSubmission was not found.");
Assert.Equal([typeof(Matrix4x4)], defer.GetParameters().Select(static p => p.ParameterType));
Assert.DoesNotContain(transparentDigest.GetParameters(), static p => p.ParameterType == typeof(Vector3));
Assert.DoesNotContain(createSubmission.GetParameters(), static p => p.ParameterType == typeof(Vector3));
Assert.DoesNotContain(observeCurrent.GetParameters(), static p => p.ParameterType == typeof(Vector3));
Assert.DoesNotContain(observeClassified.GetParameters(), static p => p.ParameterType == typeof(Vector3));
MethodInfo partition = dispatcher.GetMethod(
"PartitionInstanceGroups",
BindingFlags.Static | BindingFlags.NonPublic)
?? throw new InvalidOperationException("PartitionInstanceGroups was not found.");
Assert.Contains(
partition.GetParameters(),
static p => p.Name == "cameraWorldPosition" && p.ParameterType == typeof(Vector3));
Assert.Equal(
typeof(float),
typeof(WbDrawDispatcher.InstanceGroup).GetField("SortDistance")?.FieldType);
}
[Fact]
public void CachedGroupHandle_RequiresLiveMatchingRegistration()
{
@ -392,7 +443,6 @@ public class InstanceGroupClearTests
Translucency = TranslucencyKind.AlphaBlend,
};
group.Matrices.Add(Matrix4x4.CreateTranslation(10f, 0f, 0f));
group.LocalSortCenters.Add(Vector3.Zero);
group.SubmissionOrders.Add(submissionOrder);
group.Slots.Add(0u);
group.LightSets.Add(WbDrawDispatcher.InstanceLightSet.Disabled);
@ -404,9 +454,9 @@ public class InstanceGroupClearTests
}
// #193 (regression from #188, 2026-07-09): WbDrawDispatcher's InstanceGroup holds
// nine per-instance parallel lists — Matrices, LocalSortCenters,
// SubmissionOrders, Slots, LightSets, IndoorFlags, Opacities, and
// DetailCategories, SelectionLighting — appended in lockstep
// eight per-instance parallel lists — Matrices, SubmissionOrders, Slots,
// LightSets, IndoorFlags, Opacities, DetailCategories, and
// SelectionLighting — appended in lockstep
// (one entry per drawn instance) every frame. The
// per-frame reset must clear ALL of them. #188 added Opacities but left it out of
// the inline clear loop, so it grew one float per instance per frame forever; as
@ -418,7 +468,6 @@ public class InstanceGroupClearTests
{
var grp = new WbDrawDispatcher.InstanceGroup();
grp.Matrices.Add(Matrix4x4.Identity);
grp.LocalSortCenters.Add(Vector3.Zero);
grp.SubmissionOrders.Add(0);
grp.Slots.Add(1u);
grp.LightSets.Add(WbDrawDispatcher.InstanceLightSet.Disabled);
@ -430,7 +479,6 @@ public class InstanceGroupClearTests
grp.ClearPerInstanceData();
Assert.Empty(grp.Matrices);
Assert.Empty(grp.LocalSortCenters);
Assert.Empty(grp.SubmissionOrders);
Assert.Empty(grp.Slots);
Assert.Empty(grp.LightSets);