30 auto &group_id =
b.add_input<
decl::Int>(
"Group ID").hide_value().field_on_all();
33 const bNode *node =
b.node_or_null();
43 auto *data = MEM_cnew<NodeGeometryMergeLayers>(__func__);
56 using namespace bke::greasepencil;
58 const int old_layers_num = src_grease_pencil.layers().size();
64 field_evaluator.
add(selection_field);
65 field_evaluator.evaluate();
66 const VArray<bool> selection = field_evaluator.get_evaluated<
bool>(0);
71 for (
const int layer_i :
IndexRange(old_layers_num)) {
72 const bool is_selected = selection[layer_i];
74 layers_map.append({layer_i});
78 const Layer &layer = src_grease_pencil.layer(layer_i);
80 layer.name(), [&]() {
return layers_map.append_and_get_index_as(); });
81 layers_map[new_layer_index].append(layer_i);
89 using namespace bke::greasepencil;
91 const int old_layers_num = src_grease_pencil.layers().size();
98 field_evaluator.
add(selection_field);
99 field_evaluator.add(group_id_field);
100 field_evaluator.evaluate();
101 const VArray<bool> selection = field_evaluator.get_evaluated<
bool>(0);
102 const VArray<int> group_ids = field_evaluator.get_evaluated<
int>(1);
107 for (
const int layer_i :
IndexRange(old_layers_num)) {
108 const bool is_selected = selection[layer_i];
110 layers_map.append({layer_i});
113 const int group_id = group_ids[layer_i];
115 group_id, [&]() {
return layers_map.append_and_get_index_as(); });
116 layers_map[new_layer_index].append(layer_i);
126 using namespace bke::greasepencil;
128 const GreasePencil *src_grease_pencil = geometry.get_grease_pencil();
129 if (!src_grease_pencil) {
132 const int old_layers_num = src_grease_pencil->layers().size();
146 const int new_layers_num = layers_map.
size();
147 if (old_layers_num == new_layers_num) {
152 *src_grease_pencil, layers_map, attribute_filter);
153 geometry.replace_grease_pencil(new_grease_pencil);
167 params.set_output(
"Grease Pencil", std::move(main_geometry));
177 "Combine all layers which have the same name"},
182 "Provide a custom group ID for each layer and all layers with the same ID will be merged "
184 {0,
nullptr, 0,
nullptr,
nullptr},
190 "Determines how to choose which layers are merged",
Low-level operations for grease pencil.
#define NODE_STORAGE_FUNCS(StorageT)
#define NODE_CLASS_GEOMETRY
#define NOD_REGISTER_NODE(REGISTER_FUNC)
#define NOD_storage_enum_accessors(member)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
int add(GField field, GVArray *varray_ptr)
local_group_size(16, 16) .push_constant(Type b
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void node_type_storage(bNodeType *ntype, const char *storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
void node_register_type(bNodeType *ntype)
GreasePencil * merge_layers(const GreasePencil &src_grease_pencil, Span< Vector< int > > layers_to_merge, const bke::AttributeFilter &attribute_filter)
static Vector< Vector< int > > get_layers_map_by_name(const GreasePencil &src_grease_pencil, const GeoNodeExecParams ¶ms)
static void merge_layers(GeometrySet &geometry, const NodeGeometryMergeLayers &storage, const GeoNodeExecParams ¶ms, const AttributeFilter &attribute_filter)
static void node_init(bNodeTree *, bNode *node)
static void node_register()
static void node_rna(StructRNA *srna)
static void node_geo_exec(GeoNodeExecParams params)
static void node_declare(NodeDeclarationBuilder &b)
static Vector< Vector< int > > get_layers_map_by_id(const GreasePencil &src_grease_pencil, const GeoNodeExecParams ¶ms)
static void node_layout(uiLayout *layout, bContext *, PointerRNA *ptr)
PropertyRNA * RNA_def_node_enum(StructRNA *srna, const char *identifier, const char *ui_name, const char *ui_description, const EnumPropertyItem *static_items, const EnumRNAAccessors accessors, std::optional< int > default_value, const EnumPropertyItemFunc item_func, const bool allow_animation)
void geo_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
void node_free_standard_storage(bNode *node)
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
void modify_geometry_sets(ForeachSubGeometryCallback callback)
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGeometryExecFunction geometry_node_execute
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
NodeDeclareFunction declare