fix(rendering): preserve exact scene traversal order
This commit is contained in:
parent
06e7754619
commit
e0f36caa70
12 changed files with 500 additions and 77 deletions
|
|
@ -262,6 +262,79 @@ public sealed class RenderScenePViewFrameProductTests
|
|||
Assert.Equal(2, logs.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Controller_RejectsEqualMembershipInDifferentTraversalOrder()
|
||||
{
|
||||
WorldEntity first =
|
||||
Entity(1_000_001, 0x8000_0001, parentCell: null);
|
||||
WorldEntity second =
|
||||
Entity(1_000_002, 0x8000_0002, parentCell: null);
|
||||
var oracle = new CurrentRenderSceneOracle();
|
||||
var partition = new InteriorEntityPartition.Result();
|
||||
InteriorEntityPartition.Partition(
|
||||
partition,
|
||||
[],
|
||||
[Entry([first, second])],
|
||||
oracle);
|
||||
oracle.BeginPViewFrame();
|
||||
oracle.ObservePViewBucket(
|
||||
CurrentRenderPViewRoute.DynamicLast,
|
||||
0,
|
||||
0,
|
||||
[first, second]);
|
||||
oracle.CompletePViewFrame();
|
||||
oracle.BeginDispatcherFrame();
|
||||
oracle.ObserveDispatcherDraw(
|
||||
WbDrawDispatcher.EntitySet.All,
|
||||
entitiesWalked: 2,
|
||||
[
|
||||
(first, 0, Landblock),
|
||||
(second, 0, Landblock),
|
||||
]);
|
||||
|
||||
using var shadow = new RenderSceneShadowRuntime(Generation);
|
||||
RenderProjectionRecord firstRecord = Project(first) with
|
||||
{
|
||||
SortKey = new RenderSortKey(2),
|
||||
};
|
||||
RenderProjectionRecord secondRecord = Project(second) with
|
||||
{
|
||||
SortKey = new RenderSortKey(1),
|
||||
};
|
||||
shadow.Journal.Register(in firstRecord);
|
||||
shadow.Journal.Register(in secondRecord);
|
||||
shadow.DrainUpdateBoundary();
|
||||
var controller = new RenderScenePViewFrameProductController(
|
||||
shadow,
|
||||
oracle);
|
||||
PortalVisibilityFrame portal = Portal(Cell);
|
||||
ClipFrameAssembly clip = FullScreenClip(Cell);
|
||||
ViewconeCuller viewcone =
|
||||
ViewconeCuller.Build(clip, Matrix4x4.Identity);
|
||||
|
||||
controller.BuildAndCompare(
|
||||
portal,
|
||||
clip,
|
||||
viewcone,
|
||||
[],
|
||||
[],
|
||||
EmptyCellSource.Instance,
|
||||
[],
|
||||
Landblock,
|
||||
rootIsOutdoor: true);
|
||||
|
||||
RenderFrameProductComparisonSnapshot snapshot =
|
||||
controller.Snapshot;
|
||||
Assert.Equal(1, snapshot.MismatchCount);
|
||||
Assert.Contains(
|
||||
$"ProjectionId = {LiveRenderProjectionJournal.ProjectionId(first.Id)}",
|
||||
snapshot.FirstMismatch);
|
||||
Assert.Contains(
|
||||
$"ProjectionId = {LiveRenderProjectionJournal.ProjectionId(second.Id)}",
|
||||
snapshot.FirstMismatch);
|
||||
Assert.Equal(1, snapshot.PackedInputMismatchCount);
|
||||
}
|
||||
|
||||
private static RenderProjectionRecord Project(WorldEntity entity)
|
||||
{
|
||||
bool dynamic = entity.ServerGuid != 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue