feat(srp): add managed camera frame planning seam

Expose native camera frame planning controls to managed pipeline assets and renderer features.

Allow managed planning to override fullscreen stage heuristics while keeping CameraFramePlan as the native execution contract.

Add scripting coverage, probe assets, and archive the phase plan after build, test, and editor smoke validation.
This commit is contained in:
2026-04-20 01:48:16 +08:00
parent 58dde75d3d
commit 9e6c473186
17 changed files with 926 additions and 9 deletions

View File

@@ -12,6 +12,7 @@ namespace Rendering {
struct CameraFrameFullscreenStagePlan {
bool requested = false;
bool usesGraphManagedOutputColor = false;
bool explicitlyConfigured = false;
CameraFrameColorSource source = CameraFrameColorSource::ExplicitSurface;
};
@@ -58,8 +59,13 @@ struct CameraFramePlan {
bool RequestFullscreenStage(
CameraFrameStage stage,
CameraFrameColorSource source,
bool usesGraphManagedOutputColor = false);
void ClearFullscreenStage(CameraFrameStage stage);
bool usesGraphManagedOutputColor = false,
bool explicitlyConfigured = false);
void ClearFullscreenStage(
CameraFrameStage stage,
bool explicitlyConfigured = false);
bool HasExplicitFullscreenStageConfiguration(
CameraFrameStage stage) const;
bool IsPostProcessStageValid() const;
bool IsFinalOutputStageValid() const;
bool HasFrameStage(CameraFrameStage stage) const;

View File

@@ -10,6 +10,7 @@
namespace XCEngine {
namespace Rendering {
struct CameraFramePlan;
struct CameraRenderRequest;
struct DirectionalShadowPlanningSettings;
@@ -52,6 +53,7 @@ public:
size_t renderedRequestCount,
const DirectionalShadowPlanningSettings& directionalShadowSettings)
const override;
void ConfigureCameraFramePlan(CameraFramePlan& plan) const override;
FinalColorSettings GetDefaultFinalColorSettings() const override;
private:
@@ -82,6 +84,8 @@ public:
size_t,
const DirectionalShadowPlanningSettings&) const {
}
virtual void ConfigureCameraFramePlan(CameraFramePlan&) const {
}
virtual std::shared_ptr<const RenderPipelineAsset>
GetPipelineRendererAsset() const {

View File

@@ -266,6 +266,8 @@ private:
MonoObject* CreateManagedScriptableRenderContext(uint64_t nativeHandle);
MonoObject* CreateManagedCameraRenderRequestContext(
uint64_t nativeHandle);
MonoObject* CreateManagedScriptableRenderPipelinePlanningContext(
uint64_t nativeHandle);
MonoObject* GetManagedObject(uint32_t gcHandle) const;
MonoMethod* ResolveManagedMethod(
MonoClass* monoClass,
@@ -306,11 +308,14 @@ private:
MonoClass* m_scriptableRenderPipelineClass = nullptr;
MonoClass* m_scriptableRenderContextClass = nullptr;
MonoClass* m_cameraRenderRequestContextClass = nullptr;
MonoClass* m_scriptableRenderPipelinePlanningContextClass = nullptr;
MonoClass* m_serializeFieldAttributeClass = nullptr;
MonoMethod* m_gameObjectConstructor = nullptr;
MonoMethod* m_scriptableRenderContextConstructor = nullptr;
MonoMethod* m_cameraRenderRequestContextConstructor =
nullptr;
MonoMethod* m_scriptableRenderPipelinePlanningContextConstructor =
nullptr;
MonoClassField* m_managedGameObjectUUIDField = nullptr;
MonoClassField* m_gameObjectUUIDField = nullptr;
MonoClassField* m_scriptComponentUUIDField = nullptr;