Browse Source

Merge pull request #96912 from Chaosus/shader_fix_sky

Fix broken sky shader
Rémi Verschelde 11 months ago
parent
commit
74de05a01c
2 changed files with 25 additions and 18 deletions
  1. 24 17
      servers/rendering/shader_compiler.cpp
  2. 1 1
      servers/rendering/shader_compiler.h

+ 24 - 17
servers/rendering/shader_compiler.cpp

@@ -185,7 +185,7 @@ static String f2sp0(float p_float) {
 	return num;
 	return num;
 }
 }
 
 
-static String get_constant_text(SL::DataType p_type, const Vector<SL::Scalar> &p_values, bool p_is_op) {
+static String get_constant_text(SL::DataType p_type, const Vector<SL::Scalar> &p_values) {
 	switch (p_type) {
 	switch (p_type) {
 		case SL::TYPE_BOOL:
 		case SL::TYPE_BOOL:
 			return p_values[0].boolean ? "true" : "false";
 			return p_values[0].boolean ? "true" : "false";
@@ -205,7 +205,7 @@ static String get_constant_text(SL::DataType p_type, const Vector<SL::Scalar> &p
 		}
 		}
 
 
 		case SL::TYPE_INT:
 		case SL::TYPE_INT:
-			return itos(p_is_op ? Math::abs(p_values[0].sint) : p_values[0].sint); // To prevent writing unary minus twice in operator expression parsing.
+			return itos(p_values[0].sint);
 		case SL::TYPE_IVEC2:
 		case SL::TYPE_IVEC2:
 		case SL::TYPE_IVEC3:
 		case SL::TYPE_IVEC3:
 		case SL::TYPE_IVEC4: {
 		case SL::TYPE_IVEC4: {
@@ -238,7 +238,7 @@ static String get_constant_text(SL::DataType p_type, const Vector<SL::Scalar> &p
 			return text;
 			return text;
 		} break;
 		} break;
 		case SL::TYPE_FLOAT:
 		case SL::TYPE_FLOAT:
-			return f2sp0(p_is_op ? Math::abs(p_values[0].real) : p_values[0].real); // To prevent writing unary minus twice in operator expression parsing.
+			return f2sp0(p_values[0].real);
 		case SL::TYPE_VEC2:
 		case SL::TYPE_VEC2:
 		case SL::TYPE_VEC3:
 		case SL::TYPE_VEC3:
 		case SL::TYPE_VEC4: {
 		case SL::TYPE_VEC4: {
@@ -446,7 +446,7 @@ static String _get_global_shader_uniform_from_type_and_index(const String &p_buf
 	}
 	}
 }
 }
 
 
-String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning, bool p_use_scope, bool p_is_op) {
+String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning, bool p_use_scope) {
 	String code;
 	String code;
 
 
 	switch (p_node->type) {
 	switch (p_node->type) {
@@ -1090,7 +1090,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
 			SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
 			SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
 
 
 			if (cnode->array_size == 0) {
 			if (cnode->array_size == 0) {
-				return get_constant_text(cnode->datatype, cnode->values, p_is_op);
+				return get_constant_text(cnode->datatype, cnode->values);
 			} else {
 			} else {
 				if (cnode->get_datatype() == SL::TYPE_STRUCT) {
 				if (cnode->get_datatype() == SL::TYPE_STRUCT) {
 					code += _mkid(cnode->struct_name);
 					code += _mkid(cnode->struct_name);
@@ -1128,18 +1128,25 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
 				case SL::OP_ASSIGN_BIT_AND:
 				case SL::OP_ASSIGN_BIT_AND:
 				case SL::OP_ASSIGN_BIT_OR:
 				case SL::OP_ASSIGN_BIT_OR:
 				case SL::OP_ASSIGN_BIT_XOR:
 				case SL::OP_ASSIGN_BIT_XOR:
-					code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, true, true, true) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, true) + _opstr(onode->op) + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					break;
 					break;
 				case SL::OP_BIT_INVERT:
 				case SL::OP_BIT_INVERT:
 				case SL::OP_NEGATE:
 				case SL::OP_NEGATE:
 				case SL::OP_NOT:
 				case SL::OP_NOT:
 				case SL::OP_DECREMENT:
 				case SL::OP_DECREMENT:
-				case SL::OP_INCREMENT:
-					code = _opstr(onode->op) + _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
-					break;
+				case SL::OP_INCREMENT: {
+					const String node_code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+
+					if (onode->op == SL::OP_NEGATE && node_code.begins_with("-")) { // To prevent writing unary minus twice.
+						code = node_code;
+					} else {
+						code = _opstr(onode->op) + node_code;
+					}
+
+				} break;
 				case SL::OP_POST_DECREMENT:
 				case SL::OP_POST_DECREMENT:
 				case SL::OP_POST_INCREMENT:
 				case SL::OP_POST_INCREMENT:
-					code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true) + _opstr(onode->op);
+					code = _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + _opstr(onode->op);
 					break;
 					break;
 				case SL::OP_CALL:
 				case SL::OP_CALL:
 				case SL::OP_STRUCT:
 				case SL::OP_STRUCT:
@@ -1235,7 +1242,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
 							}
 							}
 						}
 						}
 
 
-						String node_code = _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+						String node_code = _dump_node_code(onode->arguments[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 						if (is_texture_func && i == 1) {
 						if (is_texture_func && i == 1) {
 							// If we're doing a texture lookup we need to check our texture argument
 							// If we're doing a texture lookup we need to check our texture argument
 							StringName texture_uniform;
 							StringName texture_uniform;
@@ -1352,19 +1359,19 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
 					}
 					}
 				} break;
 				} break;
 				case SL::OP_INDEX: {
 				case SL::OP_INDEX: {
-					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					code += "[";
 					code += "[";
-					code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					code += "]";
 					code += "]";
 
 
 				} break;
 				} break;
 				case SL::OP_SELECT_IF: {
 				case SL::OP_SELECT_IF: {
 					code += "(";
 					code += "(";
-					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					code += "?";
 					code += "?";
-					code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					code += ":";
 					code += ":";
-					code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[2], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					code += ")";
 					code += ")";
 
 
 				} break;
 				} break;
@@ -1376,7 +1383,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene
 					if (p_use_scope) {
 					if (p_use_scope) {
 						code += "(";
 						code += "(";
 					}
 					}
-					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + " " + _opstr(onode->op) + " " + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning, true, true);
+					code += _dump_node_code(onode->arguments[0], p_level, r_gen_code, p_actions, p_default_actions, p_assigning) + " " + _opstr(onode->op) + " " + _dump_node_code(onode->arguments[1], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
 					if (p_use_scope) {
 					if (p_use_scope) {
 						code += ")";
 						code += ")";
 					}
 					}

+ 1 - 1
servers/rendering/shader_compiler.h

@@ -109,7 +109,7 @@ private:
 	String _get_sampler_name(ShaderLanguage::TextureFilter p_filter, ShaderLanguage::TextureRepeat p_repeat);
 	String _get_sampler_name(ShaderLanguage::TextureFilter p_filter, ShaderLanguage::TextureRepeat p_repeat);
 
 
 	void _dump_function_deps(const ShaderLanguage::ShaderNode *p_node, const StringName &p_for_func, const HashMap<StringName, String> &p_func_code, String &r_to_add, HashSet<StringName> &added);
 	void _dump_function_deps(const ShaderLanguage::ShaderNode *p_node, const StringName &p_for_func, const HashMap<StringName, String> &p_func_code, String &r_to_add, HashSet<StringName> &added);
-	String _dump_node_code(const ShaderLanguage::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning, bool p_scope = true, bool p_is_op = false);
+	String _dump_node_code(const ShaderLanguage::Node *p_node, int p_level, GeneratedCode &r_gen_code, IdentifierActions &p_actions, const DefaultIdentifierActions &p_default_actions, bool p_assigning, bool p_scope = true);
 
 
 	const ShaderLanguage::ShaderNode *shader = nullptr;
 	const ShaderLanguage::ShaderNode *shader = nullptr;
 	const ShaderLanguage::FunctionNode *function = nullptr;
 	const ShaderLanguage::FunctionNode *function = nullptr;