refactor(app): key live projections by runtime identity

Move materialized live-object sidecars and presentation worksets to exact RuntimeEntityKey ownership. Runtime remains the only GUID/incarnation/local-ID authority while hydration, animation, effects, lights, equipped children, renderer resources, visibility, liveness, and teardown resolve exact projection identities. Preserve synchronous callbacks, local-ID allocation order, and current rendering behavior.
This commit is contained in:
Erik 2026-07-25 21:50:58 +02:00
parent e18df84437
commit 420e5eea70
73 changed files with 2939 additions and 1715 deletions

View file

@ -73,7 +73,9 @@ public sealed class LiveEntityPresentationControllerTests
fixture.PresentationOrder);
Assert.Equal(1, fixture.Shadows.TotalRegistered);
Assert.True(fixture.Entity.IsDrawVisible);
Assert.Same(fixture.Entity, Assert.Single(fixture.Runtime.WorldEntities).Value);
Assert.Same(
fixture.Entity,
Assert.Single(fixture.Runtime.VisibleRecords).WorldEntity);
}
[Fact]
@ -289,7 +291,9 @@ public sealed class LiveEntityPresentationControllerTests
Assert.Equal(0, fixture.Shadows.TotalRegistered);
Assert.True(fixture.Runtime.RebucketLiveEntity(Fixture.Guid, 0x02020001u));
Assert.False(fixture.Runtime.WorldEntities.ContainsKey(Fixture.Guid));
Assert.False(fixture.Runtime.TryGetInteractionEligibleEntity(
Fixture.Guid,
out _));
Assert.True(fixture.Runtime.TryApplyState(
new SetState.Parsed(Fixture.Guid, 0u, 1, 3),
@ -303,7 +307,9 @@ public sealed class LiveEntityPresentationControllerTests
new LandBlock(),
Array.Empty<WorldEntity>()));
Assert.True(fixture.Runtime.WorldEntities.ContainsKey(Fixture.Guid));
Assert.True(fixture.Runtime.TryGetInteractionEligibleEntity(
Fixture.Guid,
out _));
Assert.Equal(1, fixture.Shadows.TotalRegistered);
}
@ -318,7 +324,9 @@ public sealed class LiveEntityPresentationControllerTests
Fixture.Guid,
0x02020001u));
Assert.False(fixture.Runtime.WorldEntities.ContainsKey(Fixture.Guid));
Assert.False(fixture.Runtime.TryGetInteractionEligibleEntity(
Fixture.Guid,
out _));
Assert.Equal(0, fixture.Shadows.TotalRegistered);
Assert.Equal(1, fixture.Shadows.RetainedRegistrationCount);
Assert.Equal(1, fixture.Shadows.SuspendedRegistrationCount);
@ -331,7 +339,7 @@ public sealed class LiveEntityPresentationControllerTests
Assert.Same(
fixture.Entity,
Assert.Single(fixture.Runtime.WorldEntities).Value);
Assert.Single(fixture.Runtime.VisibleRecords).WorldEntity);
Assert.Equal(1, fixture.Shadows.TotalRegistered);
Assert.Equal(0, fixture.Shadows.SuspendedRegistrationCount);
Assert.False(fixture.Controller.HasDeferredShadowRestore(Fixture.Guid));
@ -467,7 +475,7 @@ public sealed class LiveEntityPresentationControllerTests
new LandBlock(),
Array.Empty<WorldEntity>()));
Assert.Same(entity, Assert.Single(runtime.WorldEntities).Value);
Assert.Same(entity, Assert.Single(runtime.VisibleRecords).WorldEntity);
Assert.Equal(1, shadows.TotalRegistered);
Assert.Equal(0, shadows.SuspendedRegistrationCount);
Assert.False(controller.HasDeferredShadowRestore(Fixture.Guid));