|
@@ -3063,7 +3063,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
Vector<StringName> args2;
|
|
Vector<StringName> args2;
|
|
Vector<int> args3;
|
|
Vector<int> args3;
|
|
|
|
|
|
- ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::TYPE_VARIABLE, false);
|
|
|
|
|
|
+ ERR_FAIL_COND_V(p_func->arguments[0]->type != Node::NODE_TYPE_VARIABLE, false);
|
|
|
|
|
|
StringName name = static_cast<VariableNode *>(p_func->arguments[0])->name.operator String();
|
|
StringName name = static_cast<VariableNode *>(p_func->arguments[0])->name.operator String();
|
|
|
|
|
|
@@ -3117,14 +3117,14 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
failed_builtin = true;
|
|
failed_builtin = true;
|
|
bool fail = false;
|
|
bool fail = false;
|
|
for (int i = 0; i < argcount; i++) {
|
|
for (int i = 0; i < argcount; i++) {
|
|
- if (p_func->arguments[i + 1]->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (p_func->arguments[i + 1]->type == Node::NODE_TYPE_ARRAY) {
|
|
const ArrayNode *anode = static_cast<const ArrayNode *>(p_func->arguments[i + 1]);
|
|
const ArrayNode *anode = static_cast<const ArrayNode *>(p_func->arguments[i + 1]);
|
|
if (anode->call_expression == nullptr && !anode->is_indexed()) {
|
|
if (anode->call_expression == nullptr && !anode->is_indexed()) {
|
|
fail = true;
|
|
fail = true;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (get_scalar_type(args[i]) == args[i] && p_func->arguments[i + 1]->type == Node::TYPE_CONSTANT && convert_constant(static_cast<ConstantNode *>(p_func->arguments[i + 1]), builtin_func_defs[idx].args[i])) {
|
|
|
|
|
|
+ if (get_scalar_type(args[i]) == args[i] && p_func->arguments[i + 1]->type == Node::NODE_TYPE_CONSTANT && convert_constant(static_cast<ConstantNode *>(p_func->arguments[i + 1]), builtin_func_defs[idx].args[i])) {
|
|
//all good, but needs implicit conversion later
|
|
//all good, but needs implicit conversion later
|
|
} else if (args[i] != builtin_func_defs[idx].args[i]) {
|
|
} else if (args[i] != builtin_func_defs[idx].args[i]) {
|
|
fail = true;
|
|
fail = true;
|
|
@@ -3160,7 +3160,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
int max = builtin_func_const_args[constarg_idx].max;
|
|
int max = builtin_func_const_args[constarg_idx].max;
|
|
|
|
|
|
bool error = false;
|
|
bool error = false;
|
|
- if (p_func->arguments[arg]->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ if (p_func->arguments[arg]->type == Node::NODE_TYPE_VARIABLE) {
|
|
const VariableNode *vn = static_cast<VariableNode *>(p_func->arguments[arg]);
|
|
const VariableNode *vn = static_cast<VariableNode *>(p_func->arguments[arg]);
|
|
|
|
|
|
bool is_const = false;
|
|
bool is_const = false;
|
|
@@ -3172,7 +3172,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
error = true;
|
|
error = true;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- if (p_func->arguments[arg]->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (p_func->arguments[arg]->type == Node::NODE_TYPE_CONSTANT) {
|
|
const ConstantNode *cn = static_cast<ConstantNode *>(p_func->arguments[arg]);
|
|
const ConstantNode *cn = static_cast<ConstantNode *>(p_func->arguments[arg]);
|
|
|
|
|
|
if (cn->get_datatype() == TYPE_INT && cn->values.size() == 1) {
|
|
if (cn->get_datatype() == TYPE_INT && cn->values.size() == 1) {
|
|
@@ -3207,17 +3207,17 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
if (arg_idx < argcount) {
|
|
if (arg_idx < argcount) {
|
|
- if (p_func->arguments[arg_idx + 1]->type != Node::TYPE_VARIABLE && p_func->arguments[arg_idx + 1]->type != Node::TYPE_MEMBER && p_func->arguments[arg_idx + 1]->type != Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_VARIABLE && p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_MEMBER && p_func->arguments[arg_idx + 1]->type != Node::NODE_TYPE_ARRAY) {
|
|
_set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name)));
|
|
_set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name)));
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_ARRAY) {
|
|
ArrayNode *mn = static_cast<ArrayNode *>(p_func->arguments[arg_idx + 1]);
|
|
ArrayNode *mn = static_cast<ArrayNode *>(p_func->arguments[arg_idx + 1]);
|
|
if (mn->is_const) {
|
|
if (mn->is_const) {
|
|
fail = true;
|
|
fail = true;
|
|
}
|
|
}
|
|
- } else if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_MEMBER) {
|
|
|
|
|
|
+ } else if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_MEMBER) {
|
|
MemberNode *mn = static_cast<MemberNode *>(p_func->arguments[arg_idx + 1]);
|
|
MemberNode *mn = static_cast<MemberNode *>(p_func->arguments[arg_idx + 1]);
|
|
if (mn->basetype_const) {
|
|
if (mn->basetype_const) {
|
|
fail = true;
|
|
fail = true;
|
|
@@ -3250,18 +3250,18 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
}
|
|
}
|
|
|
|
|
|
StringName var_name;
|
|
StringName var_name;
|
|
- if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_ARRAY) {
|
|
var_name = static_cast<const ArrayNode *>(p_func->arguments[arg_idx + 1])->name;
|
|
var_name = static_cast<const ArrayNode *>(p_func->arguments[arg_idx + 1])->name;
|
|
- } else if (p_func->arguments[arg_idx + 1]->type == Node::TYPE_MEMBER) {
|
|
|
|
|
|
+ } else if (p_func->arguments[arg_idx + 1]->type == Node::NODE_TYPE_MEMBER) {
|
|
Node *n = static_cast<const MemberNode *>(p_func->arguments[arg_idx + 1])->owner;
|
|
Node *n = static_cast<const MemberNode *>(p_func->arguments[arg_idx + 1])->owner;
|
|
- while (n->type == Node::TYPE_MEMBER) {
|
|
|
|
|
|
+ while (n->type == Node::NODE_TYPE_MEMBER) {
|
|
n = static_cast<const MemberNode *>(n)->owner;
|
|
n = static_cast<const MemberNode *>(n)->owner;
|
|
}
|
|
}
|
|
- if (n->type != Node::TYPE_VARIABLE && n->type != Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (n->type != Node::NODE_TYPE_VARIABLE && n->type != Node::NODE_TYPE_ARRAY) {
|
|
_set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name)));
|
|
_set_error(vformat(RTR("Argument %d of function '%s' is not a variable, array, or member."), arg_idx + 1, String(name)));
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if (n->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_VARIABLE) {
|
|
var_name = static_cast<const VariableNode *>(n)->name;
|
|
var_name = static_cast<const VariableNode *>(n)->name;
|
|
} else { // TYPE_ARRAY
|
|
} else { // TYPE_ARRAY
|
|
var_name = static_cast<const ArrayNode *>(n)->name;
|
|
var_name = static_cast<const ArrayNode *>(n)->name;
|
|
@@ -3298,7 +3298,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
}
|
|
}
|
|
//implicitly convert values if possible
|
|
//implicitly convert values if possible
|
|
for (int i = 0; i < argcount; i++) {
|
|
for (int i = 0; i < argcount; i++) {
|
|
- if (get_scalar_type(args[i]) != args[i] || args[i] == builtin_func_defs[idx].args[i] || p_func->arguments[i + 1]->type != Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (get_scalar_type(args[i]) != args[i] || args[i] == builtin_func_defs[idx].args[i] || p_func->arguments[i + 1]->type != Node::NODE_TYPE_CONSTANT) {
|
|
//can't do implicit conversion here
|
|
//can't do implicit conversion here
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -3422,7 +3422,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
bool fail = false;
|
|
bool fail = false;
|
|
|
|
|
|
for (int j = 0; j < args.size(); j++) {
|
|
for (int j = 0; j < args.size(); j++) {
|
|
- if (get_scalar_type(args[j]) == args[j] && p_func->arguments[j + 1]->type == Node::TYPE_CONSTANT && args3[j] == 0 && convert_constant(static_cast<ConstantNode *>(p_func->arguments[j + 1]), pfunc->arguments[j].type)) {
|
|
|
|
|
|
+ if (get_scalar_type(args[j]) == args[j] && p_func->arguments[j + 1]->type == Node::NODE_TYPE_CONSTANT && args3[j] == 0 && convert_constant(static_cast<ConstantNode *>(p_func->arguments[j + 1]), pfunc->arguments[j].type)) {
|
|
//all good, but it needs implicit conversion later
|
|
//all good, but it needs implicit conversion later
|
|
} else if (args[j] != pfunc->arguments[j].type || (args[j] == TYPE_STRUCT && args2[j] != pfunc->arguments[j].type_str) || args3[j] != pfunc->arguments[j].array_size) {
|
|
} else if (args[j] != pfunc->arguments[j].type || (args[j] == TYPE_STRUCT && args2[j] != pfunc->arguments[j].type_str) || args3[j] != pfunc->arguments[j].array_size) {
|
|
String func_arg_name;
|
|
String func_arg_name;
|
|
@@ -3457,7 +3457,7 @@ bool ShaderLanguage::_validate_function_call(BlockNode *p_block, const FunctionI
|
|
if (!fail) {
|
|
if (!fail) {
|
|
//implicitly convert values if possible
|
|
//implicitly convert values if possible
|
|
for (int k = 0; k < args.size(); k++) {
|
|
for (int k = 0; k < args.size(); k++) {
|
|
- if (get_scalar_type(args[k]) != args[k] || args[k] == pfunc->arguments[k].type || p_func->arguments[k + 1]->type != Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (get_scalar_type(args[k]) != args[k] || args[k] == pfunc->arguments[k].type || p_func->arguments[k + 1]->type != Node::NODE_TYPE_CONSTANT) {
|
|
//can't do implicit conversion here
|
|
//can't do implicit conversion here
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -3565,7 +3565,7 @@ bool ShaderLanguage::_parse_function_arguments(BlockNode *p_block, const Functio
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- if (is_const_decl && arg->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ if (is_const_decl && arg->type == Node::NODE_TYPE_VARIABLE) {
|
|
const VariableNode *var = static_cast<const VariableNode *>(arg);
|
|
const VariableNode *var = static_cast<const VariableNode *>(arg);
|
|
if (!var->is_const) {
|
|
if (!var->is_const) {
|
|
_set_error(RTR("Expected constant expression."));
|
|
_set_error(RTR("Expected constant expression."));
|
|
@@ -4531,7 +4531,7 @@ bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, St
|
|
|
|
|
|
bool ShaderLanguage::_check_node_constness(const Node *p_node) const {
|
|
bool ShaderLanguage::_check_node_constness(const Node *p_node) const {
|
|
switch (p_node->type) {
|
|
switch (p_node->type) {
|
|
- case Node::TYPE_OPERATOR: {
|
|
|
|
|
|
+ case Node::NODE_TYPE_OPERATOR: {
|
|
const OperatorNode *op_node = static_cast<const OperatorNode *>(p_node);
|
|
const OperatorNode *op_node = static_cast<const OperatorNode *>(p_node);
|
|
for (int i = int(op_node->op == OP_CALL); i < op_node->arguments.size(); i++) {
|
|
for (int i = int(op_node->op == OP_CALL); i < op_node->arguments.size(); i++) {
|
|
if (!_check_node_constness(op_node->arguments[i])) {
|
|
if (!_check_node_constness(op_node->arguments[i])) {
|
|
@@ -4539,15 +4539,15 @@ bool ShaderLanguage::_check_node_constness(const Node *p_node) const {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} break;
|
|
} break;
|
|
- case Node::TYPE_CONSTANT:
|
|
|
|
|
|
+ case Node::NODE_TYPE_CONSTANT:
|
|
break;
|
|
break;
|
|
- case Node::TYPE_VARIABLE: {
|
|
|
|
|
|
+ case Node::NODE_TYPE_VARIABLE: {
|
|
const VariableNode *var_node = static_cast<const VariableNode *>(p_node);
|
|
const VariableNode *var_node = static_cast<const VariableNode *>(p_node);
|
|
if (!var_node->is_const) {
|
|
if (!var_node->is_const) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
} break;
|
|
} break;
|
|
- case Node::TYPE_ARRAY: {
|
|
|
|
|
|
+ case Node::NODE_TYPE_ARRAY: {
|
|
const ArrayNode *arr_node = static_cast<const ArrayNode *>(p_node);
|
|
const ArrayNode *arr_node = static_cast<const ArrayNode *>(p_node);
|
|
if (!arr_node->is_const) {
|
|
if (!arr_node->is_const) {
|
|
return false;
|
|
return false;
|
|
@@ -4560,7 +4560,7 @@ bool ShaderLanguage::_check_node_constness(const Node *p_node) const {
|
|
}
|
|
}
|
|
|
|
|
|
bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message) {
|
|
bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message) {
|
|
- if (p_node->type == Node::TYPE_OPERATOR) {
|
|
|
|
|
|
+ if (p_node->type == Node::NODE_TYPE_OPERATOR) {
|
|
OperatorNode *op = static_cast<OperatorNode *>(p_node);
|
|
OperatorNode *op = static_cast<OperatorNode *>(p_node);
|
|
|
|
|
|
if (op->op == OP_INDEX) {
|
|
if (op->op == OP_INDEX) {
|
|
@@ -4577,7 +4577,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- } else if (p_node->type == Node::TYPE_MEMBER) {
|
|
|
|
|
|
+ } else if (p_node->type == Node::NODE_TYPE_MEMBER) {
|
|
MemberNode *member = static_cast<MemberNode *>(p_node);
|
|
MemberNode *member = static_cast<MemberNode *>(p_node);
|
|
|
|
|
|
if (member->has_swizzling_duplicates) {
|
|
if (member->has_swizzling_duplicates) {
|
|
@@ -4589,7 +4589,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi
|
|
|
|
|
|
return _validate_assign(member->owner, p_function_info, r_message);
|
|
return _validate_assign(member->owner, p_function_info, r_message);
|
|
|
|
|
|
- } else if (p_node->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ } else if (p_node->type == Node::NODE_TYPE_VARIABLE) {
|
|
VariableNode *var = static_cast<VariableNode *>(p_node);
|
|
VariableNode *var = static_cast<VariableNode *>(p_node);
|
|
|
|
|
|
if (shader->uniforms.has(var->name)) {
|
|
if (shader->uniforms.has(var->name)) {
|
|
@@ -4609,7 +4609,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const FunctionInfo &p_functi
|
|
if (!(p_function_info.built_ins.has(var->name) && p_function_info.built_ins[var->name].constant)) {
|
|
if (!(p_function_info.built_ins.has(var->name) && p_function_info.built_ins[var->name].constant)) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
- } else if (p_node->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ } else if (p_node->type == Node::NODE_TYPE_ARRAY) {
|
|
ArrayNode *arr = static_cast<ArrayNode *>(p_node);
|
|
ArrayNode *arr = static_cast<ArrayNode *>(p_node);
|
|
|
|
|
|
if (shader->constants.has(arr->name) || arr->is_const) {
|
|
if (shader->constants.has(arr->name) || arr->is_const) {
|
|
@@ -4727,7 +4727,7 @@ Error ShaderLanguage::_parse_array_size(BlockNode *p_block, const FunctionInfo &
|
|
_set_tkpos(pos);
|
|
_set_tkpos(pos);
|
|
Node *n = _parse_and_reduce_expression(p_block, p_function_info);
|
|
Node *n = _parse_and_reduce_expression(p_block, p_function_info);
|
|
if (n) {
|
|
if (n) {
|
|
- if (n->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_VARIABLE) {
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
if (vn) {
|
|
if (vn) {
|
|
ConstantNode::Value v;
|
|
ConstantNode::Value v;
|
|
@@ -4750,7 +4750,7 @@ Error ShaderLanguage::_parse_array_size(BlockNode *p_block, const FunctionInfo &
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } else if (n->type == Node::TYPE_OPERATOR) {
|
|
|
|
|
|
+ } else if (n->type == Node::NODE_TYPE_OPERATOR) {
|
|
_set_error(vformat(RTR("Array size expressions are not supported.")));
|
|
_set_error(vformat(RTR("Array size expressions are not supported.")));
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
@@ -5296,10 +5296,10 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
ArgumentQualifier arg_qual = call_function->arguments[i].qualifier;
|
|
ArgumentQualifier arg_qual = call_function->arguments[i].qualifier;
|
|
bool is_out_arg = arg_qual != ArgumentQualifier::ARGUMENT_QUALIFIER_IN;
|
|
bool is_out_arg = arg_qual != ArgumentQualifier::ARGUMENT_QUALIFIER_IN;
|
|
|
|
|
|
- if (n->type == Node::TYPE_VARIABLE || n->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_VARIABLE || n->type == Node::NODE_TYPE_ARRAY) {
|
|
StringName varname;
|
|
StringName varname;
|
|
|
|
|
|
- if (n->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_VARIABLE) {
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
varname = vn->name;
|
|
varname = vn->name;
|
|
} else { // TYPE_ARRAY
|
|
} else { // TYPE_ARRAY
|
|
@@ -5347,23 +5347,23 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
if (is_const_arg || is_out_arg) {
|
|
if (is_const_arg || is_out_arg) {
|
|
StringName varname;
|
|
StringName varname;
|
|
|
|
|
|
- if (n->type == Node::TYPE_CONSTANT || n->type == Node::TYPE_OPERATOR || n->type == Node::TYPE_ARRAY_CONSTRUCT) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_CONSTANT || n->type == Node::NODE_TYPE_OPERATOR || n->type == Node::NODE_TYPE_ARRAY_CONSTRUCT) {
|
|
if (!is_const_arg) {
|
|
if (!is_const_arg) {
|
|
error = true;
|
|
error = true;
|
|
}
|
|
}
|
|
- } else if (n->type == Node::TYPE_ARRAY) {
|
|
|
|
|
|
+ } else if (n->type == Node::NODE_TYPE_ARRAY) {
|
|
ArrayNode *an = static_cast<ArrayNode *>(n);
|
|
ArrayNode *an = static_cast<ArrayNode *>(n);
|
|
if (!is_const_arg && (an->call_expression != nullptr || an->is_const)) {
|
|
if (!is_const_arg && (an->call_expression != nullptr || an->is_const)) {
|
|
error = true;
|
|
error = true;
|
|
}
|
|
}
|
|
varname = an->name;
|
|
varname = an->name;
|
|
- } else if (n->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ } else if (n->type == Node::NODE_TYPE_VARIABLE) {
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
if (vn->is_const && !is_const_arg) {
|
|
if (vn->is_const && !is_const_arg) {
|
|
error = true;
|
|
error = true;
|
|
}
|
|
}
|
|
varname = vn->name;
|
|
varname = vn->name;
|
|
- } else if (n->type == Node::TYPE_MEMBER) {
|
|
|
|
|
|
+ } else if (n->type == Node::NODE_TYPE_MEMBER) {
|
|
MemberNode *mn = static_cast<MemberNode *>(n);
|
|
MemberNode *mn = static_cast<MemberNode *>(n);
|
|
if (mn->basetype_const && is_out_arg) {
|
|
if (mn->basetype_const && is_out_arg) {
|
|
error = true;
|
|
error = true;
|
|
@@ -5389,7 +5389,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
}
|
|
}
|
|
if (is_sampler_type(call_function->arguments[i].type)) {
|
|
if (is_sampler_type(call_function->arguments[i].type)) {
|
|
//let's see where our argument comes from
|
|
//let's see where our argument comes from
|
|
- ERR_CONTINUE(n->type != Node::TYPE_VARIABLE); //bug? this should always be a variable
|
|
|
|
|
|
+ ERR_CONTINUE(n->type != Node::NODE_TYPE_VARIABLE); //bug? this should always be a variable
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
VariableNode *vn = static_cast<VariableNode *>(n);
|
|
StringName varname = vn->name;
|
|
StringName varname = vn->name;
|
|
if (shader->uniforms.has(varname)) {
|
|
if (shader->uniforms.has(varname)) {
|
|
@@ -5599,7 +5599,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
return nullptr;
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
- if (index_expression->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index_expression->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *cnode = static_cast<ConstantNode *>(index_expression);
|
|
ConstantNode *cnode = static_cast<ConstantNode *>(index_expression);
|
|
if (cnode) {
|
|
if (cnode) {
|
|
if (!cnode->values.is_empty()) {
|
|
if (!cnode->values.is_empty()) {
|
|
@@ -6064,7 +6064,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
return nullptr;
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
- if (index_expression->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index_expression->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *cnode = static_cast<ConstantNode *>(index_expression);
|
|
ConstantNode *cnode = static_cast<ConstantNode *>(index_expression);
|
|
if (cnode) {
|
|
if (cnode) {
|
|
if (!cnode->values.is_empty()) {
|
|
if (!cnode->values.is_empty()) {
|
|
@@ -6118,7 +6118,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
String member_struct_name;
|
|
String member_struct_name;
|
|
|
|
|
|
if (expr->get_array_size() > 0) {
|
|
if (expr->get_array_size() > 0) {
|
|
- if (index->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index->type == Node::NODE_TYPE_CONSTANT) {
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
if (index_constant >= (uint32_t)expr->get_array_size()) {
|
|
if (index_constant >= (uint32_t)expr->get_array_size()) {
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, expr->get_array_size() - 1));
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, expr->get_array_size() - 1));
|
|
@@ -6136,7 +6136,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
case TYPE_IVEC2:
|
|
case TYPE_IVEC2:
|
|
case TYPE_UVEC2:
|
|
case TYPE_UVEC2:
|
|
case TYPE_MAT2:
|
|
case TYPE_MAT2:
|
|
- if (index->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index->type == Node::NODE_TYPE_CONSTANT) {
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
if (index_constant >= 2) {
|
|
if (index_constant >= 2) {
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 1));
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 1));
|
|
@@ -6170,7 +6170,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
case TYPE_IVEC3:
|
|
case TYPE_IVEC3:
|
|
case TYPE_UVEC3:
|
|
case TYPE_UVEC3:
|
|
case TYPE_MAT3:
|
|
case TYPE_MAT3:
|
|
- if (index->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index->type == Node::NODE_TYPE_CONSTANT) {
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
if (index_constant >= 3) {
|
|
if (index_constant >= 3) {
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 2));
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 2));
|
|
@@ -6203,7 +6203,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
case TYPE_IVEC4:
|
|
case TYPE_IVEC4:
|
|
case TYPE_UVEC4:
|
|
case TYPE_UVEC4:
|
|
case TYPE_MAT4:
|
|
case TYPE_MAT4:
|
|
- if (index->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (index->type == Node::NODE_TYPE_CONSTANT) {
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
uint32_t index_constant = static_cast<ConstantNode *>(index)->values[0].uint;
|
|
if (index_constant >= 4) {
|
|
if (index_constant >= 4) {
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 3));
|
|
_set_error(vformat(RTR("Index [%d] out of range [%d..%d]."), index_constant, 0, 3));
|
|
@@ -6702,7 +6702,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
|
|
}
|
|
}
|
|
|
|
|
|
ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node) {
|
|
ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, ShaderLanguage::Node *p_node) {
|
|
- if (p_node->type != Node::TYPE_OPERATOR) {
|
|
|
|
|
|
+ if (p_node->type != Node::NODE_TYPE_OPERATOR) {
|
|
return p_node;
|
|
return p_node;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -6710,7 +6710,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha
|
|
OperatorNode *op = static_cast<OperatorNode *>(p_node);
|
|
OperatorNode *op = static_cast<OperatorNode *>(p_node);
|
|
|
|
|
|
if (op->op == OP_CONSTRUCT) {
|
|
if (op->op == OP_CONSTRUCT) {
|
|
- ERR_FAIL_COND_V(op->arguments[0]->type != Node::TYPE_VARIABLE, p_node);
|
|
|
|
|
|
+ ERR_FAIL_COND_V(op->arguments[0]->type != Node::NODE_TYPE_VARIABLE, p_node);
|
|
|
|
|
|
DataType type = op->get_datatype();
|
|
DataType type = op->get_datatype();
|
|
DataType base = get_scalar_type(type);
|
|
DataType base = get_scalar_type(type);
|
|
@@ -6720,7 +6720,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha
|
|
|
|
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
op->arguments.write[i] = _reduce_expression(p_block, op->arguments[i]);
|
|
op->arguments.write[i] = _reduce_expression(p_block, op->arguments[i]);
|
|
- if (op->arguments[i]->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (op->arguments[i]->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[i]);
|
|
ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[i]);
|
|
|
|
|
|
if (get_scalar_type(cn->datatype) == base) {
|
|
if (get_scalar_type(cn->datatype) == base) {
|
|
@@ -6772,7 +6772,7 @@ ShaderLanguage::Node *ShaderLanguage::_reduce_expression(BlockNode *p_block, Sha
|
|
return cn;
|
|
return cn;
|
|
} else if (op->op == OP_NEGATE) {
|
|
} else if (op->op == OP_NEGATE) {
|
|
op->arguments.write[0] = _reduce_expression(p_block, op->arguments[0]);
|
|
op->arguments.write[0] = _reduce_expression(p_block, op->arguments[0]);
|
|
- if (op->arguments[0]->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (op->arguments[0]->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[0]);
|
|
ConstantNode *cn = static_cast<ConstantNode *>(op->arguments[0]);
|
|
|
|
|
|
DataType base = get_scalar_type(cn->datatype);
|
|
DataType base = get_scalar_type(cn->datatype);
|
|
@@ -7179,7 +7179,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
- if (is_const && n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
|
|
|
|
+ if (is_const && n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
_set_error(RTR("Expected a constant expression."));
|
|
_set_error(RTR("Expected a constant expression."));
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
@@ -7235,7 +7235,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
if (!n) {
|
|
if (!n) {
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
- if (is_const && n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
|
|
|
|
+ if (is_const && n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
OperatorNode *op = static_cast<OperatorNode *>(n);
|
|
OperatorNode *op = static_cast<OperatorNode *>(n);
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
if (!_check_node_constness(op->arguments[i])) {
|
|
if (!_check_node_constness(op->arguments[i])) {
|
|
@@ -7245,7 +7245,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (n->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *const_node = static_cast<ConstantNode *>(n);
|
|
ConstantNode *const_node = static_cast<ConstantNode *>(n);
|
|
if (const_node && const_node->values.size() == 1) {
|
|
if (const_node && const_node->values.size() == 1) {
|
|
var.value = const_node->values[0];
|
|
var.value = const_node->values[0];
|
|
@@ -7412,7 +7412,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
ControlFlowNode *flow = static_cast<ControlFlowNode *>(switch_block->statements[i]);
|
|
ControlFlowNode *flow = static_cast<ControlFlowNode *>(switch_block->statements[i]);
|
|
if (flow) {
|
|
if (flow) {
|
|
if (flow->flow_op == FLOW_OP_CASE) {
|
|
if (flow->flow_op == FLOW_OP_CASE) {
|
|
- if (flow->expressions[0]->type == Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (flow->expressions[0]->type == Node::NODE_TYPE_CONSTANT) {
|
|
ConstantNode *cn = static_cast<ConstantNode *>(flow->expressions[0]);
|
|
ConstantNode *cn = static_cast<ConstantNode *>(flow->expressions[0]);
|
|
if (!cn || cn->values.is_empty()) {
|
|
if (!cn || cn->values.is_empty()) {
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
@@ -7422,7 +7422,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
constants.insert(cn->values[0].sint);
|
|
constants.insert(cn->values[0].sint);
|
|
- } else if (flow->expressions[0]->type == Node::TYPE_VARIABLE) {
|
|
|
|
|
|
+ } else if (flow->expressions[0]->type == Node::NODE_TYPE_VARIABLE) {
|
|
VariableNode *vn = static_cast<VariableNode *>(flow->expressions[0]);
|
|
VariableNode *vn = static_cast<VariableNode *>(flow->expressions[0]);
|
|
if (!vn) {
|
|
if (!vn) {
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
@@ -7852,9 +7852,9 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const FunctionInfo &p_fun
|
|
if (!expr) {
|
|
if (!expr) {
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
- is_condition = expr->type == Node::TYPE_OPERATOR && expr->get_datatype() == TYPE_BOOL;
|
|
|
|
|
|
+ is_condition = expr->type == Node::NODE_TYPE_OPERATOR && expr->get_datatype() == TYPE_BOOL;
|
|
|
|
|
|
- if (expr->type == Node::TYPE_OPERATOR) {
|
|
|
|
|
|
+ if (expr->type == Node::NODE_TYPE_OPERATOR) {
|
|
OperatorNode *op = static_cast<OperatorNode *>(expr);
|
|
OperatorNode *op = static_cast<OperatorNode *>(expr);
|
|
if (op->op == OP_EMPTY) {
|
|
if (op->op == OP_EMPTY) {
|
|
is_var_init = true;
|
|
is_var_init = true;
|
|
@@ -8916,7 +8916,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|
if (!expr) {
|
|
if (!expr) {
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
- if (expr->type != Node::TYPE_CONSTANT) {
|
|
|
|
|
|
+ if (expr->type != Node::NODE_TYPE_CONSTANT) {
|
|
_set_error(RTR("Expected constant expression after '='."));
|
|
_set_error(RTR("Expected constant expression after '='."));
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
@@ -9276,7 +9276,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
|
|
|
|
- if (n->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
|
|
|
|
+ if (n->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(n)->op == OP_CALL) {
|
|
_set_error(RTR("Expected constant expression."));
|
|
_set_error(RTR("Expected constant expression."));
|
|
return ERR_PARSE_ERROR;
|
|
return ERR_PARSE_ERROR;
|
|
}
|
|
}
|
|
@@ -9343,7 +9343,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|
keyword_completion_context = CF_GLOBAL_SPACE;
|
|
keyword_completion_context = CF_GLOBAL_SPACE;
|
|
}
|
|
}
|
|
#endif // DEBUG_ENABLED
|
|
#endif // DEBUG_ENABLED
|
|
- if (expr->type == Node::TYPE_OPERATOR && static_cast<OperatorNode *>(expr)->op == OP_CALL) {
|
|
|
|
|
|
+ if (expr->type == Node::NODE_TYPE_OPERATOR && static_cast<OperatorNode *>(expr)->op == OP_CALL) {
|
|
OperatorNode *op = static_cast<OperatorNode *>(expr);
|
|
OperatorNode *op = static_cast<OperatorNode *>(expr);
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
for (int i = 1; i < op->arguments.size(); i++) {
|
|
if (!_check_node_constness(op->arguments[i])) {
|
|
if (!_check_node_constness(op->arguments[i])) {
|
|
@@ -9756,7 +9756,7 @@ Error ShaderLanguage::_find_last_flow_op_in_op(ControlFlowNode *p_flow, FlowOper
|
|
bool found = false;
|
|
bool found = false;
|
|
|
|
|
|
for (int i = p_flow->blocks.size() - 1; i >= 0; i--) {
|
|
for (int i = p_flow->blocks.size() - 1; i >= 0; i--) {
|
|
- if (p_flow->blocks[i]->type == Node::TYPE_BLOCK) {
|
|
|
|
|
|
+ if (p_flow->blocks[i]->type == Node::NODE_TYPE_BLOCK) {
|
|
BlockNode *last_block = static_cast<BlockNode *>(p_flow->blocks[i]);
|
|
BlockNode *last_block = static_cast<BlockNode *>(p_flow->blocks[i]);
|
|
if (_find_last_flow_op_in_block(last_block, p_op) == OK) {
|
|
if (_find_last_flow_op_in_block(last_block, p_op) == OK) {
|
|
found = true;
|
|
found = true;
|
|
@@ -9774,7 +9774,7 @@ Error ShaderLanguage::_find_last_flow_op_in_block(BlockNode *p_block, FlowOperat
|
|
bool found = false;
|
|
bool found = false;
|
|
|
|
|
|
for (int i = p_block->statements.size() - 1; i >= 0; i--) {
|
|
for (int i = p_block->statements.size() - 1; i >= 0; i--) {
|
|
- if (p_block->statements[i]->type == Node::TYPE_CONTROL_FLOW) {
|
|
|
|
|
|
+ if (p_block->statements[i]->type == Node::NODE_TYPE_CONTROL_FLOW) {
|
|
ControlFlowNode *flow = static_cast<ControlFlowNode *>(p_block->statements[i]);
|
|
ControlFlowNode *flow = static_cast<ControlFlowNode *>(p_block->statements[i]);
|
|
if (flow->flow_op == p_op) {
|
|
if (flow->flow_op == p_op) {
|
|
found = true;
|
|
found = true;
|
|
@@ -9785,7 +9785,7 @@ Error ShaderLanguage::_find_last_flow_op_in_block(BlockNode *p_block, FlowOperat
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } else if (p_block->statements[i]->type == Node::TYPE_BLOCK) {
|
|
|
|
|
|
+ } else if (p_block->statements[i]->type == Node::NODE_TYPE_BLOCK) {
|
|
BlockNode *block = static_cast<BlockNode *>(p_block->statements[i]);
|
|
BlockNode *block = static_cast<BlockNode *>(p_block->statements[i]);
|
|
if (_find_last_flow_op_in_block(block, p_op) == OK) {
|
|
if (_find_last_flow_op_in_block(block, p_op) == OK) {
|
|
found = true;
|
|
found = true;
|