31using bke::AttributeAccessor;
32using bke::AttributeDomainAndType;
33using bke::AttributeFieldInput;
34using bke::AttributeFilter;
35using bke::AttributeIter;
36using bke::AttributeMetaData;
37using bke::AttributeReader;
38using bke::AttributeWriter;
39using bke::CurveComponent;
40using bke::GAttributeReader;
41using bke::GAttributeWriter;
42using bke::GeometryComponent;
43using bke::GeometryComponentEditData;
44using bke::GeometryNodesReferenceSet;
45using bke::GeometrySet;
46using bke::GreasePencilComponent;
47using bke::GSpanAttributeWriter;
48using bke::InstancesComponent;
49using bke::MeshComponent;
50using bke::MutableAttributeAccessor;
51using bke::PointCloudComponent;
52using bke::SocketValueVariant;
53using bke::SpanAttributeWriter;
54using bke::VolumeComponent;
56using fn::FieldContext;
57using fn::FieldEvaluator;
59using fn::FieldOperation;
78 const Span<int> lf_input_for_output_bsocket_usage_;
79 const Span<int> lf_input_for_attribute_propagation_to_output_;
80 const FunctionRef<std::string(
int)> get_output_attribute_id_;
86 const Span<int> lf_input_for_output_bsocket_usage,
87 const Span<int> lf_input_for_attribute_propagation_to_output,
88 const FunctionRef<std::string(
int)> get_output_attribute_id)
91 lf_context_(lf_context),
92 lf_input_for_output_bsocket_usage_(lf_input_for_output_bsocket_usage),
93 lf_input_for_attribute_propagation_to_output_(
94 lf_input_for_attribute_propagation_to_output),
95 get_output_attribute_id_(get_output_attribute_id)
130 const int index = this->get_input_index(identifier);
131 T value = params_.extract_input<
T>(index);
132 if constexpr (std::is_same_v<T, GeometrySet>) {
135 if constexpr (std::is_same_v<T, SocketValueVariant>) {
153 return value_variant.extract<
T>();
159 const int index = this->get_input_index(identifier);
160 const T &value = params_.get_input<
T>(index);
161 if constexpr (std::is_same_v<T, GeometrySet>) {
164 if constexpr (std::is_same_v<T, SocketValueVariant>) {
187 using StoredT = std::decay_t<T>;
190 this->
set_output(identifier, std::move(value_variant));
195 this->check_output_access(identifier, type);
196 if constexpr (std::is_same_v<StoredT, SocketValueVariant>) {
201 if constexpr (std::is_same_v<StoredT, GeometrySet>) {
204 const int index = this->get_output_index(identifier);
205 params_.set_output(index, std::forward<T>(value));
219 const int index = this->get_input_index(identifier);
220 params_.set_input_unused(index);
228 const int index = this->get_output_index(identifier);
243 return data->call_data->self_object();
251 if (
data->call_data->modifier_data) {
252 return data->call_data->modifier_data->depsgraph;
254 if (
data->call_data->operator_data) {
255 return data->call_data->operator_data->depsgraphs->active;
289 lf_input_for_output_bsocket_usage_[node_.output_by_identifier(output_identifier)
290 .index_in_all_outputs()];
291 return params_.get_input<
bool>(lf_index);
299 const StringRef output_identifier,
const bool force_create =
false)
304 const bNodeSocket &output_socket = node_.output_by_identifier(output_identifier);
305 return get_output_attribute_id_(output_socket.index());
314 lf_input_for_attribute_propagation_to_output_[node_.output_by_identifier(output_identifier)
315 .index_in_all_outputs()];
328 void check_input_access(
StringRef identifier,
const CPPType *requested_type =
nullptr)
const;
329 void check_output_access(
StringRef identifier,
const CPPType &value_type)
const;
334 int get_input_index(
const StringRef identifier)
const
337 for (
const bNodeSocket *socket : node_.input_sockets()) {
338 if (!socket->is_available()) {
341 if (socket->identifier == identifier) {
350 int get_output_index(
const StringRef identifier)
const
353 for (
const bNodeSocket *socket : node_.output_sockets()) {
354 if (!socket->is_available()) {
357 if (socket->identifier == identifier) {
#define BLI_assert_unreachable()
struct bNodeSocket bNodeSocket
BMesh const char void * data
static const CPPType & get()
T extract_input(StringRef identifier)
GeoNodesLocalUserData * local_user_data() const
geo_eval_log::GeoTreeLogger * get_local_tree_logger() const
void error_message_add(const NodeWarningType type, StringRef message) const
void set_output(StringRef identifier, T &&value)
void set_input_unused(StringRef identifier)
void check_output_geometry_set(const GeometrySet &geometry_set) const
bool output_is_required(StringRef identifier) const
GeoNodeExecParams(const bNode &node, lf::Params ¶ms, const lf::Context &lf_context, const Span< int > lf_input_for_output_bsocket_usage, const Span< int > lf_input_for_attribute_propagation_to_output, const FunctionRef< std::string(int)> get_output_attribute_id)
T get_input(StringRef identifier) const
GeoNodesUserData * user_data() const
void check_input_geometry_set(StringRef identifier, const GeometrySet &geometry_set) const
std::optional< std::string > ensure_absolute_path(StringRefNull path) const
bool anonymous_attribute_output_is_required(const StringRef output_identifier)
void used_named_attribute(StringRef attribute_name, NamedAttributeUsage usage)
std::optional< std::string > get_output_anonymous_attribute_id_if_needed(const StringRef output_identifier, const bool force_create=false)
const bNode & node() const
void set_default_remaining_outputs()
NodeAttributeFilter get_attribute_filter(const StringRef output_identifier) const
const Depsgraph * depsgraph() const
lf::Params & low_level_lazy_function_params()
static constexpr bool is_field_base_type_v
const Object * self_object() const
static constexpr bool stored_as_SocketValueVariant_v
NodeAttributeFilter(const GeometryNodesReferenceSet &set)
static constexpr bool is_VolumeGrid_v
static constexpr bool is_field_v
QuaternionBase< float > Quaternion
constexpr bool is_same_any_v
MatBase< float, 4, 4 > float4x4
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
geo_eval_log::GeoTreeLogger * try_get_tree_logger(const GeoNodesUserData &user_data) const