summaryrefslogtreecommitdiffstats
path: root/scene/resources/shader.cpp
diff options
context:
space:
mode:
authorbitsawer <sawerduster@gmail.com>2023-05-29 12:05:22 +0300
committerbitsawer <sawerduster@gmail.com>2023-05-29 12:05:22 +0300
commit67038471ffdaf91d8385c9324698e99443c72056 (patch)
treec8f92d4f93b956c941fc2cd283336f735dab2fde /scene/resources/shader.cpp
parent1ae0bb0e8f9061f771177cc744f3ffa677d27145 (diff)
downloadredot-engine-67038471ffdaf91d8385c9324698e99443c72056.tar.gz
Fix shader preprocessor cyclic include handling
Diffstat (limited to 'scene/resources/shader.cpp')
-rw-r--r--scene/resources/shader.cpp16
1 files changed, 8 insertions, 8 deletions
diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp
index fd2be9ba22..62c2483a93 100644
--- a/scene/resources/shader.cpp
+++ b/scene/resources/shader.cpp
@@ -62,7 +62,7 @@ void Shader::set_include_path(const String &p_path) {
}
void Shader::set_code(const String &p_code) {
- for (Ref<ShaderInclude> E : include_dependencies) {
+ for (const Ref<ShaderInclude> &E : include_dependencies) {
E->disconnect(SNAME("changed"), callable_mp(this, &Shader::_dependency_changed));
}
@@ -83,8 +83,6 @@ void Shader::set_code(const String &p_code) {
code = p_code;
String pp_code = p_code;
- HashSet<Ref<ShaderInclude>> new_include_dependencies;
-
{
String path = get_path();
if (path.is_empty()) {
@@ -93,14 +91,16 @@ void Shader::set_code(const String &p_code) {
// Preprocessor must run here and not in the server because:
// 1) Need to keep track of include dependencies at resource level
// 2) Server does not do interaction with Resource filetypes, this is a scene level feature.
+ HashSet<Ref<ShaderInclude>> new_include_dependencies;
ShaderPreprocessor preprocessor;
- preprocessor.preprocess(p_code, path, pp_code, nullptr, nullptr, nullptr, &new_include_dependencies);
+ Error result = preprocessor.preprocess(p_code, path, pp_code, nullptr, nullptr, nullptr, &new_include_dependencies);
+ if (result == OK) {
+ // This ensures previous include resources are not freed and then re-loaded during parse (which would make compiling slower)
+ include_dependencies = new_include_dependencies;
+ }
}
- // This ensures previous include resources are not freed and then re-loaded during parse (which would make compiling slower)
- include_dependencies = new_include_dependencies;
-
- for (Ref<ShaderInclude> E : include_dependencies) {
+ for (const Ref<ShaderInclude> &E : include_dependencies) {
E->connect(SNAME("changed"), callable_mp(this, &Shader::_dependency_changed));
}