feat: add camera render clear color override
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user