You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-11 13:10:58 +00:00
Add basic support to evaluate operator value in shader language
This commit is contained in:
@@ -355,6 +355,13 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
union Scalar {
|
||||
bool boolean = false;
|
||||
float real;
|
||||
int32_t sint;
|
||||
uint32_t uint;
|
||||
};
|
||||
|
||||
struct Node {
|
||||
Node *next = nullptr;
|
||||
|
||||
@@ -379,6 +386,7 @@ public:
|
||||
virtual String get_datatype_name() const { return ""; }
|
||||
virtual int get_array_size() const { return 0; }
|
||||
virtual bool is_indexed() const { return false; }
|
||||
virtual Vector<Scalar> get_values() const { return Vector<Scalar>(); }
|
||||
|
||||
Node(Type t) :
|
||||
type(t) {}
|
||||
@@ -402,11 +410,13 @@ public:
|
||||
Operator op = OP_EQUAL;
|
||||
StringName struct_name;
|
||||
Vector<Node *> arguments;
|
||||
Vector<Scalar> values;
|
||||
|
||||
virtual DataType get_datatype() const override { return return_cache; }
|
||||
virtual String get_datatype_name() const override { return String(struct_name); }
|
||||
virtual int get_array_size() const override { return return_array_size; }
|
||||
virtual bool is_indexed() const override { return op == OP_INDEX; }
|
||||
virtual Vector<Scalar> get_values() const override { return values; }
|
||||
|
||||
OperatorNode() :
|
||||
Node(NODE_TYPE_OPERATOR) {}
|
||||
@@ -485,19 +495,15 @@ public:
|
||||
String struct_name = "";
|
||||
int array_size = 0;
|
||||
|
||||
union Value {
|
||||
bool boolean = false;
|
||||
float real;
|
||||
int32_t sint;
|
||||
uint32_t uint;
|
||||
};
|
||||
|
||||
Vector<Value> values;
|
||||
Vector<Scalar> values;
|
||||
Vector<VariableDeclarationNode::Declaration> array_declarations;
|
||||
|
||||
virtual DataType get_datatype() const override { return datatype; }
|
||||
virtual String get_datatype_name() const override { return struct_name; }
|
||||
virtual int get_array_size() const override { return array_size; }
|
||||
virtual Vector<Scalar> get_values() const override {
|
||||
return values;
|
||||
}
|
||||
|
||||
ConstantNode() :
|
||||
Node(NODE_TYPE_CONSTANT) {}
|
||||
@@ -529,13 +535,14 @@ public:
|
||||
int line; //for completion
|
||||
int array_size;
|
||||
bool is_const;
|
||||
ConstantNode::Value value;
|
||||
Vector<Scalar> values;
|
||||
};
|
||||
|
||||
HashMap<StringName, Variable> variables;
|
||||
List<Node *> statements;
|
||||
bool single_statement = false;
|
||||
bool use_comma_between_statements = false;
|
||||
bool use_op_eval = true;
|
||||
|
||||
BlockNode() :
|
||||
Node(NODE_TYPE_BLOCK) {}
|
||||
@@ -657,7 +664,7 @@ public:
|
||||
DataType type = TYPE_VOID;
|
||||
DataPrecision precision = PRECISION_DEFAULT;
|
||||
int array_size = 0;
|
||||
Vector<ConstantNode::Value> default_value;
|
||||
Vector<Scalar> default_value;
|
||||
Scope scope = SCOPE_LOCAL;
|
||||
Hint hint = HINT_NONE;
|
||||
bool use_color = false;
|
||||
@@ -803,15 +810,16 @@ public:
|
||||
static bool is_token_operator_assign(TokenType p_type);
|
||||
static bool is_token_hint(TokenType p_type);
|
||||
|
||||
static bool convert_constant(ConstantNode *p_constant, DataType p_to_type, ConstantNode::Value *p_value = nullptr);
|
||||
static bool convert_constant(ConstantNode *p_constant, DataType p_to_type, Scalar *p_value = nullptr);
|
||||
static DataType get_scalar_type(DataType p_type);
|
||||
static int get_cardinality(DataType p_type);
|
||||
static bool is_scalar_type(DataType p_type);
|
||||
static bool is_float_type(DataType p_type);
|
||||
static bool is_sampler_type(DataType p_type);
|
||||
static Variant constant_value_to_variant(const Vector<ShaderLanguage::ConstantNode::Value> &p_value, DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint = ShaderLanguage::ShaderNode::Uniform::HINT_NONE);
|
||||
static Variant constant_value_to_variant(const Vector<Scalar> &p_value, DataType p_type, int p_array_size, ShaderLanguage::ShaderNode::Uniform::Hint p_hint = ShaderLanguage::ShaderNode::Uniform::HINT_NONE);
|
||||
static PropertyInfo uniform_to_property_info(const ShaderNode::Uniform &p_uniform);
|
||||
static uint32_t get_datatype_size(DataType p_type);
|
||||
static uint32_t get_datatype_component_count(DataType p_type);
|
||||
|
||||
static void get_keyword_list(List<String> *r_keywords);
|
||||
static bool is_control_flow_keyword(String p_keyword);
|
||||
@@ -1070,13 +1078,21 @@ private:
|
||||
|
||||
IdentifierType last_type = IDENTIFIER_MAX;
|
||||
|
||||
bool _find_identifier(const BlockNode *p_block, bool p_allow_reassign, const FunctionInfo &p_function_info, const StringName &p_identifier, DataType *r_data_type = nullptr, IdentifierType *r_type = nullptr, bool *r_is_const = nullptr, int *r_array_size = nullptr, StringName *r_struct_name = nullptr, ConstantNode::Value *r_constant_value = nullptr);
|
||||
bool _find_identifier(const BlockNode *p_block, bool p_allow_reassign, const FunctionInfo &p_function_info, const StringName &p_identifier, DataType *r_data_type = nullptr, IdentifierType *r_type = nullptr, bool *r_is_const = nullptr, int *r_array_size = nullptr, StringName *r_struct_name = nullptr, Vector<Scalar> *r_constant_values = nullptr);
|
||||
#ifdef DEBUG_ENABLED
|
||||
void _parse_used_identifier(const StringName &p_identifier, IdentifierType p_type, const StringName &p_function);
|
||||
#endif // DEBUG_ENABLED
|
||||
bool _is_operator_assign(Operator p_op) const;
|
||||
bool _validate_assign(Node *p_node, const FunctionInfo &p_function_info, String *r_message = nullptr);
|
||||
bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = nullptr, int *r_ret_size = nullptr);
|
||||
bool _validate_operator(const BlockNode *p_block, OperatorNode *p_op, DataType *r_ret_type = nullptr, int *r_ret_size = nullptr);
|
||||
|
||||
Vector<Scalar> _get_node_values(const BlockNode *p_block, Node *p_node);
|
||||
bool _eval_operator(const BlockNode *p_block, OperatorNode *p_op);
|
||||
Scalar _eval_unary_scalar(const Scalar &p_a, Operator p_op, DataType p_ret_type);
|
||||
Scalar _eval_scalar(const Scalar &p_a, const Scalar &p_b, Operator p_op, DataType p_ret_type, bool &r_is_valid);
|
||||
Vector<Scalar> _eval_unary_vector(const Vector<Scalar> &p_va, DataType p_ret_type, Operator p_op);
|
||||
Vector<Scalar> _eval_vector(const Vector<Scalar> &p_va, const Vector<Scalar> &p_vb, DataType p_left_type, DataType p_right_type, DataType p_ret_type, Operator p_op, bool &r_is_valid);
|
||||
Vector<Scalar> _eval_vector_transform(const Vector<Scalar> &p_va, const Vector<Scalar> &p_vb, DataType p_left_type, DataType p_right_type, DataType p_ret_type);
|
||||
|
||||
struct BuiltinEntry {
|
||||
const char *name;
|
||||
|
||||
Reference in New Issue
Block a user