fix: preserve camera submission order on sort ties
This commit is contained in:
@@ -21,7 +21,7 @@ bool CompareCameraRenderRequest(const CameraRenderRequest& lhs, const CameraRend
|
|||||||
return lhs.cameraDepth < rhs.cameraDepth;
|
return lhs.cameraDepth < rhs.cameraDepth;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lhs.camera < rhs.camera;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsUsableCamera(const Components::CameraComponent* camera) {
|
bool IsUsableCamera(const Components::CameraComponent* camera) {
|
||||||
@@ -125,7 +125,7 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
|
|||||||
return lhs->GetDepth() < rhs->GetDepth();
|
return lhs->GetDepth() < rhs->GetDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
return lhs < rhs;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
size_t renderedBaseCameraCount = 0;
|
size_t renderedBaseCameraCount = 0;
|
||||||
|
|||||||
@@ -509,6 +509,30 @@ TEST(SceneRenderer_Test, RendersBaseCamerasBeforeOverlayCamerasAndResolvesAutoCl
|
|||||||
EXPECT_EQ(requests[2].clearFlags, RenderClearFlags::Depth);
|
EXPECT_EQ(requests[2].clearFlags, RenderClearFlags::Depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(SceneRenderer_Test, PreservesSceneTraversalOrderForEqualPriorityCameras) {
|
||||||
|
Scene scene("SceneRendererStableSceneOrder");
|
||||||
|
|
||||||
|
GameObject* firstCameraObject = scene.CreateGameObject("FirstCamera");
|
||||||
|
auto* firstCamera = firstCameraObject->AddComponent<CameraComponent>();
|
||||||
|
firstCamera->SetPrimary(false);
|
||||||
|
firstCamera->SetDepth(2.0f);
|
||||||
|
firstCamera->SetStackType(CameraStackType::Base);
|
||||||
|
|
||||||
|
GameObject* secondCameraObject = scene.CreateGameObject("SecondCamera");
|
||||||
|
auto* secondCamera = secondCameraObject->AddComponent<CameraComponent>();
|
||||||
|
secondCamera->SetPrimary(false);
|
||||||
|
secondCamera->SetDepth(2.0f);
|
||||||
|
secondCamera->SetStackType(CameraStackType::Base);
|
||||||
|
|
||||||
|
SceneRenderer renderer;
|
||||||
|
const std::vector<CameraRenderRequest> requests =
|
||||||
|
renderer.BuildRenderRequests(scene, nullptr, CreateValidContext(), RenderSurface(640, 360));
|
||||||
|
|
||||||
|
ASSERT_EQ(requests.size(), 2u);
|
||||||
|
EXPECT_EQ(requests[0].camera, firstCamera);
|
||||||
|
EXPECT_EQ(requests[1].camera, secondCamera);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(SceneRenderer_Test, FallsBackToColorClearForFirstOverlayCameraWhenNoBaseCameraExists) {
|
TEST(SceneRenderer_Test, FallsBackToColorClearForFirstOverlayCameraWhenNoBaseCameraExists) {
|
||||||
Scene scene("SceneRendererOverlayOnlyScene");
|
Scene scene("SceneRendererOverlayOnlyScene");
|
||||||
|
|
||||||
@@ -761,3 +785,38 @@ TEST(SceneRenderer_Test, SortsManualCameraRequestsByDepthBeforeRendering) {
|
|||||||
EXPECT_EQ(state->renderedCameras[1], farCamera);
|
EXPECT_EQ(state->renderedCameras[1], farCamera);
|
||||||
EXPECT_EQ(state->renderedClearFlags[1], RenderClearFlags::None);
|
EXPECT_EQ(state->renderedClearFlags[1], RenderClearFlags::None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(SceneRenderer_Test, PreservesManualSubmissionOrderForEqualPriorityRequests) {
|
||||||
|
Scene scene("SceneRendererManualSubmissionOrder");
|
||||||
|
|
||||||
|
GameObject* firstCameraObject = scene.CreateGameObject("FirstCamera");
|
||||||
|
auto* firstCamera = firstCameraObject->AddComponent<CameraComponent>();
|
||||||
|
firstCamera->SetPrimary(false);
|
||||||
|
firstCamera->SetDepth(2.0f);
|
||||||
|
|
||||||
|
GameObject* secondCameraObject = scene.CreateGameObject("SecondCamera");
|
||||||
|
auto* secondCamera = secondCameraObject->AddComponent<CameraComponent>();
|
||||||
|
secondCamera->SetPrimary(false);
|
||||||
|
secondCamera->SetDepth(2.0f);
|
||||||
|
|
||||||
|
auto state = std::make_shared<MockPipelineState>();
|
||||||
|
SceneRenderer renderer(std::make_unique<MockPipeline>(state));
|
||||||
|
|
||||||
|
CameraRenderRequest firstRequest;
|
||||||
|
firstRequest.scene = &scene;
|
||||||
|
firstRequest.camera = firstCamera;
|
||||||
|
firstRequest.context = CreateValidContext();
|
||||||
|
firstRequest.surface = RenderSurface(800, 600);
|
||||||
|
firstRequest.cameraDepth = 2.0f;
|
||||||
|
firstRequest.cameraStackOrder = 0;
|
||||||
|
firstRequest.clearFlags = RenderClearFlags::All;
|
||||||
|
|
||||||
|
CameraRenderRequest secondRequest = firstRequest;
|
||||||
|
secondRequest.camera = secondCamera;
|
||||||
|
|
||||||
|
const std::vector<CameraRenderRequest> requests = { secondRequest, firstRequest };
|
||||||
|
ASSERT_TRUE(renderer.Render(requests));
|
||||||
|
ASSERT_EQ(state->renderedCameras.size(), 2u);
|
||||||
|
EXPECT_EQ(state->renderedCameras[0], secondCamera);
|
||||||
|
EXPECT_EQ(state->renderedCameras[1], firstCamera);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user