20 .description(
"Edges used to split faces into separate groups");
23 .
description(
"Index of the face group inside each boundary edge region");
29 for (
const int i : indices.index_range().drop_back(1)) {
30 set.join(indices[i], indices[i + 1]);
40 : bke::MeshFieldInput(
CPPType::get<
int>(),
"Edges to Face Groups"),
41 non_boundary_edge_field_(std::move(selection))
46 const AttrDomain domain,
51 evaluator.
add(non_boundary_edge_field_);
53 const IndexMask non_boundary_edges = evaluator.get_evaluated_as_mask(0);
60 faces, mesh.corner_edges(), mesh.edges_num, edge_to_face_offsets, edge_to_face_indices);
67 islands.calc_reduced_ids(output);
69 return mesh.attributes().adapt_domain(
75 return non_boundary_edge_field_.
hash();
81 return other_field->non_boundary_edge_field_ == non_boundary_edge_field_;
88 return AttrDomain::Face;
98 Field<int>(std::make_shared<FaceSetFromBoundariesInput>(std::move(non_boundary_edges))));
106 &ntype, GEO_NODE_EDGES_TO_FACE_GROUPS,
"Edges to Face Groups",
NODE_CLASS_INPUT);
#define NOD_REGISTER_NODE(REGISTER_FUNC)
int add(GField field, GVArray *varray_ptr)
void foreach_index(Fn &&fn) const
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
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, int type, const char *name, short nclass)
unsigned __int64 uint64_t
NodeGeometryExecFunction geometry_node_execute
NodeDeclareFunction declare