23 .description(
"Select the layers to convert");
26 .
description(
"Create a separate curve instance for every layer");
35 params.set_default_remaining_outputs();
40 const int layers_num = layers.
size();
45 evaluator.set_selection(selection_field);
47 const IndexMask layer_selection = evaluator.get_evaluated_selection_as_mask();
49 const int instances_num = layer_selection.
size();
50 if (instances_num == 0) {
51 params.set_default_remaining_outputs();
56 std::optional<int> empty_geometry_handle;
63 if (!empty_geometry_handle.has_value()) {
72 curves_id->
totcol = grease_pencil->material_array_num;
74 curves_geometry.
name = layer.name();
75 const int handle = instances->
add_reference(std::move(curves_geometry));
94 instances_attributes.
add(
99 *src_attribute.sharing_info});
102 if (!instances_attributes.
add(
118 AttrDomain::Instance);
119 layer_selection.
foreach_index([&](
const int layer_i,
const int instance_i) {
120 opacity_attribute.
span[instance_i] = grease_pencil->layer(layer_i).opacity;
122 opacity_attribute.
finish();
126 curves_geometry.
name = std::move(grease_pencil_geometry.
name);
128 const bool layers_as_instances =
params.get_input<
bool>(
"Layers as Instances");
129 if (!layers_as_instances) {
132 options.attribute_filter = attribute_filter;
136 params.set_output(
"Curves", std::move(curves_geometry));
Low-level operations for curves.
Low-level operations for grease pencil.
#define GEO_NODE_GREASE_PENCIL_TO_CURVES
#define NODE_CLASS_GEOMETRY
#define NOD_REGISTER_NODE(REGISTER_FUNC)
constexpr int64_t size() const
void foreach_attribute(const FunctionRef< void(const AttributeIter &)> fn) const
eCustomDataType data_type
GAttributeReader get() const
int add_reference(const InstanceReference &reference)
void add_instance(int instance_handle, const float4x4 &transform)
bke::MutableAttributeAccessor attributes_for_write()
bool add(const StringRef attribute_id, const AttrDomain domain, const eCustomDataType data_type, const AttributeInit &initializer)
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type)
GSpanAttributeWriter lookup_for_write_span(StringRef attribute_id)
const bke::CurvesGeometry & strokes() const
float4x4 local_transform() const
void foreach_index(Fn &&fn) const
local_group_size(16, 16) .push_constant(Type b
CCL_NAMESPACE_BEGIN struct Options options
void *(* MEM_dupallocN)(const void *vmemh)
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)
Curves * curves_new_nomain(int points_num, int curves_num)
bke::GeometrySet realize_instances(bke::GeometrySet geometry_set, const RealizeInstancesOptions &options)
static void node_declare(NodeDeclarationBuilder &b)
static void node_geo_exec(GeoNodeExecParams params)
static void node_register()
void transform(Context &context, Result &input, Result &output, const float3x3 &transformation, RealizationOptions realization_options)
MatBase< float, 4, 4 > float4x4
void geo_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
const ImplicitSharingInfo * sharing_info
const GreasePencil * get_grease_pencil() const
MutableVArraySpan< T > span
NodeGeometryExecFunction geometry_node_execute
NodeDeclareFunction declare
static GeometrySet from_instances(Instances *instances, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
static GeometrySet from_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)