diff options
Diffstat (limited to 'src/gpu')
| -rw-r--r-- | src/gpu/effects/shader_composer.cc | 48 | ||||
| -rw-r--r-- | src/gpu/effects/shader_composer.h | 6 | ||||
| -rw-r--r-- | src/gpu/effects/shaders.cc | 5 |
3 files changed, 54 insertions, 5 deletions
diff --git a/src/gpu/effects/shader_composer.cc b/src/gpu/effects/shader_composer.cc index 3e08df9..8d66ad7 100644 --- a/src/gpu/effects/shader_composer.cc +++ b/src/gpu/effects/shader_composer.cc @@ -2,6 +2,7 @@ // It implements the ShaderComposer class. #include "gpu/effects/shader_composer.h" +#include <set> #include <sstream> ShaderComposer& ShaderComposer::Get() { @@ -14,22 +15,59 @@ void ShaderComposer::RegisterSnippet(const std::string& name, snippets_[name] = code; } +void ShaderComposer::ResolveRecursive(const std::string& source, + std::stringstream& ss, + std::set<std::string>& included) { + std::istringstream stream(source); + std::string line; + while (std::getline(stream, line)) { + // Check for #include "snippet_name" + if (line.compare(0, 9, "#include ") == 0) { + size_t start = line.find('"'); + size_t end = line.find('"', start + 1); + if (start != std::string::npos && end != std::string::npos) { + std::string name = line.substr(start + 1, end - start - 1); + if (included.find(name) == included.end()) { + included.insert(name); + auto it = snippets_.find(name); + if (it != snippets_.end()) { + ss << "// --- Included: " << name << " ---\n"; + ResolveRecursive(it->second, ss, included); + ss << "// --- End Include: " << name << " ---\n"; + } else { + ss << "// ERROR: Snippet not found: " << name << "\n"; + } + } + } + } else { + ss << line << "\n"; + } + } +} + std::string ShaderComposer::Compose(const std::vector<std::string>& dependencies, const std::string& main_code) { std::stringstream ss; ss << "// Generated by ShaderComposer\n\n"; + std::set<std::string> included; + + // Process explicit dependencies first for (const auto& dep : dependencies) { - auto it = snippets_.find(dep); - if (it != snippets_.end()) { - ss << "// --- Snippet: " << dep << " ---\n"; - ss << it->second << "\n"; + if (included.find(dep) == included.end()) { + included.insert(dep); + auto it = snippets_.find(dep); + if (it != snippets_.end()) { + ss << "// --- Dependency: " << dep << " ---\n"; + ResolveRecursive(it->second, ss, included); + ss << "\n"; + } } } ss << "// --- Main Code ---\n"; - ss << main_code; + ResolveRecursive(main_code, ss, included); return ss.str(); } diff --git a/src/gpu/effects/shader_composer.h b/src/gpu/effects/shader_composer.h index 49bf00c..a63a6a4 100644 --- a/src/gpu/effects/shader_composer.h +++ b/src/gpu/effects/shader_composer.h @@ -4,6 +4,7 @@ #pragma once #include <map> +#include <set> #include <string> #include <vector> @@ -15,10 +16,15 @@ class ShaderComposer { void RegisterSnippet(const std::string& name, const std::string& code); // Assemble a final shader string by prepending required snippets + // and recursively resolving #include "snippet_name" directives. std::string Compose(const std::vector<std::string>& dependencies, const std::string& main_code); private: ShaderComposer() = default; + + void ResolveRecursive(const std::string& source, std::stringstream& ss, + std::set<std::string>& included); + std::map<std::string, std::string> snippets_; }; diff --git a/src/gpu/effects/shaders.cc b/src/gpu/effects/shaders.cc index b2d184d..7255cf5 100644 --- a/src/gpu/effects/shaders.cc +++ b/src/gpu/effects/shaders.cc @@ -31,6 +31,11 @@ void InitShaderComposer() { }; register_if_exists("common_uniforms", AssetId::ASSET_SHADER_COMMON_UNIFORMS); + register_if_exists("math/sdf_shapes", AssetId::ASSET_SHADER_MATH_SDF_SHAPES); + register_if_exists("math/sdf_utils", AssetId::ASSET_SHADER_MATH_SDF_UTILS); + register_if_exists("render/shadows", AssetId::ASSET_SHADER_RENDER_SHADOWS); + register_if_exists("render/scene_query", AssetId::ASSET_SHADER_RENDER_SCENE_QUERY); + register_if_exists("render/lighting_utils", AssetId::ASSET_SHADER_RENDER_LIGHTING_UTILS); register_if_exists("sdf_primitives", AssetId::ASSET_SHADER_SDF_PRIMITIVES); |
