diff --git a/docs/used/SRP_URP_RequestPolicyAndSceneSetupSeamPlan_2026-04-21_完成归档.md b/docs/used/SRP_URP_RequestPolicyAndSceneSetupSeamPlan_2026-04-21_完成归档.md new file mode 100644 index 00000000..c585b55a --- /dev/null +++ b/docs/used/SRP_URP_RequestPolicyAndSceneSetupSeamPlan_2026-04-21_完成归档.md @@ -0,0 +1,100 @@ +# SRP / URP Request Policy And Scene Setup Seam Plan + +## 背景 + +当前渲染模块已经基本形成了如下分层: + +- C++ 层负责 Render Graph、frame execution、scene extraction、native scene draw backend、shadow runtime、fullscreen substrate 等执行底座 +- managed SRP / URP 层负责 renderer 选择、pass 组织、feature 组织、camera/frame planning 策略 + +但当前仍有两类关键策略口没有完全收干净: + +1. `CameraRenderRequest` 阶段仍有部分默认策略固定在 C++ 层 +2. `RenderSceneSetup` 阶段 managed 层还缺少足够的配置能力,当前主要仍在调用 native default + +这会导致 SRP / URP 虽然已经能组织 pass,但还没有完全接管“为什么这么渲染”的策略层。 + +## 本阶段目标 + +本阶段不继续搬运 native draw backend,不做 deferred,不扩张底层执行复杂度,只收策略边界。 + +### 目标一 + +把 request seam 做实,让 managed URP 可以直接接管以下 request-level 策略: + +- camera stack / clear mode 读取 +- request clear flags 覆盖 +- directional shadow request 抑制与规划参数调整 +- renderer 选择仍保持由 managed 决定 + +### 目标二 + +为后续 scene setup seam 做准备,明确下一阶段 managed 需要接管的 scene setup 内容: + +- environment policy +- skybox policy +- global shader keywords policy + +## 本阶段实施步骤 + +### Step 1. 扩展 request context 与 camera managed API + +补齐 managed 侧 request policy 所需的最小上下文: + +- `Camera.clearMode` +- `Camera.stackType` +- `CameraRenderRequestContext.clearFlags` + +要求: + +- 通过 Mono internal call 打通 +- 不引入兼容层、废弃层或双轨 API +- 保持 request 仍由 C++ 创建,但允许 managed 在 request 阶段覆盖策略结果 + +### Step 2. 把默认 request clear / shadow policy 收进 URP + +在 `UniversalRenderPipelineAsset` 中接管默认 request policy: + +- 依据 camera clear mode 和 stack type 解析 request clear flags +- 继续在 managed 层控制 main light shadow request 是否保留 +- 继续在 managed 层控制 shadow planning settings + +要求: + +- 默认行为与当前引擎已有表现保持一致 +- native default policy 退化为底座 fallback,而不是 URP 主路径 + +### Step 3. 预留 scene setup seam 下一阶段入口 + +本阶段先不大改 scene setup,但要确认下一阶段的直接入口: + +- `RenderSceneSetupContext` 需要扩展哪些显式设置能力 +- `UniversalRenderer.ConfigureRenderSceneSetup(...)` 之后如何从“调用 default”过渡为“显式配置环境与关键字” + +## 收口标准 + +- managed 层可以读取 camera stack / clear mode +- managed 层可以覆盖 request clear flags +- URP 默认 clear / shadow request 策略由 managed 决定 +- `XCEditor` Debug 编译通过 +- 旧版 editor 冒烟通过 + +## 非目标 + +本阶段不做以下事项: + +- deferred rendering +- render graph 大改 +- native scene draw backend 搬迁 +- 阴影算法本体迁移到 managed +- gaussian / volumetric native 执行实现迁移 + +## 完成情况 + +- 已补齐 managed request seam 所需的 `Camera.clearMode`、`Camera.stackType`、`CameraRenderRequestContext.clearFlags` +- 已将 URP 默认 request clear policy 收进 managed `UniversalRenderPipelineAsset` +- 已将 `RenderClearFlags` 收敛到 rendering core,移除 URP 包内重复定义 +- 已让 `UniversalRenderer.ConfigureRenderSceneSetup(...)` 从 bundled `UseDefaultSceneSetup()` 过渡为显式组合 environment / global keywords +- 已补齐 `RenderSceneSetupContext.camera` 入口,便于下一阶段继续接管 scene setup policy +- `XCEditor` Debug 编译通过 +- 旧版 editor 冒烟通过 diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index 8c6b583d..99013fca 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -4010,6 +4010,40 @@ void InternalCall_Camera_SetPrimary(uint64_t gameObjectUUID, mono_bool value) { component->SetPrimary(value != 0); } +int32_t InternalCall_Camera_GetClearMode(uint64_t gameObjectUUID) { + Components::CameraComponent* component = FindCameraComponent(gameObjectUUID); + return component != nullptr + ? static_cast(component->GetClearMode()) + : 0; +} + +void InternalCall_Camera_SetClearMode(uint64_t gameObjectUUID, int32_t value) { + Components::CameraComponent* component = FindCameraComponent(gameObjectUUID); + if (!component) { + return; + } + + component->SetClearMode( + static_cast(value)); +} + +int32_t InternalCall_Camera_GetStackType(uint64_t gameObjectUUID) { + Components::CameraComponent* component = FindCameraComponent(gameObjectUUID); + return component != nullptr + ? static_cast(component->GetStackType()) + : 0; +} + +void InternalCall_Camera_SetStackType(uint64_t gameObjectUUID, int32_t value) { + Components::CameraComponent* component = FindCameraComponent(gameObjectUUID); + if (!component) { + return; + } + + component->SetStackType( + static_cast(value)); +} + float InternalCall_Light_GetIntensity(uint64_t gameObjectUUID) { Components::LightComponent* component = FindLightComponent(gameObjectUUID); return component ? component->GetIntensity() : 0.0f; @@ -5519,6 +5553,29 @@ void InternalCall_Rendering_CameraRenderRequestContext_ClearDirectionalShadow( state->suppressDirectionalShadow = true; } +int32_t InternalCall_Rendering_CameraRenderRequestContext_GetClearFlags( + uint64_t nativeHandle) { + const ManagedCameraRenderRequestContextState* const state = + FindManagedCameraRenderRequestContextState(nativeHandle); + return state != nullptr && + state->request != nullptr + ? static_cast(state->request->clearFlags) + : static_cast(Rendering::RenderClearFlags::All); +} + +void InternalCall_Rendering_CameraRenderRequestContext_SetClearFlags( + uint64_t nativeHandle, + int32_t clearFlags) { + ManagedCameraRenderRequestContextState* const state = + FindManagedCameraRenderRequestContextState(nativeHandle); + if (state == nullptr || state->request == nullptr) { + return; + } + + state->request->clearFlags = + static_cast(clearFlags); +} + int32_t InternalCall_Rendering_RenderSceneSetupContext_GetRendererIndex( uint64_t nativeHandle) { @@ -5530,6 +5587,21 @@ InternalCall_Rendering_RenderSceneSetupContext_GetRendererIndex( : -1; } +uint64_t +InternalCall_Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID( + uint64_t nativeHandle) { + const ManagedRenderSceneSetupContextState* const state = + FindManagedRenderSceneSetupContextState(nativeHandle); + if (state == nullptr || + state->plan == nullptr || + state->plan->request.camera == nullptr || + state->plan->request.camera->GetGameObject() == nullptr) { + return 0u; + } + + return state->plan->request.camera->GetGameObject()->GetUUID(); +} + mono_bool InternalCall_Rendering_RenderSceneSetupContext_GetIsConfigured( uint64_t nativeHandle) { @@ -6024,6 +6096,10 @@ void RegisterInternalCalls() { mono_add_internal_call("XCEngine.InternalCalls::Camera_SetDepth", reinterpret_cast(&InternalCall_Camera_SetDepth)); mono_add_internal_call("XCEngine.InternalCalls::Camera_GetPrimary", reinterpret_cast(&InternalCall_Camera_GetPrimary)); mono_add_internal_call("XCEngine.InternalCalls::Camera_SetPrimary", reinterpret_cast(&InternalCall_Camera_SetPrimary)); + mono_add_internal_call("XCEngine.InternalCalls::Camera_GetClearMode", reinterpret_cast(&InternalCall_Camera_GetClearMode)); + mono_add_internal_call("XCEngine.InternalCalls::Camera_SetClearMode", reinterpret_cast(&InternalCall_Camera_SetClearMode)); + mono_add_internal_call("XCEngine.InternalCalls::Camera_GetStackType", reinterpret_cast(&InternalCall_Camera_GetStackType)); + mono_add_internal_call("XCEngine.InternalCalls::Camera_SetStackType", reinterpret_cast(&InternalCall_Camera_SetStackType)); mono_add_internal_call("XCEngine.InternalCalls::Light_GetIntensity", reinterpret_cast(&InternalCall_Light_GetIntensity)); mono_add_internal_call("XCEngine.InternalCalls::Light_SetIntensity", reinterpret_cast(&InternalCall_Light_SetIntensity)); mono_add_internal_call("XCEngine.InternalCalls::Light_GetRange", reinterpret_cast(&InternalCall_Light_GetRange)); @@ -6158,7 +6234,10 @@ void RegisterInternalCalls() { mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetDirectionalShadowPlanningSettings", reinterpret_cast(&InternalCall_Rendering_CameraRenderRequestContext_GetDirectionalShadowPlanningSettings)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_SetDirectionalShadowPlanningSettings", reinterpret_cast(&InternalCall_Rendering_CameraRenderRequestContext_SetDirectionalShadowPlanningSettings)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_ClearDirectionalShadow", reinterpret_cast(&InternalCall_Rendering_CameraRenderRequestContext_ClearDirectionalShadow)); + mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_GetClearFlags", reinterpret_cast(&InternalCall_Rendering_CameraRenderRequestContext_GetClearFlags)); + mono_add_internal_call("XCEngine.InternalCalls::Rendering_CameraRenderRequestContext_SetClearFlags", reinterpret_cast(&InternalCall_Rendering_CameraRenderRequestContext_SetClearFlags)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetRendererIndex", reinterpret_cast(&InternalCall_Rendering_RenderSceneSetupContext_GetRendererIndex)); + mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID", reinterpret_cast(&InternalCall_Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_GetIsConfigured", reinterpret_cast(&InternalCall_Rendering_RenderSceneSetupContext_GetIsConfigured)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseDefaultSceneSetup", reinterpret_cast(&InternalCall_Rendering_RenderSceneSetupContext_UseDefaultSceneSetup)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_RenderSceneSetupContext_UseDefaultEnvironment", reinterpret_cast(&InternalCall_Rendering_RenderSceneSetupContext_UseDefaultEnvironment)); diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 44a23b55..dc5f28c5 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -144,6 +144,8 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/AssemblyInfo.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Behaviour.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Camera.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/CameraClearMode.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/CameraStackType.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Color.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Component.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Debug.cs @@ -187,6 +189,7 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/GraphicsSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderPipelineAsset.cs + ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderClearFlags.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderQueueRange.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderStateBlock.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderStateMask.cs @@ -226,7 +229,6 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/EnvironmentData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/FinalColorData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/LightingData.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderClearFlags.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderEnvironmentMode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderPassEvent.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderObjectsRendererFeature.cs diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/CameraData.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/CameraData.cs index 03080d5b..f6c5e71d 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/CameraData.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/CameraData.cs @@ -1,4 +1,5 @@ using XCEngine; +using XCEngine.Rendering; namespace XCEngine.Rendering.Universal { diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererCameraRequestContext.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererCameraRequestContext.cs index fd52873d..a15fa3b7 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererCameraRequestContext.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererCameraRequestContext.cs @@ -75,6 +75,21 @@ namespace XCEngine.Rendering.Universal } } + public RenderClearFlags clearFlags + { + get => + m_requestContext != null + ? m_requestContext.clearFlags + : RenderClearFlags.All; + set + { + if (m_requestContext != null) + { + m_requestContext.clearFlags = value; + } + } + } + internal CameraRenderRequestContext requestContext => m_requestContext; } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs index a1e74395..27f4e706 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderPipelineAsset.cs @@ -37,6 +37,9 @@ namespace XCEngine.Rendering.Universal return; } + context.clearFlags = + ResolveRequestClearFlags(context); + UniversalShadowSettings shadowSettings = GetShadowSettingsInstance(); if (!shadowSettings.supportsMainLightShadows) @@ -87,6 +90,42 @@ namespace XCEngine.Rendering.Universal return base.ResolveRendererIndex(context); } + private static RenderClearFlags ResolveRequestClearFlags( + RendererCameraRequestContext context) + { + Camera camera = + context != null + ? context.camera + : null; + if (camera == null) + { + return RenderClearFlags.All; + } + + switch (camera.clearMode) + { + case CameraClearMode.ColorAndDepth: + return RenderClearFlags.All; + case CameraClearMode.DepthOnly: + return RenderClearFlags.Depth; + case CameraClearMode.None: + return RenderClearFlags.None; + case CameraClearMode.Auto: + default: + if (camera.stackType == + CameraStackType.Overlay) + { + return context.renderedRequestCount == 0 + ? RenderClearFlags.All + : RenderClearFlags.Depth; + } + + return context.renderedBaseCameraCount == 0 + ? RenderClearFlags.All + : RenderClearFlags.Depth; + } + } + private UniversalShadowSettings GetShadowSettingsInstance() { if (shadows == null) diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs index 18f6e096..172f4c04 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRenderer.cs @@ -81,7 +81,8 @@ namespace XCEngine.Rendering.Universal return; } - context.UseDefaultSceneSetup(); + context.UseDefaultEnvironment(); + context.UseDefaultGlobalShaderKeywords(); } protected override void ConfigureDirectionalShadowExecutionState( diff --git a/managed/XCEngine.ScriptCore/Camera.cs b/managed/XCEngine.ScriptCore/Camera.cs index f1418357..02b1d99d 100644 --- a/managed/XCEngine.ScriptCore/Camera.cs +++ b/managed/XCEngine.ScriptCore/Camera.cs @@ -66,5 +66,39 @@ namespace XCEngine get => Primary; set => Primary = value; } + + public CameraClearMode ClearMode + { + get => + (CameraClearMode)InternalCalls + .Camera_GetClearMode(GameObjectUUID); + set => + InternalCalls.Camera_SetClearMode( + GameObjectUUID, + (int)value); + } + + public CameraClearMode clearMode + { + get => ClearMode; + set => ClearMode = value; + } + + public CameraStackType StackType + { + get => + (CameraStackType)InternalCalls + .Camera_GetStackType(GameObjectUUID); + set => + InternalCalls.Camera_SetStackType( + GameObjectUUID, + (int)value); + } + + public CameraStackType stackType + { + get => StackType; + set => StackType = value; + } } } diff --git a/managed/XCEngine.ScriptCore/CameraClearMode.cs b/managed/XCEngine.ScriptCore/CameraClearMode.cs new file mode 100644 index 00000000..2c4d39fd --- /dev/null +++ b/managed/XCEngine.ScriptCore/CameraClearMode.cs @@ -0,0 +1,10 @@ +namespace XCEngine +{ + public enum CameraClearMode + { + Auto = 0, + ColorAndDepth, + DepthOnly, + None + } +} diff --git a/managed/XCEngine.ScriptCore/CameraStackType.cs b/managed/XCEngine.ScriptCore/CameraStackType.cs new file mode 100644 index 00000000..2b75681f --- /dev/null +++ b/managed/XCEngine.ScriptCore/CameraStackType.cs @@ -0,0 +1,8 @@ +namespace XCEngine +{ + public enum CameraStackType + { + Base = 0, + Overlay + } +} diff --git a/managed/XCEngine.ScriptCore/InternalCalls.cs b/managed/XCEngine.ScriptCore/InternalCalls.cs index 220aab49..f8bd2e0f 100644 --- a/managed/XCEngine.ScriptCore/InternalCalls.cs +++ b/managed/XCEngine.ScriptCore/InternalCalls.cs @@ -252,6 +252,18 @@ namespace XCEngine [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void Camera_SetPrimary(ulong gameObjectUUID, bool value); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern int Camera_GetClearMode(ulong gameObjectUUID); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Camera_SetClearMode(ulong gameObjectUUID, int value); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern int Camera_GetStackType(ulong gameObjectUUID); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Camera_SetStackType(ulong gameObjectUUID, int value); + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern float Light_GetIntensity(ulong gameObjectUUID); @@ -903,11 +915,27 @@ namespace XCEngine Rendering_CameraRenderRequestContext_ClearDirectionalShadow( ulong nativeHandle); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern int + Rendering_CameraRenderRequestContext_GetClearFlags( + ulong nativeHandle); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void + Rendering_CameraRenderRequestContext_SetClearFlags( + ulong nativeHandle, + int clearFlags); + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern int Rendering_RenderSceneSetupContext_GetRendererIndex( ulong nativeHandle); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern ulong + Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID( + ulong nativeHandle); + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern bool Rendering_RenderSceneSetupContext_GetIsConfigured( diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/CameraRenderRequestContext.cs b/managed/XCEngine.ScriptCore/Rendering/Core/CameraRenderRequestContext.cs index 6a9b7888..3aa42caf 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/CameraRenderRequestContext.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/CameraRenderRequestContext.cs @@ -85,6 +85,19 @@ namespace XCEngine.Rendering m_nativeHandle); } + public RenderClearFlags clearFlags + { + get => + (RenderClearFlags)InternalCalls + .Rendering_CameraRenderRequestContext_GetClearFlags( + m_nativeHandle); + set => + InternalCalls + .Rendering_CameraRenderRequestContext_SetClearFlags( + m_nativeHandle, + (int)value); + } + internal ulong nativeHandle => m_nativeHandle; } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderClearFlags.cs b/managed/XCEngine.ScriptCore/Rendering/Core/RenderClearFlags.cs similarity index 75% rename from managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderClearFlags.cs rename to managed/XCEngine.ScriptCore/Rendering/Core/RenderClearFlags.cs index 951edaa6..499ddd89 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RenderClearFlags.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/RenderClearFlags.cs @@ -1,7 +1,6 @@ using System; -using XCEngine; -namespace XCEngine.Rendering.Universal +namespace XCEngine.Rendering { [Flags] public enum RenderClearFlags @@ -12,4 +11,3 @@ namespace XCEngine.Rendering.Universal All = Color | Depth } } - diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs b/managed/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs index 50234c19..03d937b8 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs @@ -14,6 +14,25 @@ namespace XCEngine.Rendering .Rendering_RenderSceneSetupContext_GetRendererIndex( m_nativeHandle); + public Camera camera + { + get + { + ulong cameraGameObjectUUID = + InternalCalls + .Rendering_RenderSceneSetupContext_GetCameraGameObjectUUID( + m_nativeHandle); + if (cameraGameObjectUUID == 0) + { + return null; + } + + GameObject gameObject = + new GameObject(cameraGameObjectUUID); + return gameObject.GetComponent(); + } + } + public bool isConfigured => InternalCalls .Rendering_RenderSceneSetupContext_GetIsConfigured(