23 b.add_input<
decl::Geometry>(
"Points").description(
"Points to instance on");
24 b.add_input<
decl::Bool>(
"Selection").default_value(
true).field_on({0}).hide_value();
25 b.add_input<
decl::Geometry>(
"Instance").description(
"Geometry that is instanced on the points");
29 "Choose instances from the \"Instance\" input at each point instead of instancing the "
34 "Index of the instance used for each point. This is only used when Pick Instances "
35 "is on. By default the point index is used");
36 b.add_input<
decl::Rotation>(
"Rotation").field_on({0}).description(
"Rotation of the instances");
38 .default_value({1.0f, 1.0f, 1.0f})
41 .description(
"Scale of the instances");
54 const AttrDomain domain = AttrDomain::Point;
55 const int domain_num = src_attributes.
domain_size(domain);
64 evaluator.set_selection(selection_field);
73 const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
74 if (selection.is_empty()) {
81 const int select_len = selection.index_range().size();
82 dst_component.
resize(start_len + select_len);
96 if (src_instances !=
nullptr &&
101 for (
const int src_instance_handle : src_references.
index_range()) {
103 const int dst_instance_handle = dst_component.
add_reference(reference);
104 handle_mapping[src_instance_handle] = dst_instance_handle;
108 const int full_instance_handle = dst_component.
add_reference(instance);
114 float4x4 &dst_transform = dst_transforms[range_i];
118 int dst_handle = empty_reference_handle;
120 const bool use_individual_instance = pick_instance[i];
121 if (use_individual_instance) {
122 if (src_instances !=
nullptr) {
123 const int src_instances_num = src_instances->instances_num();
124 const int original_index = indices[i];
127 const int index =
mod_i(original_index, std::max(src_instances_num, 1));
128 if (index < src_instances_num) {
130 const int src_handle = src_instances->reference_handles()[index];
131 dst_handle = handle_mapping[src_handle];
140 dst_handle = full_instance_handle;
143 dst_handles[range_i] = dst_handle;
148 if (instance.has_realized_data()) {
150 NodeWarningType::Info,
151 TIP_(
"Realized geometry is not used when pick instances is true"));
157 for (
const auto item : attributes_to_propagate.
items()) {
172 dst_attributes.
add(
id, AttrDomain::Instance, data_type,
init);
197 if (dst_instances ==
nullptr) {
199 instances_component.
replace(dst_instances);
211 attributes_to_propagate);
212 attributes_to_propagate.
remove(
"position");
213 attributes_to_propagate.
remove(
".reference_index");
216 if (geometry_set.
has(type)) {
224 attributes_to_propagate);
228 using namespace bke::greasepencil;
231 for (
const int layer_index : grease_pencil.layers().index_range()) {
232 const Drawing *drawing = grease_pencil.get_eval_drawing(grease_pencil.layer(layer_index));
233 if (drawing ==
nullptr) {
248 grease_pencil, AttrDomain::Point, layer_index);
254 attributes_to_propagate);
261 instances->attributes_for_write(),
280 instances->remove_unused_references();
283 params.set_output(
"Instances", std::move(geometry_set));
Low-level operations for curves.
Low-level operations for grease pencil.
#define NODE_CLASS_GEOMETRY
MINLINE int mod_i(int i, int n)
void mul_m4_m4_post(float R[4][4], const float B[4][4])
#define NOD_REGISTER_NODE(REGISTER_FUNC)
void reinitialize(const int64_t new_size)
GMutableSpan slice(const int64_t start, int64_t size) const
const void * data() const
GSpan get_internal_span() const
bool remove(const Key &key)
ItemIterator items() const
constexpr MutableSpan slice(const int64_t start, const int64_t size) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
T get_internal_single() const
GAttributeReader lookup(const StringRef attribute_id) const
int domain_size(const AttrDomain domain) const
bool contains(const StringRef attribute_id) const
AttributeAccessor attributes() const
virtual std::optional< AttributeAccessor > attributes() const
Instances * get_for_write()
void replace(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
MutableSpan< int > reference_handles_for_write()
int add_reference(const InstanceReference &reference)
void resize(int capacity)
bke::MutableAttributeAccessor attributes_for_write()
int instances_num() const
MutableSpan< float4x4 > transforms_for_write()
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_for_write_span(StringRef attribute_id)
const bke::CurvesGeometry & strokes() const
local_group_size(16, 16) .push_constant(Type b
void gather(const GVArray &src, const IndexMask &indices, GMutableSpan dst, int64_t grain_size=4096)
void node_register_type(bNodeType *ntype)
bke::GeometrySet join_geometries(Span< bke::GeometrySet > geometries, const bke::AttributeFilter &attribute_filter, const std::optional< Span< bke::GeometryComponent::Type > > &component_types_to_join=std::nullopt)
MatT from_loc_rot_scale(const typename MatT::loc_type &location, const RotationT &rotation, const VecBase< typename MatT::base_type, ScaleDim > &scale)
static void node_geo_exec(GeoNodeExecParams params)
static void add_instances_from_component(bke::Instances &dst_component, const AttributeAccessor &src_attributes, const GeometrySet &instance, const fn::FieldContext &field_context, const GeoNodeExecParams ¶ms, const Map< StringRef, AttributeKind > &attributes_to_propagate)
static void node_declare(NodeDeclarationBuilder &b)
static void node_register()
void geo_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
const c_style_mat & ptr() const
static MatBase identity()
const ImplicitSharingInfo * sharing_info
GeometryComponent & get_component_for_write(GeometryComponent::Type component_type)
static GeometrySet from_instances(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
Instances * get_instances_for_write()
const GreasePencil * get_grease_pencil() const
void gather_attributes_for_propagation(Span< GeometryComponent::Type > component_types, GeometryComponent::Type dst_component_type, bool include_instances, const AttributeFilter &attribute_filter, Map< StringRef, AttributeKind > &r_attributes) const
bool has(const GeometryComponent::Type component_type) const
const GeometryComponent * get_component(GeometryComponent::Type component_type) const
bool has_grease_pencil() const
static void propagate_attributes_from_layer_to_instances(const AttributeAccessor src_attributes, MutableAttributeAccessor dst_attributes, const AttributeFilter &attribute_filter)
void ensure_owns_direct_data()
void modify_geometry_sets(ForeachSubGeometryCallback callback)
void remove_geometry_during_modify()
void replace_grease_pencil(GreasePencil *grease_pencil, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
NodeGeometryExecFunction geometry_node_execute
NodeDeclareFunction declare