refactor(rendering): move scene request shadow planning behind pipeline assets

This commit is contained in:
2026-04-15 22:25:04 +08:00
parent cf1d6e1c1a
commit a8c1337774
6 changed files with 173 additions and 31 deletions

View File

@@ -1,6 +1,7 @@
#include <gtest/gtest.h>
#include <XCEngine/Components/CameraComponent.h>
#include <XCEngine/Components/LightComponent.h>
#include <XCEngine/RHI/RHICommandList.h>
#include <XCEngine/RHI/RHICommandQueue.h>
#include <XCEngine/RHI/RHIDevice.h>
@@ -420,10 +421,16 @@ public:
struct MockPipelineAssetState {
int createCalls = 0;
int configureCameraRenderRequestCalls = 0;
int configureCameraFramePlanCalls = 0;
bool createNullPipeline = false;
std::shared_ptr<MockPipelineState> lastCreatedPipelineState;
FinalColorSettings defaultFinalColorSettings = {};
std::function<void(
CameraRenderRequest&,
size_t,
size_t,
const DirectionalShadowPlanningSettings&)> configureCameraRenderRequest = {};
std::function<void(CameraFramePlan&)> configureCameraFramePlan = {};
};
@@ -705,6 +712,28 @@ public:
return m_state->defaultFinalColorSettings;
}
void ConfigureCameraRenderRequest(
CameraRenderRequest& request,
size_t renderedBaseCameraCount,
size_t renderedRequestCount,
const DirectionalShadowPlanningSettings& directionalShadowSettings) const override {
++m_state->configureCameraRenderRequestCalls;
if (m_state->configureCameraRenderRequest) {
m_state->configureCameraRenderRequest(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
return;
}
RenderPipelineAsset::ConfigureCameraRenderRequest(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
}
void ConfigureCameraFramePlan(CameraFramePlan& plan) const override {
++m_state->configureCameraFramePlanCalls;
if (m_state->configureCameraFramePlan) {
@@ -3322,6 +3351,43 @@ TEST(SceneRenderer_Test, UsesPipelineAssetCameraFramePlanConfigurationHook) {
EXPECT_FALSE(plan.finalOutput.IsRequested());
}
TEST(SceneRenderer_Test, UsesPipelineAssetCameraRenderRequestConfigurationHook) {
Scene scene("SceneRendererRequestConfigurationHookScene");
GameObject* cameraObject = scene.CreateGameObject("Camera");
auto* camera = cameraObject->AddComponent<CameraComponent>();
camera->SetPrimary(true);
camera->SetDepth(2.0f);
GameObject* shadowLightObject = scene.CreateGameObject("ShadowLight");
auto* shadowLight = shadowLightObject->AddComponent<LightComponent>();
shadowLight->SetLightType(LightType::Directional);
shadowLight->SetCastsShadows(true);
auto assetState = std::make_shared<MockPipelineAssetState>();
assetState->configureCameraRenderRequest =
[](
CameraRenderRequest& request,
size_t renderedBaseCameraCount,
size_t renderedRequestCount,
const DirectionalShadowPlanningSettings& directionalShadowSettings) {
ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
directionalShadowSettings);
request.directionalShadow = {};
};
SceneRenderer renderer(std::make_shared<MockPipelineAsset>(assetState));
const std::vector<CameraFramePlan> plans =
renderer.BuildFramePlans(scene, nullptr, CreateValidContext(), RenderSurface(640, 360));
ASSERT_EQ(plans.size(), 1u);
EXPECT_EQ(assetState->configureCameraRenderRequestCalls, 1);
EXPECT_FALSE(plans[0].directionalShadow.IsValid());
}
TEST(SceneRenderer_Test, BuildsFinalOutputRequestFromResolvedFinalColorPolicy) {
Scene scene("SceneRendererFinalOutputScene");