15 b.add_input<
decl::Geometry>(
"Curves").description(
"Either plain curves or curve instances");
20 .description(
"Either a curve or instance selection");
23 .
description(
"Create a separate layer for each instance");
39 const IndexMask curves_selection = evaluator.get_evaluated_selection_as_mask();
41 const IndexMask curves_to_delete = curves_selection.
complement(curves.curves_range(), memory);
42 curves.remove_curves(curves_to_delete, attribute_filter);
45 grease_pencil->add_layers_with_empty_drawings_for_eval(1);
47 layer.set_name(layer_name);
52 const int materials_num = curves_id.
totcol;
54 grease_pencil->
material_array = MEM_cnew_array<Material *>(materials_num, __func__);
65 const Span<int> reference_handles = instances.reference_handles();
69 const int instances_num = instances.instances_num();
70 if (instances_num == 0) {
78 const IndexMask instance_selection = evaluator.get_evaluated_selection_as_mask();
80 const int layer_num = instance_selection.
size();
88 grease_pencil->add_layers_with_empty_drawings_for_eval(layer_num);
94 layer.set_name(reference.name());
95 layer.set_local_transform(transforms[instance_i]);
98 reference.to_geometry_set(instance_geometry);
100 if (!instance_curves) {
105 strokes = instance_curves->
geometry.wrap();
116 for (
int &material_index : material_indices.
span) {
117 if (material_index >= 0 && material_index < new_material_indices.
size()) {
118 material_index = new_material_indices[material_index];
121 material_indices.
finish();
125 grease_pencil->
material_array = MEM_cnew_array<Material *>(all_materials.
size(), __func__);
144 if (instance_selection.
size() == instances_num && src_attribute.varray.is_span() &&
145 src_attribute.sharing_info)
148 grease_pencil_attributes.
add(
153 *src_attribute.sharing_info});
156 if (!grease_pencil_attributes.
add(
171 "opacity", AttrDomain::Instance, 1.0f);
172 instance_selection.
foreach_index([&](
const int instance_i,
const int layer_i) {
173 grease_pencil->layer(layer_i).opacity = opacities[instance_i];
177 return grease_pencil;
184 const bool instances_as_layers =
params.extract_input<
bool>(
"Instances as Layers");
188 if (instances_as_layers) {
190 params.error_message_add(NodeWarningType::Info,
TIP_(
"Non-instance curves are ignored"));
194 params.set_default_remaining_outputs();
198 *instances, selection_field, attribute_filter);
202 params.error_message_add(NodeWarningType::Info,
TIP_(
"Instances are ignored"));
206 params.set_default_remaining_outputs();
210 *curves_id, selection_field, curves_geometry.
name, attribute_filter);
214 grease_pencil_geometry.
name = std::move(curves_geometry.
name);
215 params.set_output(
"Grease Pencil", std::move(grease_pencil_geometry));
Low-level operations for curves.
Low-level operations for grease pencil.
GreasePencil * BKE_grease_pencil_new_nomain()
#define NODE_CLASS_GEOMETRY
#define NOD_REGISTER_NODE(REGISTER_FUNC)
int64_t index_of_or_add(const Key &key)
void append(const T &value)
bool is_builtin(const StringRef attribute_id) const
void foreach_attribute(const FunctionRef< void(const AttributeIter &)> fn) const
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
eCustomDataType data_type
GAttributeReader get() const
MutableAttributeAccessor attributes_for_write()
GSpanAttributeWriter lookup_or_add_for_write_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const AttributeInit &initializer=AttributeInitDefaultValue())
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_for_write_span(StringRef attribute_id)
bke::CurvesGeometry & strokes_for_write()
void set_selection(Field< bool > selection)
IndexMask complement(const IndexMask &universe, IndexMaskMemory &memory) const
void foreach_index(Fn &&fn) 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_type_size(bNodeType *ntype, int width, int minwidth, int maxwidth)
void node_register_type(bNodeType *ntype)
static GreasePencil * curve_instances_to_grease_pencil_layers(const bke::Instances &instances, const Field< bool > &selection_field, const AttributeFilter &attribute_filter)
static void node_register()
static void node_geo_exec(GeoNodeExecParams params)
static GreasePencil * curves_to_grease_pencil_with_one_layer(const Curves &curves_id, const Field< bool > &selection_field, const StringRefNull layer_name, const AttributeFilter &attribute_filter)
static void node_declare(NodeDeclarationBuilder &b)
void initialized_copy_n(const T *src, int64_t n, T *dst)
void geo_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
struct Material ** material_array
bool allow_skip(const StringRef name) const
static GeometrySet from_grease_pencil(GreasePencil *grease_pencil, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
const Curves * get_curves() const
const Instances * get_instances() const
bool has_instances() const
MutableVArraySpan< T > span
NodeGeometryExecFunction geometry_node_execute
NodeDeclareFunction declare