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.camera < rhs.camera;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IsUsableCamera(const Components::CameraComponent* camera) {
|
||||
@@ -125,7 +125,7 @@ std::vector<CameraRenderRequest> SceneRenderer::BuildRenderRequests(
|
||||
return lhs->GetDepth() < rhs->GetDepth();
|
||||
}
|
||||
|
||||
return lhs < rhs;
|
||||
return false;
|
||||
});
|
||||
|
||||
size_t renderedBaseCameraCount = 0;
|
||||
|
||||
@@ -509,6 +509,30 @@ TEST(SceneRenderer_Test, RendersBaseCamerasBeforeOverlayCamerasAndResolvesAutoCl
|
||||
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) {
|
||||
Scene scene("SceneRendererOverlayOnlyScene");
|
||||
|
||||
@@ -761,3 +785,38 @@ TEST(SceneRenderer_Test, SortsManualCameraRequestsByDepthBeforeRendering) {
|
||||
EXPECT_EQ(state->renderedCameras[1], farCamera);
|
||||
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