From a757bd7625b8c4ec189cbc395d5bf4175da6461d Mon Sep 17 00:00:00 2001 From: Yuri Roubinsky Date: Fri, 20 Mar 2020 14:09:43 +0300 Subject: Allow to reassign local variables in shaders --- servers/visual/shader_language.cpp | 17 ++++++++++------- servers/visual/shader_language.h | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/servers/visual/shader_language.cpp b/servers/visual/shader_language.cpp index 084ade8855..5739a35882 100644 --- a/servers/visual/shader_language.cpp +++ b/servers/visual/shader_language.cpp @@ -896,7 +896,7 @@ void ShaderLanguage::clear() { } } -bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Map &p_builtin_types, const StringName &p_identifier, DataType *r_data_type, IdentifierType *r_type, bool *r_is_const, int *r_array_size, StringName *r_struct_name) { +bool ShaderLanguage::_find_identifier(const BlockNode *p_block, bool p_allow_reassign, const Map &p_builtin_types, const StringName &p_identifier, DataType *r_data_type, IdentifierType *r_type, bool *r_is_const, int *r_array_size, StringName *r_struct_name) { if (p_builtin_types.has(p_identifier)) { @@ -941,6 +941,9 @@ bool ShaderLanguage::_find_identifier(const BlockNode *p_block, const Mapparent_function; break; } else { + if (p_allow_reassign) { + break; + } ERR_FAIL_COND_V(!p_block->parent_block, false); p_block = p_block->parent_block; } @@ -3654,7 +3657,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons } } else { - if (!_find_identifier(p_block, p_builtin_types, identifier, &data_type, &ident_type, &is_const, &array_size, &struct_name)) { + if (!_find_identifier(p_block, false, p_builtin_types, identifier, &data_type, &ident_type, &is_const, &array_size, &struct_name)) { _set_error("Unknown identifier in expression: " + String(identifier)); return NULL; } @@ -4749,7 +4752,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map &p_funct name = tk.text; - if (_find_identifier(NULL, Map(), name)) { + if (_find_identifier(NULL, false, Map(), name)) { _set_error("Redefinition of '" + String(name) + "'"); return ERR_PARSE_ERROR; } @@ -6188,7 +6191,7 @@ Error ShaderLanguage::_parse_shader(const Map &p_funct return ERR_PARSE_ERROR; } - if (_find_identifier(NULL, Map(), name)) { + if (_find_identifier(NULL, false, Map(), name)) { _set_error("Redefinition of '" + String(name) + "'"); return ERR_PARSE_ERROR; } @@ -6256,7 +6259,7 @@ Error ShaderLanguage::_parse_shader(const Map &p_funct } name = tk.text; - if (_find_identifier(NULL, Map(), name)) { + if (_find_identifier(NULL, false, Map(), name)) { _set_error("Redefinition of '" + String(name) + "'"); return ERR_PARSE_ERROR; } @@ -6395,7 +6398,7 @@ Error ShaderLanguage::_parse_shader(const Map &p_funct pname = tk.text; ShaderLanguage::IdentifierType itype; - if (_find_identifier(func_node->body, builtin_types, pname, (ShaderLanguage::DataType *)0, &itype)) { + if (_find_identifier(func_node->body, false, builtin_types, pname, (ShaderLanguage::DataType *)0, &itype)) { if (itype != IDENTIFIER_FUNCTION) { _set_error("Redefinition of '" + String(pname) + "'"); return ERR_PARSE_ERROR; diff --git a/servers/visual/shader_language.h b/servers/visual/shader_language.h index 239805a18e..bdc15cc4aa 100644 --- a/servers/visual/shader_language.h +++ b/servers/visual/shader_language.h @@ -824,7 +824,7 @@ private: IDENTIFIER_CONSTANT, }; - bool _find_identifier(const BlockNode *p_block, const Map &p_builtin_types, const StringName &p_identifier, DataType *r_data_type = NULL, IdentifierType *r_type = NULL, bool *r_is_const = NULL, int *r_array_size = NULL, StringName *r_struct_name = NULL); + bool _find_identifier(const BlockNode *p_block, bool p_allow_reassign, const Map &p_builtin_types, const StringName &p_identifier, DataType *r_data_type = NULL, IdentifierType *r_type = NULL, bool *r_is_const = NULL, int *r_array_size = NULL, StringName *r_struct_name = NULL); bool _is_operator_assign(Operator p_op) const; bool _validate_assign(Node *p_node, const Map &p_builtin_types, String *r_message = NULL); bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = NULL); -- cgit v1.2.3