refactor(rendering): move frame plan defaults behind pipeline assets

This commit is contained in:
2026-04-15 21:22:29 +08:00
parent 02aa9a8ea5
commit 215c353ace
6 changed files with 97 additions and 23 deletions

View File

@@ -21,6 +21,7 @@
#include <XCEngine/Scene/Scene.h>
#include "Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h"
#include <functional>
#include <memory>
#include <string>
#include <utility>
@@ -412,8 +413,10 @@ public:
struct MockPipelineAssetState {
int createCalls = 0;
int configureCameraFramePlanCalls = 0;
std::shared_ptr<MockPipelineState> lastCreatedPipelineState;
FinalColorSettings defaultFinalColorSettings = {};
std::function<void(CameraFramePlan&)> configureCameraFramePlan = {};
};
struct MockStageRecorderState {
@@ -659,6 +662,16 @@ public:
return m_state->defaultFinalColorSettings;
}
void ConfigureCameraFramePlan(CameraFramePlan& plan) const override {
++m_state->configureCameraFramePlanCalls;
if (m_state->configureCameraFramePlan) {
m_state->configureCameraFramePlan(plan);
return;
}
RenderPipelineAsset::ConfigureCameraFramePlan(plan);
}
private:
std::shared_ptr<MockPipelineAssetState> m_state;
};
@@ -3109,6 +3122,47 @@ TEST(SceneRenderer_Test, ResolvesFinalColorPolicyFromPipelineDefaultsAndCameraOv
EXPECT_FALSE(plan.finalOutput.IsRequested());
}
TEST(SceneRenderer_Test, UsesPipelineAssetCameraFramePlanConfigurationHook) {
Scene scene("SceneRendererPlanConfigurationHookScene");
GameObject* cameraObject = scene.CreateGameObject("Camera");
auto* camera = cameraObject->AddComponent<CameraComponent>();
camera->SetPrimary(true);
camera->SetDepth(2.0f);
camera->SetPostProcessPasses({
XCEngine::Rendering::CameraPostProcessPassDesc::MakeColorScale(
XCEngine::Math::Vector4(1.0f, 0.75f, 0.75f, 1.0f))
});
FinalColorOverrideSettings cameraOverrides = {};
cameraOverrides.overrideOutputTransferMode = true;
cameraOverrides.outputTransferMode = FinalColorOutputTransferMode::LinearToSRGB;
camera->SetFinalColorOverrides(cameraOverrides);
auto assetState = std::make_shared<MockPipelineAssetState>();
assetState->configureCameraFramePlan = [](
CameraFramePlan& plan) {
plan.ClearOwnedPostProcessSequence();
plan.ClearOwnedFinalOutputSequence();
plan.finalColorPolicy = {};
plan.postProcess = {};
plan.finalOutput = {};
plan.colorChain = {};
};
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->configureCameraFramePlanCalls, 1);
const CameraFramePlan& plan = plans[0];
EXPECT_FALSE(plan.finalColorPolicy.hasPipelineDefaults);
EXPECT_FALSE(plan.finalColorPolicy.hasCameraOverrides);
EXPECT_FALSE(plan.postProcess.IsRequested());
EXPECT_FALSE(plan.finalOutput.IsRequested());
}
TEST(SceneRenderer_Test, BuildsFinalOutputRequestFromResolvedFinalColorPolicy) {
Scene scene("SceneRendererFinalOutputScene");