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