refactor: externalize builtin object id and grid shader assets

This commit is contained in:
2026-04-02 23:15:19 +08:00
parent c63dcf2229
commit ffb62ddd9c
15 changed files with 578 additions and 7 deletions

View File

@@ -43,6 +43,12 @@ size_t CalculateBuiltinShaderMemorySize(const Shader& shader);
constexpr const char* kBuiltinForwardLitShaderManifestRelativePath =
"engine/assets/builtin/shaders/forward-lit/forward-lit.shader";
constexpr const char* kBuiltinObjectIdShaderManifestRelativePath =
"engine/assets/builtin/shaders/object-id/object-id.shader";
constexpr const char* kBuiltinObjectIdOutlineShaderManifestRelativePath =
"engine/assets/builtin/shaders/object-id-outline/object-id-outline.shader";
constexpr const char* kBuiltinInfiniteGridShaderManifestRelativePath =
"engine/assets/builtin/shaders/infinite-grid/infinite-grid.shader";
Containers::String NormalizeBuiltinAssetPath(const std::filesystem::path& path) {
return Containers::String(path.lexically_normal().generic_string().c_str());
@@ -79,8 +85,9 @@ bool TryResolveBuiltinAssetPathFromAnchor(
return false;
}
bool TryResolveBuiltinForwardLitShaderManifestPath(Containers::String& outPath) {
const std::filesystem::path relativePath(kBuiltinForwardLitShaderManifestRelativePath);
bool TryResolveBuiltinShaderManifestPath(
const std::filesystem::path& relativePath,
Containers::String& outPath) {
std::filesystem::path resolvedPath;
std::error_code ec;
@@ -104,6 +111,34 @@ bool TryResolveBuiltinForwardLitShaderManifestPath(Containers::String& outPath)
return false;
}
const char* GetBuiltinShaderManifestRelativePath(const Containers::String& builtinShaderPath) {
if (builtinShaderPath == Containers::String(kBuiltinForwardLitShaderPath)) {
return kBuiltinForwardLitShaderManifestRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinObjectIdShaderPath)) {
return kBuiltinObjectIdShaderManifestRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinObjectIdOutlineShaderPath)) {
return kBuiltinObjectIdOutlineShaderManifestRelativePath;
}
if (builtinShaderPath == Containers::String(kBuiltinInfiniteGridShaderPath)) {
return kBuiltinInfiniteGridShaderManifestRelativePath;
}
return nullptr;
}
bool TryResolveBuiltinShaderManifestPath(
const Containers::String& builtinShaderPath,
Containers::String& outPath) {
const char* relativePath = GetBuiltinShaderManifestRelativePath(builtinShaderPath);
if (relativePath == nullptr) {
return false;
}
return TryResolveBuiltinShaderManifestPath(std::filesystem::path(relativePath), outPath);
}
Shader* LoadBuiltinShaderFromManifest(
const Containers::String& builtinPath,
const Containers::String& manifestPath) {
@@ -120,6 +155,15 @@ Shader* LoadBuiltinShaderFromManifest(
return shader;
}
Shader* TryLoadBuiltinShaderFromManifest(const Containers::String& builtinPath) {
Containers::String manifestPath;
if (!TryResolveBuiltinShaderManifestPath(builtinPath, manifestPath)) {
return nullptr;
}
return LoadBuiltinShaderFromManifest(builtinPath, manifestPath);
}
const char kBuiltinForwardHlsl[] = R"(
Texture2D gBaseColorTexture : register(t1);
SamplerState gLinearSampler : register(s1);
@@ -1133,11 +1177,8 @@ size_t CalculateBuiltinShaderMemorySize(const Shader& shader) {
}
Shader* BuildBuiltinForwardLitShader(const Containers::String& path) {
Containers::String manifestPath;
if (TryResolveBuiltinForwardLitShaderManifestPath(manifestPath)) {
if (Shader* shader = LoadBuiltinShaderFromManifest(path, manifestPath)) {
return shader;
}
if (Shader* shader = TryLoadBuiltinShaderFromManifest(path)) {
return shader;
}
auto* shader = new Shader();
@@ -1213,6 +1254,10 @@ Shader* BuildBuiltinForwardLitShader(const Containers::String& path) {
}
Shader* BuildBuiltinObjectIdShader(const Containers::String& path) {
if (Shader* shader = TryLoadBuiltinShaderFromManifest(path)) {
return shader;
}
auto* shader = new Shader();
IResource::ConstructParams params;
params.name = Containers::String("Builtin Object Id");
@@ -1286,6 +1331,10 @@ Shader* BuildBuiltinObjectIdShader(const Containers::String& path) {
}
Shader* BuildBuiltinInfiniteGridShader(const Containers::String& path) {
if (Shader* shader = TryLoadBuiltinShaderFromManifest(path)) {
return shader;
}
auto* shader = new Shader();
IResource::ConstructParams params;
params.name = Containers::String("Builtin Infinite Grid");
@@ -1321,6 +1370,10 @@ Shader* BuildBuiltinInfiniteGridShader(const Containers::String& path) {
}
Shader* BuildBuiltinObjectIdOutlineShader(const Containers::String& path) {
if (Shader* shader = TryLoadBuiltinShaderFromManifest(path)) {
return shader;
}
auto* shader = new Shader();
IResource::ConstructParams params;
params.name = Containers::String("Builtin Object Id Outline");