diff --git a/engine/src/Rendering/SceneRenderer.cpp b/engine/src/Rendering/SceneRenderer.cpp index b4e44bc8..266c660f 100644 --- a/engine/src/Rendering/SceneRenderer.cpp +++ b/engine/src/Rendering/SceneRenderer.cpp @@ -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 SceneRenderer::BuildRenderRequests( return lhs->GetDepth() < rhs->GetDepth(); } - return lhs < rhs; + return false; }); size_t renderedBaseCameraCount = 0; diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 9db46a90..d81f8759 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -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(); + firstCamera->SetPrimary(false); + firstCamera->SetDepth(2.0f); + firstCamera->SetStackType(CameraStackType::Base); + + GameObject* secondCameraObject = scene.CreateGameObject("SecondCamera"); + auto* secondCamera = secondCameraObject->AddComponent(); + secondCamera->SetPrimary(false); + secondCamera->SetDepth(2.0f); + secondCamera->SetStackType(CameraStackType::Base); + + SceneRenderer renderer; + const std::vector 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(); + firstCamera->SetPrimary(false); + firstCamera->SetDepth(2.0f); + + GameObject* secondCameraObject = scene.CreateGameObject("SecondCamera"); + auto* secondCamera = secondCameraObject->AddComponent(); + secondCamera->SetPrimary(false); + secondCamera->SetDepth(2.0f); + + auto state = std::make_shared(); + SceneRenderer renderer(std::make_unique(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 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); +}