87 const std::shared_ptr<const FieldInputs> &
field_inputs()
const;
115 operator bool()
const
117 return node_ !=
nullptr;
124 return *a.node_ == *
b.node_ && a.node_output_index_ ==
b.node_output_index_;
206 static_assert(std::is_same_v<T, U>);
217static constexpr bool is_field_v = std::is_base_of_v<detail::TypedFieldBase, T> &&
218 !std::is_same_v<detail::TypedFieldBase, T>;
228 std::shared_ptr<const mf::MultiFunction> owned_function_;
244 static std::shared_ptr<FieldOperation>
Create(std::shared_ptr<const mf::MultiFunction> function,
247 return std::make_shared<FieldOperation>(
FieldOperation(std::move(function), inputs));
252 return std::make_shared<FieldOperation>(
FieldOperation(function, inputs));
339 struct OutputPointerInfo {
353 bool is_evaluated_ =
false;
361 : context_(context), mask_(*mask)
367 : context_(context), mask_(scope_.construct<
IndexMask>(size))
387 selection_field_ = std::move(selection);
433 output_pointer_infos_.
append(OutputPointerInfo{
453 return evaluated_varrays_[field_index];
492 const FieldContext &context,
573 return this == &other;
578 return a.is_equal_to(
b);
604 int output_counter = 0;
608 if (output_counter == output_index) {
#define BLI_assert_unreachable()
#define UNUSED_VARS_NDEBUG(...)
static const CPPType & get()
VArray< T > typed() const
int64_t append_and_get_index(const T &value)
void append(const T &value)
FieldConstant(const CPPType &type, const void *value)
const CPPType & type() const
const CPPType & output_cpp_type(int output_index) const override
virtual GVArray get_varray_for_input(const FieldInput &field_input, const IndexMask &mask, ResourceScope &scope) const
virtual ~FieldContext()=default
FieldEvaluator(const FieldContext &context, const int64_t size)
FieldEvaluator(const FieldContext &context, const IndexMask *mask)
void set_selection(Field< bool > selection)
int add(GField field, GVArray *varray_ptr)
IndexMask get_evaluated_as_mask(int field_index)
int add(Field< T > field, VArray< T > *varray_ptr)
IndexMask get_evaluated_selection_as_mask() const
int add_with_destination(Field< T > field, MutableSpan< T > dst)
VArray< T > get_evaluated(const int field_index)
int add_with_destination(GField field, GVMutableArray dst)
const GVArray & get_evaluated(const int field_index) const
int add_with_destination(Field< T > field, VMutableArray< T > dst)
FieldNodeType node_type() const
virtual void for_each_field_input_recursive(FunctionRef< void(const FieldInput &)> fn) const
std::shared_ptr< const FieldInputs > field_inputs_
virtual bool is_equal_to(const FieldNode &other) const
virtual uint64_t hash() const
virtual const CPPType & output_cpp_type(int output_index) const =0
FieldNode(FieldNodeType node_type)
bool depends_on_input() const
const std::shared_ptr< const FieldInputs > & field_inputs() const
static std::shared_ptr< FieldOperation > Create(std::shared_ptr< const mf::MultiFunction > function, Vector< GField > inputs={})
Span< GField > inputs() const
static std::shared_ptr< FieldOperation > Create(const mf::MultiFunction &function, Vector< GField > inputs={})
FieldOperation(std::shared_ptr< const mf::MultiFunction > function, Vector< GField > inputs={})
const CPPType & output_cpp_type(int output_index) const override
const mf::MultiFunction & multi_function() const
Field(std::shared_ptr< FieldNode > node, const int node_output_index=0)
GFieldBase(NodePtr node, const int node_output_index)
const CPPType & cpp_type() const
const FieldNode & node() const
int node_output_index() const
friend bool operator==(const GFieldBase &a, const GFieldBase &b)
GFieldRef(const FieldNode &node, const int node_output_index=0)
GFieldRef(const GField &field)
GField(std::shared_ptr< FieldNode > node, const int node_output_index=0)
const CPPType & single_type() const
ParamType param_type(int param_index) const
IndexRange param_indices() const
const DataType & data_type() const
local_group_size(16, 16) .push_constant(Type b
bool operator==(const FieldNode &a, const FieldNode &b)
bool operator!=(const FieldNode &a, const FieldNode &b)
GField make_constant_field(const CPPType &type, const void *value)
Vector< GVArray > evaluate_fields(ResourceScope &scope, Span< GFieldRef > fields_to_evaluate, const IndexMask &mask, const FieldContext &context, Span< GVMutableArray > dst_varrays={})
GField make_field_constant_if_possible(GField field)
Field< bool > invert_boolean_field(const Field< bool > &field)
void evaluate_constant_field(const GField &field, void *r_value)
static constexpr bool is_field_v
uint64_t get_default_hash(const T &v)
unsigned __int64 uint64_t