Animation: Weight Paint select more/less for vertices #105633
|
@ -702,23 +702,22 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step)
|
||||||
* attached to them. */
|
* attached to them. */
|
||||||
for (const int i : edges.index_range()) {
|
for (const int i : edges.index_range()) {
|
||||||
const MEdge &edge = edges[i];
|
const MEdge &edge = edges[i];
|
||||||
bool has_vertex_selected = false;
|
|
||||||
if ((!select_vert_original[edge.v1] && !select_vert_original[edge.v2]) || hide_edge[i]) {
|
if ((!select_vert_original[edge.v1] && !select_vert_original[edge.v2]) || hide_edge[i]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
has_vertex_selected = true;
|
|
||||||
select_vert.span[edge.v1] = true;
|
select_vert.span[edge.v1] = true;
|
||||||
select_vert.span[edge.v2] = true;
|
select_vert.span[edge.v2] = true;
|
||||||
if (face_step && has_vertex_selected) {
|
if (!face_step) {
|
||||||
const Span<int> neighbor_polys(edge_poly_map[i].indices, edge_poly_map[i].count);
|
continue;
|
||||||
for (const int poly_i : neighbor_polys) {
|
}
|
||||||
if (hide_poly[poly_i]) {
|
const Span<int> neighbor_polys(edge_poly_map[i].indices, edge_poly_map[i].count);
|
||||||
continue;
|
for (const int poly_i : neighbor_polys) {
|
||||||
}
|
if (hide_poly[poly_i]) {
|
||||||
const MPoly &poly = polys[poly_i];
|
continue;
|
||||||
for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) {
|
}
|
||||||
select_vert.span[loop.v] = true;
|
const MPoly &poly = polys[poly_i];
|
||||||
}
|
for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) {
|
||||||
|
select_vert.span[loop.v] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -739,29 +738,50 @@ void paintvert_select_less(bContext *C, Object *ob, const bool face_step)
|
||||||
bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
|
bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
|
||||||
bke::SpanAttributeWriter<bool> select_vert = attributes.lookup_or_add_for_write_span<bool>(
|
bke::SpanAttributeWriter<bool> select_vert = attributes.lookup_or_add_for_write_span<bool>(
|
||||||
".select_vert", ATTR_DOMAIN_POINT);
|
".select_vert", ATTR_DOMAIN_POINT);
|
||||||
|
const VArray<bool> hide_edge = attributes.lookup_or_default<bool>(
|
||||||
|
".hide_edge", ATTR_DOMAIN_EDGE, false);
|
||||||
|
const VArray<bool> hide_poly = attributes.lookup_or_default<bool>(
|
||||||
|
".hide_poly", ATTR_DOMAIN_FACE, false);
|
||||||
|
|
||||||
const Span<MPoly> polys = mesh->polys();
|
const Span<MPoly> polys = mesh->polys();
|
||||||
const Span<MLoop> loops = mesh->loops();
|
const Span<MLoop> loops = mesh->loops();
|
||||||
const Span<MEdge> edges = mesh->edges();
|
const Span<MEdge> edges = mesh->edges();
|
||||||
|
|
||||||
|
MeshElemMap *edge_poly_map;
|
||||||
|
int *edge_poly_mem;
|
||||||
|
if (face_step) {
|
||||||
|
BKE_mesh_edge_poly_map_create(&edge_poly_map,
|
||||||
|
&edge_poly_mem,
|
||||||
|
edges.size(),
|
||||||
|
polys.data(),
|
||||||
|
polys.size(),
|
||||||
|
loops.data(),
|
||||||
|
loops.size());
|
||||||
|
}
|
||||||
|
|
||||||
/* Need a copy of the selected verts that we can read from and is not modified. */
|
/* Need a copy of the selected verts that we can read from and is not modified. */
|
||||||
BitVector<> select_vert_original(mesh->totvert, false);
|
BitVector<> select_vert_original(mesh->totvert, false);
|
||||||
for (int i = 0; i < mesh->totvert; i++) {
|
for (int i = 0; i < mesh->totvert; i++) {
|
||||||
select_vert_original[i].set(select_vert.span[i]);
|
select_vert_original[i].set(select_vert.span[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const MPoly &poly : polys) {
|
for (const int i : edges.index_range()) {
|
||||||
bool has_vertex_selected = false;
|
const MEdge &edge = edges[i];
|
||||||
for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) {
|
if ((select_vert_original[edge.v1] && select_vert_original[edge.v2]) && !hide_edge[i]) {
|
||||||
if (select_vert_original[loop.v]) {
|
continue;
|
||||||
|
}
|
||||||
|
select_vert.span[edge.v1] = false;
|
||||||
|
select_vert.span[edge.v2] = false;
|
||||||
|
|
||||||
|
if (!face_step) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const Span<int> neighbor_polys(edge_poly_map[i].indices, edge_poly_map[i].count);
|
||||||
|
for (const int poly_i : neighbor_polys) {
|
||||||
|
if (hide_poly[poly_i]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
has_vertex_selected = true;
|
const MPoly &poly = polys[poly_i];
|
||||||
const MEdge &edge = edges[loop.e];
|
|
||||||
select_vert.span[edge.v1] = false;
|
|
||||||
select_vert.span[edge.v2] = false;
|
|
||||||
}
|
|
||||||
if (face_step && has_vertex_selected) {
|
|
||||||
for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) {
|
for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) {
|
||||||
select_vert.span[loop.v] = false;
|
select_vert.span[loop.v] = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue