feat(srp): add descriptor-driven object draw authoring

- bridge renderer list descriptors into ScriptableRenderContext scene draw calls
- reuse DrawObjectsPass across Universal and project custom renderers
- add RenderObjectsRendererFeature for package-level object draw extension
This commit is contained in:
2026-04-20 22:05:38 +08:00
parent 3df87e941c
commit cee65fcf40
18 changed files with 493 additions and 73 deletions

View File

@@ -929,6 +929,39 @@ static_assert(
sizeof(Rendering::RenderGraphTextureDesc),
"Managed render graph texture desc bridge layout must match native RenderGraphTextureDesc.");
struct ManagedFilteringSettingsData {
int32_t renderQueueMin = std::numeric_limits<int32_t>::lowest();
int32_t renderQueueMax = std::numeric_limits<int32_t>::max();
uint8_t requireShadowCasting = 0u;
uint8_t requireRenderObjectId = 0u;
uint8_t padding[2] = {};
};
static_assert(
sizeof(ManagedFilteringSettingsData) ==
sizeof(Rendering::FilteringSettings),
"Managed filtering settings bridge layout must match native FilteringSettings.");
struct ManagedSortingSettingsData {
uint32_t sortMode = 0u;
};
static_assert(
sizeof(ManagedSortingSettingsData) ==
sizeof(Rendering::SortingSettings),
"Managed sorting settings bridge layout must match native SortingSettings.");
struct ManagedRendererListDescData {
uint32_t type = 0u;
ManagedFilteringSettingsData filtering = {};
ManagedSortingSettingsData sorting = {};
};
static_assert(
sizeof(ManagedRendererListDescData) ==
sizeof(Rendering::RendererListDesc),
"Managed renderer list desc bridge layout must match native RendererListDesc.");
Rendering::FinalColorOutputTransferMode ResolveManagedFinalColorOutputTransferMode(
uint8_t value) {
switch (value) {
@@ -4554,24 +4587,26 @@ InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint(
}
mono_bool
InternalCall_Rendering_ScriptableRenderContext_DrawRenderers(
InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc(
uint64_t nativeHandle,
int32_t scenePhase,
int32_t rendererListType) {
ManagedRendererListDescData* rendererListDescData) {
ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
if (state == nullptr ||
state->graphContext == nullptr ||
state->sceneRecorder == nullptr ||
state->stage != Rendering::CameraFrameStage::MainScene) {
state->stage != Rendering::CameraFrameStage::MainScene ||
rendererListDescData == nullptr) {
return 0;
}
Rendering::DrawSettings drawSettings = {};
drawSettings.scenePhase =
static_cast<Rendering::ScenePhase>(scenePhase);
drawSettings.rendererListType =
static_cast<Rendering::RendererListType>(rendererListType);
drawSettings.rendererListDesc =
*reinterpret_cast<const Rendering::RendererListDesc*>(
rendererListDescData);
return state->sceneRecorder->RecordSceneDrawSettings(
drawSettings)
? 1
@@ -4923,7 +4958,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasPipelineDefaults));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFinalColorHasCameraOverrides));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderers", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderers));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderersByDesc", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordSceneInjectionPoint", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource));