34using bke::AttributeAccessor;
35using bke::AttributeDomainAndType;
36using bke::AttributeFieldInput;
37using bke::AttributeFilter;
38using bke::AttributeIter;
39using bke::AttributeMetaData;
40using bke::AttributeReader;
41using bke::AttributeWriter;
42using bke::CurveComponent;
43using bke::GAttributeReader;
44using bke::GAttributeWriter;
45using bke::GeometryComponent;
46using bke::GeometryComponentEditData;
47using bke::GeometryNodesReferenceSet;
48using bke::GeometrySet;
49using bke::GreasePencilComponent;
50using bke::GSpanAttributeWriter;
51using bke::InstancesComponent;
52using bke::MeshComponent;
53using bke::MutableAttributeAccessor;
54using bke::PointCloudComponent;
55using bke::SocketValueVariant;
56using bke::SpanAttributeWriter;
57using bke::VolumeComponent;
59using fn::FieldContext;
60using fn::FieldEvaluator;
62using fn::FieldOperation;
81 const Span<int> lf_input_for_output_bsocket_usage_;
82 const Span<int> lf_input_for_attribute_propagation_to_output_;
83 const FunctionRef<std::string(
int)> get_output_attribute_id_;
89 const Span<int> lf_input_for_output_bsocket_usage,
90 const Span<int> lf_input_for_attribute_propagation_to_output,
91 const FunctionRef<std::string(
int)> get_output_attribute_id)
94 lf_context_(lf_context),
95 lf_input_for_output_bsocket_usage_(lf_input_for_output_bsocket_usage),
96 lf_input_for_attribute_propagation_to_output_(
97 lf_input_for_attribute_propagation_to_output),
98 get_output_attribute_id_(get_output_attribute_id)
110 this->check_input_access(identifier);
112 const int index = this->get_input_index(identifier);
114 using ValueT =
typename T::value_type;
115 BLI_assert(node_.input_by_identifier(identifier)->is_multi_input());
116 if constexpr (std::is_same_v<ValueT, SocketValueVariant>) {
117 return params_.extract_input<
T>(index);
123 values.
values.reserve(values_variants.values.size());
124 for (
const int i : values_variants.values.index_range()) {
125 values.
values.append(values_variants.values[
i].extract<ValueT>());
132 if constexpr (std::is_same_v<T, SocketValueVariant>) {
133 return value_variant;
135 else if constexpr (std::is_enum_v<T>) {
140 if constexpr (std::is_same_v<T, GeometrySet>) {
157 this->check_input_access(identifier);
159 const int index = this->get_input_index(identifier);
161 using ValueT =
typename T::value_type;
162 BLI_assert(node_.input_by_identifier(identifier)->is_multi_input());
163 if constexpr (std::is_same_v<ValueT, SocketValueVariant>) {
164 return params_.get_input<
T>(index);
169 for (
const int i : values_variants.values.index_range()) {
170 values[
i] = values_variants.
values[
i].extract<ValueT>();
177 if constexpr (std::is_same_v<T, SocketValueVariant>) {
178 return value_variant;
180 else if constexpr (std::is_enum_v<T>) {
184 T value = value_variant.
get<
T>();
185 if constexpr (std::is_same_v<T, GeometrySet>) {
208 using StoredT = std::decay_t<T>;
210 this->check_output_access(identifier);
212 if constexpr (std::is_same_v<StoredT, GeometrySet>) {
215 const int index = this->get_output_index(identifier);
216 if constexpr (std::is_same_v<StoredT, SocketValueVariant>) {
217 params_.set_output(index, std::forward<T>(value));
234 const int index = this->get_input_index(identifier);
235 params_.set_input_unused(index);
243 const int index = this->get_output_index(identifier);
258 return data->call_data->self_object();
266 if (
data->call_data->modifier_data) {
267 return data->call_data->modifier_data->depsgraph;
269 if (
data->call_data->operator_data) {
270 return data->call_data->operator_data->depsgraphs->active;
304 lf_input_for_output_bsocket_usage_[node_.output_by_identifier(output_identifier)
305 ->index_in_all_outputs()];
306 return params_.get_input<
bool>(lf_index);
314 const StringRef output_identifier,
const bool force_create =
false)
319 const bNodeSocket &output_socket = *node_.output_by_identifier(output_identifier);
320 return get_output_attribute_id_(output_socket.index());
328 const int lf_index = lf_input_for_attribute_propagation_to_output_
329 [node_.output_by_identifier(output_identifier)->index_in_all_outputs()];
342 void check_input_access(
StringRef identifier)
const;
343 void check_output_access(
StringRef identifier)
const;
348 int get_input_index(
const StringRef identifier)
const
351 for (
const bNodeSocket *socket : node_.input_sockets()) {
352 if (!socket->is_available()) {
355 if (socket->identifier == identifier) {
364 int get_output_index(
const StringRef identifier)
const
367 for (
const bNodeSocket *socket : node_.output_sockets()) {
368 if (!socket->is_available()) {
371 if (socket->identifier == identifier) {
#define BLI_assert_unreachable()
struct bNodeSocket bNodeSocket
BMesh const char void * data
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()
const Object * self_object() const
NodeAttributeFilter(const GeometryNodesReferenceSet &set)
static SocketValueVariant From(T &&value)
constexpr bool is_GeoNodesMultiInput_v
geo_eval_log::GeoTreeLogger * try_get_tree_logger(const GeoNodesUserData &user_data) const