21 .description(
"Edges used to split faces into separate groups");
23 .field_source_reference_all()
24 .
description(
"Index of the face group inside each boundary edge region");
30 for (
const int i :
indices.index_range().drop_back(1)) {
41 :
bke::MeshFieldInput(
CPPType::get<int>(),
"Edges to Face Groups"),
42 non_boundary_edge_field_(std::move(selection))
52 evaluator.
add(non_boundary_edge_field_);
61 faces, mesh.corner_edges(), mesh.edges_num, edge_to_face_offsets, edge_to_face_indices);
70 return mesh.attributes().adapt_domain(
76 return non_boundary_edge_field_.hash();
82 return other_field->non_boundary_edge_field_ == non_boundary_edge_field_;
89 return AttrDomain::Face;
99 Field<int>(std::make_shared<FaceSetFromBoundariesInput>(std::move(non_boundary_edges))));
107 ntype.
ui_name =
"Edges to Face Groups";
108 ntype.
ui_description =
"Group faces into regions surrounded by the selected boundary edges";
#define GEO_NODE_EDGES_TO_FACE_GROUPS
#define NOD_REGISTER_NODE(REGISTER_FUNC)
unsigned long long int uint64_t
int calc_reduced_ids(MutableSpan< int > result) const
static VArray from_container(ContainerT container)
int add(GField field, GVArray *varray_ptr)
IndexMask get_evaluated_as_mask(int field_index)
void foreach_index(Fn &&fn) const
GroupedSpan< int > build_edge_to_face_map(OffsetIndices< int > faces, Span< int > corner_edges, int edges_num, Array< int > &r_offsets, Array< int > &r_indices)
void node_register_type(bNodeType &ntype)
Field< bool > invert_boolean_field(const Field< bool > &field)
static void join_indices(AtomicDisjointSet &set, const Span< int > indices)
static void node_register()
static void geo_node_exec(GeoNodeExecParams params)
static void node_declare(NodeDeclarationBuilder &b)
void geo_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
std::string ui_description
NodeGeometryExecFunction geometry_node_execute
const char * enum_name_legacy
NodeDeclareFunction declare