28 curves.offsets_for_write().drop_back(1).copy_from(curve_offsets);
29 curves.offsets_for_write().last() = vert_indices.
size();
35 curves.cyclic_for_write().slice(cyclic_curves).fill(
true);
51 attribute_filter_with_skip,
62 if (attribute_filter_with_skip.allow_skip(iter.
name)) {
99 Array<int> neighbor_offsets_data(verts_num + 1, 0);
107 for (
const int i : edges.index_range()) {
108 const int v1 = edges[i][0];
109 const int v2 = edges[i][1];
110 neighbors[neighbor_offsets[v1].start() + used_slots[v1]] =
v2;
111 neighbors[neighbor_offsets[
v2].start() + used_slots[
v2]] = v1;
117 vert_indices.
reserve(edges.size());
121 Array<int> unused_edges = std::move(used_slots);
123 for (
const int start_vert :
IndexRange(verts_num)) {
125 if (neighbor_offsets[start_vert].
size() == 2) {
130 if (unused_edges[start_vert] == 0) {
134 for (
const int neighbor : neighbors.
as_span().slice(neighbor_offsets[start_vert])) {
135 int current_vert = start_vert;
136 int next_vert = neighbor;
138 if (unused_edges[next_vert] == 0) {
144 vert_indices.
append(current_vert);
148 int last_vert = current_vert;
149 current_vert = next_vert;
151 vert_indices.
append(current_vert);
152 unused_edges[current_vert]--;
153 unused_edges[last_vert]--;
155 if (neighbor_offsets[current_vert].
size() != 2) {
159 const int offset = neighbor_offsets[current_vert].start();
160 const int next_a = neighbors[offset];
161 const int next_b = neighbors[offset + 1];
162 next_vert = (last_vert == next_a) ? next_b : next_a;
168 const int cyclic_start = curve_offsets.
size();
172 for (
const int start_vert :
IndexRange(verts_num)) {
173 if (unused_edges[start_vert] != 2) {
177 int current_vert = start_vert;
178 int next_vert = neighbors[neighbor_offsets[current_vert].start()];
181 vert_indices.
append(current_vert);
184 while (next_vert != start_vert) {
185 const int last_vert = current_vert;
186 current_vert = next_vert;
188 vert_indices.
append(current_vert);
189 unused_edges[current_vert]--;
190 unused_edges[last_vert]--;
192 const int offset = neighbor_offsets[current_vert].start();
193 const int next_a = neighbors[offset];
194 const int next_b = neighbors[offset + 1];
195 next_vert = (last_vert == next_a) ? next_b : next_a;
201 return {std::move(vert_indices), std::move(curve_offsets), cyclic_curves};
void gather_attributes(AttributeAccessor src_attributes, AttrDomain src_domain, AttrDomain dst_domain, const AttributeFilter &attribute_filter, const IndexMask &selection, MutableAttributeAccessor dst_attributes)