diff --git a/editor/src/Viewport/ViewportHostService.h b/editor/src/Viewport/ViewportHostService.h index 94744be4..803eae56 100644 --- a/editor/src/Viewport/ViewportHostService.h +++ b/editor/src/Viewport/ViewportHostService.h @@ -642,7 +642,6 @@ private: const Components::Scene* scene, const Rendering::RenderContext& renderContext, Rendering::RenderSurface& surface) { - surface.SetClearColorOverride(Math::Color(0.27f, 0.27f, 0.27f, 1.0f)); if (!EnsureSceneViewCamera()) { ApplyViewportRenderFailure( entry, @@ -681,6 +680,8 @@ private: entry.renderTargets, &sceneState.postPasses, requests[0]); + requests[0].hasClearColorOverride = true; + requests[0].clearColorOverride = Math::Color(0.27f, 0.27f, 0.27f, 1.0f); if (!m_sceneRenderer->Render(requests)) { ApplyViewportRenderFailure( diff --git a/engine/include/XCEngine/Rendering/CameraRenderRequest.h b/engine/include/XCEngine/Rendering/CameraRenderRequest.h index b58911cc..93e34884 100644 --- a/engine/include/XCEngine/Rendering/CameraRenderRequest.h +++ b/engine/include/XCEngine/Rendering/CameraRenderRequest.h @@ -39,6 +39,8 @@ struct CameraRenderRequest { float cameraDepth = 0.0f; uint8_t cameraStackOrder = 0; RenderClearFlags clearFlags = RenderClearFlags::All; + bool hasClearColorOverride = false; + Math::Color clearColorOverride = Math::Color::Black(); RenderPassSequence* preScenePasses = nullptr; RenderPassSequence* postScenePasses = nullptr; diff --git a/engine/src/Rendering/CameraRenderer.cpp b/engine/src/Rendering/CameraRenderer.cpp index 6e2bd013..eaeb1a2b 100644 --- a/engine/src/Rendering/CameraRenderer.cpp +++ b/engine/src/Rendering/CameraRenderer.cpp @@ -146,6 +146,9 @@ bool CameraRenderer::Render( } sceneData.cameraData.clearFlags = request.clearFlags; + if (request.hasClearColorOverride) { + sceneData.cameraData.clearColor = request.clearColorOverride; + } const RenderPassContext passContext = { request.context, request.surface, diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 404a7fa7..9db46a90 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -33,8 +33,10 @@ struct MockPipelineState { CameraComponent* lastCamera = nullptr; size_t lastVisibleItemCount = 0; RenderClearFlags lastClearFlags = RenderClearFlags::All; + XCEngine::Math::Color lastClearColor = XCEngine::Math::Color::Black(); std::vector renderedCameras; std::vector renderedClearFlags; + std::vector renderedClearColors; std::vector eventLog; }; @@ -76,8 +78,10 @@ public: m_state->lastCameraViewportHeight = sceneData.cameraData.viewportHeight; m_state->lastVisibleItemCount = sceneData.visibleItems.size(); m_state->lastClearFlags = sceneData.cameraData.clearFlags; + m_state->lastClearColor = sceneData.cameraData.clearColor; m_state->renderedCameras.push_back(sceneData.camera); m_state->renderedClearFlags.push_back(sceneData.cameraData.clearFlags); + m_state->renderedClearColors.push_back(sceneData.cameraData.clearColor); return m_state->renderResult; } @@ -213,6 +217,37 @@ TEST(CameraRenderer_Test, UsesOverrideCameraAndSurfaceSizeWhenSubmittingScene) { EXPECT_NE(state->lastCamera, primaryCamera); EXPECT_EQ(state->lastVisibleItemCount, 0u); EXPECT_EQ(state->lastClearFlags, RenderClearFlags::None); + EXPECT_FLOAT_EQ(state->lastClearColor.r, overrideCamera->GetClearColor().r); + EXPECT_FLOAT_EQ(state->lastClearColor.g, overrideCamera->GetClearColor().g); + EXPECT_FLOAT_EQ(state->lastClearColor.b, overrideCamera->GetClearColor().b); + EXPECT_FLOAT_EQ(state->lastClearColor.a, overrideCamera->GetClearColor().a); +} + +TEST(CameraRenderer_Test, AppliesRequestClearColorOverrideToSceneData) { + Scene scene("CameraRendererClearColorOverrideScene"); + + GameObject* cameraObject = scene.CreateGameObject("Camera"); + auto* camera = cameraObject->AddComponent(); + camera->SetPrimary(true); + camera->SetDepth(1.0f); + camera->SetClearColor(XCEngine::Math::Color(0.05f, 0.10f, 0.15f, 1.0f)); + + auto state = std::make_shared(); + CameraRenderer renderer(std::make_unique(state)); + + CameraRenderRequest request; + request.scene = &scene; + request.camera = camera; + request.context = CreateValidContext(); + request.surface = RenderSurface(320, 200); + request.hasClearColorOverride = true; + request.clearColorOverride = XCEngine::Math::Color(0.27f, 0.27f, 0.27f, 1.0f); + + ASSERT_TRUE(renderer.Render(request)); + EXPECT_FLOAT_EQ(state->lastClearColor.r, 0.27f); + EXPECT_FLOAT_EQ(state->lastClearColor.g, 0.27f); + EXPECT_FLOAT_EQ(state->lastClearColor.b, 0.27f); + EXPECT_FLOAT_EQ(state->lastClearColor.a, 1.0f); } TEST(CameraRenderer_Test, ExecutesInjectedPreAndPostPassSequencesAroundPipelineRender) {