Fix built-in(PI, TAU, E) assignment to a global constant in a shader
This commit is contained in:
parent
69a194f051
commit
6e80e97b0f
3 changed files with 46 additions and 29 deletions
|
@ -4293,7 +4293,7 @@ ShaderLanguage::Node *ShaderLanguage::_parse_array_size(BlockNode *p_block, cons
|
|||
return n;
|
||||
}
|
||||
|
||||
Error ShaderLanguage::_parse_global_array_size(int &r_array_size) {
|
||||
Error ShaderLanguage::_parse_global_array_size(int &r_array_size, const FunctionInfo &p_function_info) {
|
||||
if (r_array_size > 0) {
|
||||
_set_error("Array size is already defined!");
|
||||
return ERR_PARSE_ERROR;
|
||||
|
@ -4305,7 +4305,7 @@ Error ShaderLanguage::_parse_global_array_size(int &r_array_size) {
|
|||
|
||||
if (tk.type != TK_INT_CONSTANT || ((int)tk.constant) <= 0) {
|
||||
_set_tkpos(pos);
|
||||
Node *n = _parse_array_size(nullptr, FunctionInfo(), array_size);
|
||||
Node *n = _parse_array_size(nullptr, p_function_info, array_size);
|
||||
if (!n) {
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -7446,6 +7446,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
ShaderNode::Uniform::Scope uniform_scope = ShaderNode::Uniform::SCOPE_LOCAL;
|
||||
|
||||
stages = &p_functions;
|
||||
const FunctionInfo &constants = p_functions.has("constants") ? p_functions["constants"] : FunctionInfo();
|
||||
|
||||
while (tk.type != TK_EOF) {
|
||||
switch (tk.type) {
|
||||
|
@ -7561,7 +7562,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
int array_size = 0;
|
||||
|
||||
if (tk.type == TK_BRACKET_OPEN) {
|
||||
Error error = _parse_global_array_size(array_size);
|
||||
Error error = _parse_global_array_size(array_size, constants);
|
||||
if (error != OK) {
|
||||
return error;
|
||||
}
|
||||
|
@ -7588,7 +7589,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
tk = _get_token();
|
||||
|
||||
if (tk.type == TK_BRACKET_OPEN) {
|
||||
Error error = _parse_global_array_size(member->array_size);
|
||||
Error error = _parse_global_array_size(member->array_size, constants);
|
||||
if (error != OK) {
|
||||
return error;
|
||||
}
|
||||
|
@ -7715,7 +7716,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
}
|
||||
|
||||
if (tk.type == TK_BRACKET_OPEN) {
|
||||
Error error = _parse_global_array_size(array_size);
|
||||
Error error = _parse_global_array_size(array_size, constants);
|
||||
if (error != OK) {
|
||||
return error;
|
||||
}
|
||||
|
@ -7730,7 +7731,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
prev_pos = _get_tkpos();
|
||||
name = tk.text;
|
||||
|
||||
if (_find_identifier(nullptr, false, FunctionInfo(), name)) {
|
||||
if (_find_identifier(nullptr, false, constants, name)) {
|
||||
_set_error("Redefinition of '" + String(name) + "'");
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -7763,7 +7764,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
|
||||
tk = _get_token();
|
||||
if (tk.type == TK_BRACKET_OPEN) {
|
||||
Error error = _parse_global_array_size(uniform2.array_size);
|
||||
Error error = _parse_global_array_size(uniform2.array_size, constants);
|
||||
if (error != OK) {
|
||||
return error;
|
||||
}
|
||||
|
@ -8017,7 +8018,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
||||
Node *expr = _parse_and_reduce_expression(nullptr, FunctionInfo());
|
||||
Node *expr = _parse_and_reduce_expression(nullptr, constants);
|
||||
if (!expr) {
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -8187,7 +8188,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
||||
if (_find_identifier(nullptr, false, FunctionInfo(), name)) {
|
||||
if (_find_identifier(nullptr, false, constants, name)) {
|
||||
_set_error("Redefinition of '" + String(name) + "'");
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -8300,7 +8301,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
} else {
|
||||
_set_tkpos(prev_pos);
|
||||
|
||||
Node *n = _parse_and_reduce_expression(nullptr, FunctionInfo());
|
||||
Node *n = _parse_and_reduce_expression(nullptr, constants);
|
||||
if (!n || n->type != Node::TYPE_CONSTANT || n->get_datatype() != TYPE_INT) {
|
||||
_set_error("Expected single integer constant > 0");
|
||||
return ERR_PARSE_ERROR;
|
||||
|
@ -8381,7 +8382,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
|
||||
if (tk.type == TK_PARENTHESIS_OPEN || curly) { // initialization
|
||||
while (true) {
|
||||
Node *n = _parse_and_reduce_expression(nullptr, FunctionInfo());
|
||||
Node *n = _parse_and_reduce_expression(nullptr, constants);
|
||||
if (!n) {
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -8436,7 +8437,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
constant.initializer = static_cast<ConstantNode *>(expr);
|
||||
} else {
|
||||
//variable created with assignment! must parse an expression
|
||||
Node *expr = _parse_and_reduce_expression(nullptr, FunctionInfo());
|
||||
Node *expr = _parse_and_reduce_expression(nullptr, constants);
|
||||
if (!expr) {
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -8483,7 +8484,7 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
}
|
||||
|
||||
name = tk.text;
|
||||
if (_find_identifier(nullptr, false, FunctionInfo(), name)) {
|
||||
if (_find_identifier(nullptr, false, constants, name)) {
|
||||
_set_error("Redefinition of '" + String(name) + "'");
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
@ -8517,6 +8518,12 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
|
|||
}
|
||||
}
|
||||
|
||||
if (p_functions.has("constants")) { // Adds global constants: 'PI', 'TAU', 'E'
|
||||
for (const KeyValue<StringName, BuiltInInfo> &E : p_functions["constants"].built_ins) {
|
||||
builtins.built_ins.insert(E.key, E.value);
|
||||
}
|
||||
}
|
||||
|
||||
ShaderNode::Function function;
|
||||
|
||||
function.callable = !p_functions.has(name);
|
||||
|
@ -9067,6 +9074,16 @@ Error ShaderLanguage::complete(const String &p_code, const Map<StringName, Funct
|
|||
}
|
||||
}
|
||||
|
||||
if (p_functions.has("constants")) {
|
||||
for (const KeyValue<StringName, BuiltInInfo> &E : p_functions["constants"].built_ins) {
|
||||
ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_MEMBER;
|
||||
if (E.value.constant) {
|
||||
kind = ScriptCodeCompletionOption::KIND_CONSTANT;
|
||||
}
|
||||
matches.insert(E.key, kind);
|
||||
}
|
||||
}
|
||||
|
||||
if (skip_function != StringName() && p_functions.has(skip_function)) {
|
||||
for (const KeyValue<StringName, BuiltInInfo> &E : p_functions[skip_function].built_ins) {
|
||||
ScriptCodeCompletionOption::Kind kind = ScriptCodeCompletionOption::KIND_MEMBER;
|
||||
|
|
|
@ -989,7 +989,7 @@ private:
|
|||
bool _check_node_constness(const Node *p_node) const;
|
||||
|
||||
Node *_parse_array_size(BlockNode *p_block, const FunctionInfo &p_function_info, int &r_array_size);
|
||||
Error _parse_global_array_size(int &r_array_size);
|
||||
Error _parse_global_array_size(int &r_array_size, const FunctionInfo &p_function_info);
|
||||
Error _parse_local_array_size(BlockNode *p_block, const FunctionInfo &p_function_info, ArrayDeclarationNode *p_node, ArrayDeclarationNode::Declaration *p_decl, int &r_array_size, bool &r_is_unknown_size);
|
||||
|
||||
Node *_parse_expression(BlockNode *p_block, const FunctionInfo &p_function_info);
|
||||
|
|
|
@ -59,9 +59,9 @@ ShaderTypes::ShaderTypes() {
|
|||
/*************** SPATIAL ***********************/
|
||||
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["global"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["global"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["global"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["constants"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["constants"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["constants"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["VERTEX"] = ShaderLanguage::TYPE_VEC3;
|
||||
shader_modes[RS::SHADER_SPATIAL].functions["vertex"].built_ins["NORMAL"] = ShaderLanguage::TYPE_VEC3;
|
||||
|
@ -241,9 +241,9 @@ ShaderTypes::ShaderTypes() {
|
|||
/************ CANVAS ITEM **************************/
|
||||
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["global"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["global"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["global"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["constants"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["constants"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["constants"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["vertex"].built_ins["VERTEX"] = ShaderLanguage::TYPE_VEC2;
|
||||
shader_modes[RS::SHADER_CANVAS_ITEM].functions["vertex"].built_ins["UV"] = ShaderLanguage::TYPE_VEC2;
|
||||
|
@ -334,9 +334,9 @@ ShaderTypes::ShaderTypes() {
|
|||
/************ PARTICLES **************************/
|
||||
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["global"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["global"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["global"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["constants"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["constants"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["constants"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["COLOR"] = ShaderLanguage::TYPE_VEC4;
|
||||
shader_modes[RS::SHADER_PARTICLES].functions["start"].built_ins["VELOCITY"] = ShaderLanguage::TYPE_VEC3;
|
||||
|
@ -400,9 +400,9 @@ ShaderTypes::ShaderTypes() {
|
|||
/************ SKY **************************/
|
||||
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["constants"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["constants"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["constants"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["POSITION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["RADIANCE"] = constt(ShaderLanguage::TYPE_SAMPLERCUBE);
|
||||
shader_modes[RS::SHADER_SKY].functions["global"].built_ins["AT_HALF_RES_PASS"] = constt(ShaderLanguage::TYPE_BOOL);
|
||||
|
@ -446,9 +446,9 @@ ShaderTypes::ShaderTypes() {
|
|||
/************ FOG **************************/
|
||||
|
||||
shader_modes[RS::SHADER_FOG].functions["global"].built_ins["TIME"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["global"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["global"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["global"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["constants"].built_ins["PI"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["constants"].built_ins["TAU"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
shader_modes[RS::SHADER_FOG].functions["constants"].built_ins["E"] = constt(ShaderLanguage::TYPE_FLOAT);
|
||||
|
||||
shader_modes[RS::SHADER_FOG].functions["fog"].built_ins["WORLD_POSITION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||
shader_modes[RS::SHADER_FOG].functions["fog"].built_ins["OBJECT_POSITION"] = constt(ShaderLanguage::TYPE_VEC3);
|
||||
|
|
Loading…
Reference in a new issue