feat: add camera render clear color override

This commit is contained in:
2026-04-01 22:49:26 +08:00
parent 0a0544cbe4
commit 8cd7fc0ca1
4 changed files with 42 additions and 1 deletions

View File

@@ -642,7 +642,6 @@ private:
const Components::Scene* scene, const Components::Scene* scene,
const Rendering::RenderContext& renderContext, const Rendering::RenderContext& renderContext,
Rendering::RenderSurface& surface) { Rendering::RenderSurface& surface) {
surface.SetClearColorOverride(Math::Color(0.27f, 0.27f, 0.27f, 1.0f));
if (!EnsureSceneViewCamera()) { if (!EnsureSceneViewCamera()) {
ApplyViewportRenderFailure( ApplyViewportRenderFailure(
entry, entry,
@@ -681,6 +680,8 @@ private:
entry.renderTargets, entry.renderTargets,
&sceneState.postPasses, &sceneState.postPasses,
requests[0]); requests[0]);
requests[0].hasClearColorOverride = true;
requests[0].clearColorOverride = Math::Color(0.27f, 0.27f, 0.27f, 1.0f);
if (!m_sceneRenderer->Render(requests)) { if (!m_sceneRenderer->Render(requests)) {
ApplyViewportRenderFailure( ApplyViewportRenderFailure(

View File

@@ -39,6 +39,8 @@ struct CameraRenderRequest {
float cameraDepth = 0.0f; float cameraDepth = 0.0f;
uint8_t cameraStackOrder = 0; uint8_t cameraStackOrder = 0;
RenderClearFlags clearFlags = RenderClearFlags::All; RenderClearFlags clearFlags = RenderClearFlags::All;
bool hasClearColorOverride = false;
Math::Color clearColorOverride = Math::Color::Black();
RenderPassSequence* preScenePasses = nullptr; RenderPassSequence* preScenePasses = nullptr;
RenderPassSequence* postScenePasses = nullptr; RenderPassSequence* postScenePasses = nullptr;

View File

@@ -146,6 +146,9 @@ bool CameraRenderer::Render(
} }
sceneData.cameraData.clearFlags = request.clearFlags; sceneData.cameraData.clearFlags = request.clearFlags;
if (request.hasClearColorOverride) {
sceneData.cameraData.clearColor = request.clearColorOverride;
}
const RenderPassContext passContext = { const RenderPassContext passContext = {
request.context, request.context,
request.surface, request.surface,

View File

@@ -33,8 +33,10 @@ struct MockPipelineState {
CameraComponent* lastCamera = nullptr; CameraComponent* lastCamera = nullptr;
size_t lastVisibleItemCount = 0; size_t lastVisibleItemCount = 0;
RenderClearFlags lastClearFlags = RenderClearFlags::All; RenderClearFlags lastClearFlags = RenderClearFlags::All;
XCEngine::Math::Color lastClearColor = XCEngine::Math::Color::Black();
std::vector<CameraComponent*> renderedCameras; std::vector<CameraComponent*> renderedCameras;
std::vector<RenderClearFlags> renderedClearFlags; std::vector<RenderClearFlags> renderedClearFlags;
std::vector<XCEngine::Math::Color> renderedClearColors;
std::vector<std::string> eventLog; std::vector<std::string> eventLog;
}; };
@@ -76,8 +78,10 @@ public:
m_state->lastCameraViewportHeight = sceneData.cameraData.viewportHeight; m_state->lastCameraViewportHeight = sceneData.cameraData.viewportHeight;
m_state->lastVisibleItemCount = sceneData.visibleItems.size(); m_state->lastVisibleItemCount = sceneData.visibleItems.size();
m_state->lastClearFlags = sceneData.cameraData.clearFlags; m_state->lastClearFlags = sceneData.cameraData.clearFlags;
m_state->lastClearColor = sceneData.cameraData.clearColor;
m_state->renderedCameras.push_back(sceneData.camera); m_state->renderedCameras.push_back(sceneData.camera);
m_state->renderedClearFlags.push_back(sceneData.cameraData.clearFlags); m_state->renderedClearFlags.push_back(sceneData.cameraData.clearFlags);
m_state->renderedClearColors.push_back(sceneData.cameraData.clearColor);
return m_state->renderResult; return m_state->renderResult;
} }
@@ -213,6 +217,37 @@ TEST(CameraRenderer_Test, UsesOverrideCameraAndSurfaceSizeWhenSubmittingScene) {
EXPECT_NE(state->lastCamera, primaryCamera); EXPECT_NE(state->lastCamera, primaryCamera);
EXPECT_EQ(state->lastVisibleItemCount, 0u); EXPECT_EQ(state->lastVisibleItemCount, 0u);
EXPECT_EQ(state->lastClearFlags, RenderClearFlags::None); 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<CameraComponent>();
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<MockPipelineState>();
CameraRenderer renderer(std::make_unique<MockPipeline>(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) { TEST(CameraRenderer_Test, ExecutesInjectedPreAndPostPassSequencesAroundPipelineRender) {