fix(rendering): preserve managed SRP selection across scene replace

This commit is contained in:
2026-04-18 17:47:11 +08:00
parent cac6e34fa5
commit b8e84001fa
3 changed files with 64 additions and 3 deletions

View File

@@ -414,6 +414,61 @@ TEST_F(
EXPECT_EQ(host->GetStageRecorder(), nullptr);
}
TEST_F(
MonoScriptRuntimeTest,
RuntimeSceneReplacePreservesManagedGraphicsSettingsSelection) {
Scene* firstScene = CreateScene("ManagedRenderPipelineFirstScene");
GameObject* selectionObject =
firstScene->CreateGameObject("ManagedRenderPipelineSelection");
ScriptComponent* selectionScript =
AddScript(
selectionObject,
"Gameplay",
"ManagedRenderPipelineRuntimeSelectionProbe");
ASSERT_NE(selectionScript, nullptr);
engine->OnRuntimeStart(firstScene);
engine->OnUpdate(0.016f);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptorBeforeReplace =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineAssetDescriptor();
ASSERT_TRUE(descriptorBeforeReplace.IsValid());
ASSERT_NE(descriptorBeforeReplace.managedAssetHandle, 0u);
MonoObject* const managedAssetBeforeReplace =
runtime->GetExternalManagedObject(
descriptorBeforeReplace.managedAssetHandle);
ASSERT_NE(managedAssetBeforeReplace, nullptr);
auto secondScene = std::make_unique<Scene>("ManagedRenderPipelineSecondScene");
engine->OnRuntimeSceneReplaced(secondScene.get());
scene = std::move(secondScene);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptorAfterReplace =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineAssetDescriptor();
EXPECT_EQ(descriptorAfterReplace.assemblyName, descriptorBeforeReplace.assemblyName);
EXPECT_EQ(descriptorAfterReplace.namespaceName, descriptorBeforeReplace.namespaceName);
EXPECT_EQ(descriptorAfterReplace.className, descriptorBeforeReplace.className);
EXPECT_EQ(
descriptorAfterReplace.managedAssetHandle,
descriptorBeforeReplace.managedAssetHandle);
EXPECT_EQ(
runtime->GetExternalManagedObject(
descriptorAfterReplace.managedAssetHandle),
managedAssetBeforeReplace);
XCEngine::Rendering::CameraRenderer renderer;
const auto* pipelineAsset =
dynamic_cast<
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(pipelineAsset, nullptr);
EXPECT_EQ(
pipelineAsset->GetDescriptor().className,
descriptorBeforeReplace.className);
engine->OnRuntimeStop();
}
TEST_F(
MonoScriptRuntimeTest,
DefaultCameraRendererUsesManagedGraphicsSelectionToRecordMainSceneGraph) {