refactor(rendering): move scene request shadow planning behind pipeline assets
This commit is contained in:
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user