Fix scene selection outline mask path

This commit is contained in:
2026-04-09 05:16:04 +08:00
parent c48311eaaf
commit 2084412010
29 changed files with 1250 additions and 56 deletions

View File

@@ -18,11 +18,15 @@ using XCEngine::Editor::GetSceneViewportInfiniteGridShaderPath;
using XCEngine::Editor::GetSceneViewportPointLightGizmoIconPath;
using XCEngine::Editor::GetSceneViewportSpotLightGizmoIconPath;
using XCEngine::Resources::GetBuiltinObjectIdOutlineShaderPath;
using XCEngine::Resources::GetBuiltinSelectionMaskShaderPath;
using XCEngine::Resources::GetBuiltinSelectionOutlineShaderPath;
using XCEngine::Resources::LoadResult;
using XCEngine::Resources::ResourceHandle;
using XCEngine::Resources::ResourceManager;
using XCEngine::Resources::Shader;
using XCEngine::Resources::ShaderBackend;
using XCEngine::Resources::ShaderKeywordDeclarationType;
using XCEngine::Resources::ShaderKeywordSet;
using XCEngine::Resources::ShaderLoader;
using XCEngine::Resources::ShaderPass;
using XCEngine::Resources::ShaderStageVariant;
@@ -110,4 +114,61 @@ TEST(SceneViewportShaderPathsTest, ResourceManagerLoadsSceneViewportOutlineShade
manager.Shutdown();
}
TEST(SceneViewportShaderPathsTest, ResourceManagerLoadsSelectionOutlineShadersByResolvedPath) {
ResourceManager& manager = ResourceManager::Get();
manager.Shutdown();
const ResourceHandle<Shader> maskShaderHandle = manager.Load<Shader>(GetBuiltinSelectionMaskShaderPath());
ASSERT_TRUE(maskShaderHandle.IsValid());
const ShaderPass* maskPass = maskShaderHandle->FindPass("SelectionMask");
ASSERT_NE(maskPass, nullptr);
ASSERT_EQ(maskPass->variants.Size(), 4u);
ASSERT_EQ(maskPass->keywordDeclarations.Size(), 1u);
EXPECT_EQ(maskPass->keywordDeclarations[0].type, ShaderKeywordDeclarationType::ShaderFeatureLocal);
ASSERT_EQ(maskPass->keywordDeclarations[0].options.Size(), 2u);
EXPECT_EQ(maskPass->keywordDeclarations[0].options[0], "_");
EXPECT_EQ(maskPass->keywordDeclarations[0].options[1], "XC_ALPHA_TEST");
EXPECT_TRUE(maskShaderHandle->PassDeclaresKeyword("SelectionMask", "XC_ALPHA_TEST"));
const ShaderStageVariant* maskFragment = maskShaderHandle->FindVariant(
"SelectionMask",
ShaderType::Fragment,
ShaderBackend::D3D12);
ASSERT_NE(maskFragment, nullptr);
EXPECT_NE(
std::string(maskFragment->sourceCode.CStr()).find("XC_BUILTIN_SELECTION_MASK_D3D12_PS"),
std::string::npos);
ShaderKeywordSet alphaKeywords = {};
alphaKeywords.enabledKeywords.PushBack("XC_ALPHA_TEST");
const ShaderStageVariant* alphaMaskFragment = maskShaderHandle->FindVariant(
"SelectionMask",
ShaderType::Fragment,
ShaderBackend::D3D12,
alphaKeywords);
ASSERT_NE(alphaMaskFragment, nullptr);
EXPECT_NE(
std::string(alphaMaskFragment->sourceCode.CStr()).find("#define XC_ALPHA_TEST 1"),
std::string::npos);
const ResourceHandle<Shader> outlineShaderHandle = manager.Load<Shader>(GetBuiltinSelectionOutlineShaderPath());
ASSERT_TRUE(outlineShaderHandle.IsValid());
const ShaderPass* outlinePass = outlineShaderHandle->FindPass("SelectionOutline");
ASSERT_NE(outlinePass, nullptr);
ASSERT_EQ(outlinePass->variants.Size(), 2u);
const ShaderStageVariant* outlineFragment = outlineShaderHandle->FindVariant(
"SelectionOutline",
ShaderType::Fragment,
ShaderBackend::D3D12);
ASSERT_NE(outlineFragment, nullptr);
EXPECT_NE(
std::string(outlineFragment->sourceCode.CStr()).find("XC_BUILTIN_SELECTION_OUTLINE_D3D12_PS"),
std::string::npos);
manager.Shutdown();
}
} // namespace