refactor(srp): move directional shadow planning policy into managed urp

This commit is contained in:
2026-04-21 03:01:56 +08:00
parent 1f01f45bee
commit db08861183
8 changed files with 334 additions and 12 deletions

View File

@@ -1319,6 +1319,8 @@ public:
GetPipelineRendererAsset() const override;
std::shared_ptr<const Rendering::RenderPipelineAsset>
GetPipelineRendererAsset(int32_t rendererIndex) const override;
std::string GetDirectionalShadowPlanningPolicyAssetKey() const
override;
std::string GetDirectionalShadowExecutionPolicyAssetKey() const
override;
std::string GetDirectionalShadowExecutionPolicyAssetKey(
@@ -1362,6 +1364,8 @@ private:
MonoObject* assetObject) const;
MonoMethod* ResolveGetPipelineRendererAssetKeyContextualMethod(
MonoObject* assetObject) const;
MonoMethod* ResolveGetDirectionalShadowPlanningPolicyAssetKeyMethod(
MonoObject* assetObject) const;
MonoMethod* ResolveGetDirectionalShadowExecutionPolicyAssetKeyMethod(
MonoObject* assetObject) const;
MonoMethod*
@@ -1388,6 +1392,8 @@ private:
mutable MonoMethod* m_getPipelineRendererAssetKeyMethod = nullptr;
mutable MonoMethod* m_getPipelineRendererAssetKeyContextualMethod =
nullptr;
mutable MonoMethod*
m_getDirectionalShadowPlanningPolicyAssetKeyMethod = nullptr;
mutable MonoMethod*
m_getDirectionalShadowExecutionPolicyAssetKeyMethod = nullptr;
mutable MonoMethod*
@@ -1846,15 +1852,30 @@ void MonoManagedRenderPipelineAssetRuntime::ConfigureCameraRenderRequest(
method,
args,
nullptr);
const std::string directionalShadowPlanningPolicyAssetKey =
GetDirectionalShadowPlanningPolicyAssetKey();
if (requestContextState.suppressDirectionalShadow) {
request.directionalShadow = {};
} else if (requestContextState.directionalShadowPlanningSettingsDirty) {
request.directionalShadow = {};
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
requestContextState.directionalShadowPlanningSettings);
if (directionalShadowPlanningPolicyAssetKey.empty()) {
Rendering::ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy(
request,
renderedBaseCameraCount,
renderedRequestCount,
requestContextState.directionalShadowPlanningSettings);
} else if (!Rendering::Internal::ApplyDirectionalShadowPlanningPolicyByKey(
directionalShadowPlanningPolicyAssetKey,
request,
renderedBaseCameraCount,
renderedRequestCount,
requestContextState.directionalShadowPlanningSettings)) {
Debug::Logger::Get().Error(
Debug::LogCategory::Rendering,
Containers::String(
"MonoManagedRenderPipelineAssetRuntime failed to resolve directional shadow planning policy asset key: ") +
directionalShadowPlanningPolicyAssetKey.c_str());
}
}
UnregisterManagedCameraRenderRequestContextState(
requestContextHandle);
@@ -1935,7 +1956,7 @@ MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset() const {
std::shared_ptr<const Rendering::RenderPipelineAsset>
MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset(
int32_t rendererIndex) const {
int32_t rendererIndex) const {
if (!SyncManagedAssetRuntimeState()) {
return nullptr;
}
@@ -2029,6 +2050,37 @@ MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset(
return m_pipelineRendererAsset;
}
std::string MonoManagedRenderPipelineAssetRuntime::
GetDirectionalShadowPlanningPolicyAssetKey() const {
if (!SyncManagedAssetRuntimeState()) {
return {};
}
MonoObject* const assetObject = GetManagedAssetObject();
if (assetObject == nullptr) {
return {};
}
MonoMethod* const method =
ResolveGetDirectionalShadowPlanningPolicyAssetKeyMethod(
assetObject);
if (method == nullptr) {
return {};
}
MonoObject* managedKeyObject = nullptr;
if (!m_runtime->InvokeManagedMethod(
assetObject,
method,
nullptr,
&managedKeyObject)) {
return {};
}
return MonoStringToUtf8(
reinterpret_cast<MonoString*>(managedKeyObject));
}
std::string MonoManagedRenderPipelineAssetRuntime::
GetDirectionalShadowExecutionPolicyAssetKey() const {
return GetDirectionalShadowExecutionPolicyAssetKey(-1);
@@ -2357,6 +2409,7 @@ void MonoManagedRenderPipelineAssetRuntime::ReleaseManagedAsset() const {
m_getRuntimeResourceVersionMethod = nullptr;
m_getPipelineRendererAssetKeyMethod = nullptr;
m_getPipelineRendererAssetKeyContextualMethod = nullptr;
m_getDirectionalShadowPlanningPolicyAssetKeyMethod = nullptr;
m_getDirectionalShadowExecutionPolicyAssetKeyMethod = nullptr;
m_getDirectionalShadowExecutionPolicyAssetKeyContextualMethod =
nullptr;
@@ -2510,6 +2563,22 @@ MonoManagedRenderPipelineAssetRuntime::ResolveGetPipelineRendererAssetKeyContext
return m_getPipelineRendererAssetKeyContextualMethod;
}
MonoMethod*
MonoManagedRenderPipelineAssetRuntime::
ResolveGetDirectionalShadowPlanningPolicyAssetKeyMethod(
MonoObject* assetObject) const {
if (m_getDirectionalShadowPlanningPolicyAssetKeyMethod ==
nullptr) {
m_getDirectionalShadowPlanningPolicyAssetKeyMethod =
m_runtime->ResolveManagedMethod(
assetObject,
"GetDirectionalShadowPlanningPolicyAssetKey",
0);
}
return m_getDirectionalShadowPlanningPolicyAssetKeyMethod;
}
MonoMethod*
MonoManagedRenderPipelineAssetRuntime::
ResolveGetDirectionalShadowExecutionPolicyAssetKeyMethod(