refactor(srp): make URP scene setup policy explicit

This commit is contained in:
2026-04-21 22:03:24 +08:00
parent 4b105ec88f
commit 808335126f
8 changed files with 523 additions and 78 deletions

View File

@@ -4044,6 +4044,62 @@ void InternalCall_Camera_SetStackType(uint64_t gameObjectUUID, int32_t value) {
static_cast<Components::CameraStackType>(value));
}
int32_t InternalCall_Camera_GetProjectionType(uint64_t gameObjectUUID) {
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
return component != nullptr
? static_cast<int32_t>(component->GetProjectionType())
: 0;
}
mono_bool InternalCall_Camera_GetSkyboxEnabled(uint64_t gameObjectUUID) {
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
return (component && component->IsSkyboxEnabled()) ? 1 : 0;
}
mono_bool InternalCall_Camera_GetHasSkyboxMaterial(uint64_t gameObjectUUID) {
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
return (component && component->GetSkyboxMaterial() != nullptr) ? 1 : 0;
}
void InternalCall_Camera_GetSkyboxTopColor(
uint64_t gameObjectUUID,
XCEngine::Math::Color* outColor) {
if (outColor == nullptr) {
return;
}
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
*outColor = component != nullptr
? component->GetSkyboxTopColor()
: XCEngine::Math::Color();
}
void InternalCall_Camera_GetSkyboxHorizonColor(
uint64_t gameObjectUUID,
XCEngine::Math::Color* outColor) {
if (outColor == nullptr) {
return;
}
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
*outColor = component != nullptr
? component->GetSkyboxHorizonColor()
: XCEngine::Math::Color();
}
void InternalCall_Camera_GetSkyboxBottomColor(
uint64_t gameObjectUUID,
XCEngine::Math::Color* outColor) {
if (outColor == nullptr) {
return;
}
Components::CameraComponent* component = FindCameraComponent(gameObjectUUID);
*outColor = component != nullptr
? component->GetSkyboxBottomColor()
: XCEngine::Math::Color();
}
float InternalCall_Light_GetIntensity(uint64_t gameObjectUUID) {
Components::LightComponent* component = FindLightComponent(gameObjectUUID);
return component ? component->GetIntensity() : 0.0f;
@@ -5613,60 +5669,41 @@ InternalCall_Rendering_RenderSceneSetupContext_GetIsConfigured(
: 0;
}
mono_bool
InternalCall_Rendering_RenderSceneSetupContext_UseDefaultSceneSetup(
int32_t InternalCall_Rendering_RenderSceneSetupContext_GetClearFlags(
uint64_t nativeHandle) {
ManagedRenderSceneSetupContextState* const state =
const ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr ||
state->plan == nullptr ||
state->sceneData == nullptr) {
return 0;
}
Rendering::ApplyDefaultRenderPipelineSceneSetupPolicy(
*state->plan,
*state->sceneData);
state->explicitlyConfigured = true;
return 1;
return state != nullptr &&
state->plan != nullptr
? static_cast<int32_t>(state->plan->request.clearFlags)
: 0;
}
mono_bool
InternalCall_Rendering_RenderSceneSetupContext_UseDefaultEnvironment(
InternalCall_Rendering_RenderSceneSetupContext_GetHasMainSceneDepthAttachment(
uint64_t nativeHandle) {
ManagedRenderSceneSetupContextState* const state =
const ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr ||
state->plan == nullptr ||
state->sceneData == nullptr) {
return 0;
}
state->sceneData->environment =
Rendering::BuildDefaultRenderPipelineEnvironmentData(
*state->plan);
state->explicitlyConfigured = true;
return 1;
return state != nullptr &&
state->plan != nullptr &&
state->plan->GetMainSceneSurface().GetDepthAttachment() != nullptr
? 1
: 0;
}
mono_bool
InternalCall_Rendering_RenderSceneSetupContext_UseDefaultGlobalShaderKeywords(
InternalCall_Rendering_RenderSceneSetupContext_GetHasMainDirectionalShadow(
uint64_t nativeHandle) {
ManagedRenderSceneSetupContextState* const state =
const ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr || state->sceneData == nullptr) {
return 0;
}
state->sceneData->globalShaderKeywords =
Rendering::
BuildDefaultRenderPipelineSceneGlobalShaderKeywords(
*state->sceneData);
state->explicitlyConfigured = true;
return 1;
return state != nullptr &&
state->sceneData != nullptr &&
state->sceneData->lighting.HasMainDirectionalShadow()
? 1
: 0;
}
void InternalCall_Rendering_RenderSceneSetupContext_ClearEnvironment(
void InternalCall_Rendering_RenderSceneSetupContext_SetEnvironmentNone(
uint64_t nativeHandle) {
ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
@@ -5678,6 +5715,56 @@ void InternalCall_Rendering_RenderSceneSetupContext_ClearEnvironment(
state->explicitlyConfigured = true;
}
mono_bool
InternalCall_Rendering_RenderSceneSetupContext_UseCameraSkyboxMaterial(
uint64_t nativeHandle) {
ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr ||
state->plan == nullptr ||
state->sceneData == nullptr ||
state->plan->request.camera == nullptr) {
return 0;
}
const Resources::Material* skyboxMaterial =
state->plan->request.camera->GetSkyboxMaterial();
if (skyboxMaterial == nullptr) {
return 0;
}
state->sceneData->environment = {};
state->sceneData->environment.mode =
Rendering::RenderEnvironmentMode::MaterialSkybox;
state->sceneData->environment.materialSkybox.material =
skyboxMaterial;
state->explicitlyConfigured = true;
return 1;
}
void InternalCall_Rendering_RenderSceneSetupContext_SetProceduralSkybox(
uint64_t nativeHandle,
XCEngine::Math::Color* topColor,
XCEngine::Math::Color* horizonColor,
XCEngine::Math::Color* bottomColor) {
ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr || state->sceneData == nullptr) {
return;
}
state->sceneData->environment = {};
state->sceneData->environment.mode =
Rendering::RenderEnvironmentMode::ProceduralSkybox;
state->sceneData->environment.skybox.topColor =
topColor != nullptr ? *topColor : XCEngine::Math::Color();
state->sceneData->environment.skybox.horizonColor =
horizonColor != nullptr ? *horizonColor : XCEngine::Math::Color();
state->sceneData->environment.skybox.bottomColor =
bottomColor != nullptr ? *bottomColor : XCEngine::Math::Color();
state->explicitlyConfigured = true;
}
void
InternalCall_Rendering_RenderSceneSetupContext_ClearGlobalShaderKeywords(
uint64_t nativeHandle) {
@@ -5691,16 +5778,55 @@ InternalCall_Rendering_RenderSceneSetupContext_ClearGlobalShaderKeywords(
state->explicitlyConfigured = true;
}
void InternalCall_Rendering_RenderSceneSetupContext_ClearSceneSetup(
uint64_t nativeHandle) {
void InternalCall_Rendering_RenderSceneSetupContext_SetGlobalShaderKeyword(
uint64_t nativeHandle,
MonoString* keyword,
mono_bool enabled) {
ManagedRenderSceneSetupContextState* const state =
FindManagedRenderSceneSetupContextState(nativeHandle);
if (state == nullptr || state->sceneData == nullptr) {
return;
}
state->sceneData->environment = {};
state->sceneData->globalShaderKeywords = {};
const XCEngine::Containers::String normalizedKeyword =
Resources::NormalizeShaderKeywordToken(
XCEngine::Containers::String(
MonoStringToUtf8(keyword).c_str()));
if (normalizedKeyword.Empty()) {
state->explicitlyConfigured = true;
return;
}
Resources::ShaderKeywordSet& keywordSet =
state->sceneData->globalShaderKeywords;
bool foundKeyword = false;
size_t foundIndex = 0;
for (size_t keywordIndex = 0;
keywordIndex < keywordSet.enabledKeywords.Size();
++keywordIndex) {
if (keywordSet.enabledKeywords[keywordIndex] ==
normalizedKeyword) {
foundKeyword = true;
foundIndex = keywordIndex;
break;
}
}
if (enabled != 0) {
if (!foundKeyword) {
keywordSet.enabledKeywords.PushBack(normalizedKeyword);
}
} else if (foundKeyword) {
const size_t lastIndex =
keywordSet.enabledKeywords.Size() - 1;
if (foundIndex != lastIndex) {
keywordSet.enabledKeywords[foundIndex] =
keywordSet.enabledKeywords[lastIndex];
}
keywordSet.enabledKeywords.PopBack();
}
Resources::NormalizeShaderKeywordSetInPlace(keywordSet);
state->explicitlyConfigured = true;
}
@@ -6100,6 +6226,12 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Camera_SetClearMode", reinterpret_cast<const void*>(&InternalCall_Camera_SetClearMode));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetStackType", reinterpret_cast<const void*>(&InternalCall_Camera_GetStackType));
mono_add_internal_call("XCEngine.InternalCalls::Camera_SetStackType", reinterpret_cast<const void*>(&InternalCall_Camera_SetStackType));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetProjectionType", reinterpret_cast<const void*>(&InternalCall_Camera_GetProjectionType));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetSkyboxEnabled", reinterpret_cast<const void*>(&InternalCall_Camera_GetSkyboxEnabled));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetHasSkyboxMaterial", reinterpret_cast<const void*>(&InternalCall_Camera_GetHasSkyboxMaterial));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetSkyboxTopColor", reinterpret_cast<const void*>(&InternalCall_Camera_GetSkyboxTopColor));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetSkyboxHorizonColor", reinterpret_cast<const void*>(&InternalCall_Camera_GetSkyboxHorizonColor));
mono_add_internal_call("XCEngine.InternalCalls::Camera_GetSkyboxBottomColor", reinterpret_cast<const void*>(&InternalCall_Camera_GetSkyboxBottomColor));
mono_add_internal_call("XCEngine.InternalCalls::Light_GetIntensity", reinterpret_cast<const void*>(&InternalCall_Light_GetIntensity));
mono_add_internal_call("XCEngine.InternalCalls::Light_SetIntensity", reinterpret_cast<const void*>(&InternalCall_Light_SetIntensity));
mono_add_internal_call("XCEngine.InternalCalls::Light_GetRange", reinterpret_cast<const void*>(&InternalCall_Light_GetRange));
@@ -6239,12 +6371,14 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetIsConfigured", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetIsConfigured));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseDefaultSceneSetup", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_UseDefaultSceneSetup));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseDefaultEnvironment", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_UseDefaultEnvironment));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseDefaultGlobalShaderKeywords", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_UseDefaultGlobalShaderKeywords));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_ClearEnvironment", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_ClearEnvironment));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetClearFlags", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetClearFlags));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetHasMainSceneDepthAttachment", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetHasMainSceneDepthAttachment));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetHasMainDirectionalShadow", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_GetHasMainDirectionalShadow));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_SetEnvironmentNone", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_SetEnvironmentNone));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseCameraSkyboxMaterial", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_UseCameraSkyboxMaterial));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_SetProceduralSkybox", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_SetProceduralSkybox));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_ClearGlobalShaderKeywords", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_ClearGlobalShaderKeywords));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_ClearSceneSetup", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_ClearSceneSetup));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_SetGlobalShaderKeyword", reinterpret_cast<const void*>(&InternalCall_Rendering_RenderSceneSetupContext_SetGlobalShaderKeyword));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_DirectionalShadowExecutionContext_GetHasPlannedMainDirectionalShadow", reinterpret_cast<const void*>(&InternalCall_Rendering_DirectionalShadowExecutionContext_GetHasPlannedMainDirectionalShadow));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_DirectionalShadowExecutionContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_DirectionalShadowExecutionContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_DirectionalShadowExecutionContext_GetIsConfigured", reinterpret_cast<const void*>(&InternalCall_Rendering_DirectionalShadowExecutionContext_GetIsConfigured));