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>
56 lines
2.4 KiB
C#
56 lines
2.4 KiB
C#
using System.Numerics;
|
|
using AcDream.App.Rendering.Gpu;
|
|
|
|
namespace AcDream.App.Rendering.Wb;
|
|
|
|
/// <summary>
|
|
/// Per-(entity, partIdx, batchIdx) classification result, stored flat inside
|
|
/// <see cref="EntityCacheEntry.Batches"/>. For Setup multi-part MeshRefs each
|
|
/// subPart contributes its own <see cref="CachedBatch"/> entries, with
|
|
/// <see cref="RestPose"/> already containing the
|
|
/// <c>subPart.PartTransform * meshRef.PartTransform</c> product.
|
|
/// <see cref="Group"/> is a registration-checked fast handle into the
|
|
/// dispatcher's bounded group table; a retired or synthetic entry falls back
|
|
/// to key lookup and refreshes this array entry.
|
|
///
|
|
/// Accessibility: <c>internal</c> because <see cref="GroupKey"/> is
|
|
/// <c>internal</c> and shows up in this struct's constructor / <c>Deconstruct</c>
|
|
/// signature. The cache itself is dispatcher-internal coordination state;
|
|
/// <see cref="InternalsVisibleTo"/> on <c>AcDream.App</c> exposes the type to
|
|
/// <c>AcDream.Core.Tests</c>.
|
|
/// </summary>
|
|
internal readonly record struct CachedBatch(
|
|
GroupKey Key,
|
|
GpuTextureSlot TextureSlot,
|
|
Matrix4x4 RestPose,
|
|
WbDrawDispatcher.InstanceGroup? Group = null,
|
|
long GroupRegistration = 0);
|
|
|
|
/// <summary>
|
|
/// Immutable retail-picking descriptor for one static entity part. The cache
|
|
/// stores only authored identity and rest pose; the current entity transform
|
|
/// and the selection system's live frustum/geometry verdict remain per-frame.
|
|
/// </summary>
|
|
internal readonly record struct CachedSelectionPart(
|
|
int PartIndex,
|
|
uint GfxObjId,
|
|
Matrix4x4 RestPose);
|
|
|
|
/// <summary>
|
|
/// One entity's cached classification. <see cref="Batches"/> is flat across
|
|
/// (partIdx, batchIdx) and ordered as <c>WbDrawDispatcher.ClassifyBatches</c>
|
|
/// produced them. <see cref="LandblockHint"/> lets
|
|
/// <see cref="EntityClassificationCache.InvalidateLandblock"/> sweep entries
|
|
/// efficiently when a landblock demotes or unloads.
|
|
///
|
|
/// Accessibility: <c>internal</c> for the same reason as <see cref="CachedBatch"/>
|
|
/// — its <see cref="Batches"/> property is <c>CachedBatch[]</c>, which
|
|
/// transitively involves <see cref="GroupKey"/>.
|
|
/// </summary>
|
|
internal sealed class EntityCacheEntry
|
|
{
|
|
public required uint EntityId { get; init; }
|
|
public required uint LandblockHint { get; init; }
|
|
public required CachedBatch[] Batches { get; init; }
|
|
public CachedSelectionPart[] SelectionParts { get; init; } = [];
|
|
}
|