diff options
Diffstat (limited to 'src/gpu/effects/shader_composer.cc')
| -rw-r--r-- | src/gpu/effects/shader_composer.cc | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/gpu/effects/shader_composer.cc b/src/gpu/effects/shader_composer.cc index 8d66ad7..055b996 100644 --- a/src/gpu/effects/shader_composer.cc +++ b/src/gpu/effects/shader_composer.cc @@ -17,7 +17,8 @@ void ShaderComposer::RegisterSnippet(const std::string& name, void ShaderComposer::ResolveRecursive(const std::string& source, std::stringstream& ss, - std::set<std::string>& included) { + std::set<std::string>& included, + const CompositionMap& substitutions) { std::istringstream stream(source); std::string line; while (std::getline(stream, line)) { @@ -27,12 +28,19 @@ void ShaderComposer::ResolveRecursive(const std::string& source, 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); + + // Apply substitution if available + auto sub_it = substitutions.find(name); + if (sub_it != substitutions.end()) { + name = sub_it->second; + } + 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); + ResolveRecursive(it->second, ss, included, substitutions); ss << "// --- End Include: " << name << " ---\n"; } else { ss << "// ERROR: Snippet not found: " << name << "\n"; @@ -47,7 +55,8 @@ void ShaderComposer::ResolveRecursive(const std::string& source, std::string ShaderComposer::Compose(const std::vector<std::string>& dependencies, - const std::string& main_code) { + const std::string& main_code, + const CompositionMap& substitutions) { std::stringstream ss; ss << "// Generated by ShaderComposer\n\n"; @@ -55,19 +64,25 @@ ShaderComposer::Compose(const std::vector<std::string>& dependencies, // Process explicit dependencies first for (const auto& dep : dependencies) { - if (included.find(dep) == included.end()) { - included.insert(dep); - auto it = snippets_.find(dep); + std::string name = dep; + auto sub_it = substitutions.find(name); + if (sub_it != substitutions.end()) { + name = sub_it->second; + } + + if (included.find(name) == included.end()) { + included.insert(name); + auto it = snippets_.find(name); if (it != snippets_.end()) { - ss << "// --- Dependency: " << dep << " ---\n"; - ResolveRecursive(it->second, ss, included); + ss << "// --- Dependency: " << name << " ---\n"; + ResolveRecursive(it->second, ss, included, substitutions); ss << "\n"; } } } ss << "// --- Main Code ---\n"; - ResolveRecursive(main_code, ss, included); + ResolveRecursive(main_code, ss, included, substitutions); return ss.str(); } |
