From b944cb281ac0d9808e17fd7fda5e329d419f5f97 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 10 Mar 2023 11:20:49 +0100 Subject: [PATCH 1/9] select more/less wip --- .../keyconfig/keymap_data/blender_default.py | 2 + scripts/startup/bl_ui/space_view3d.py | 3 + source/blender/editors/include/ED_mesh.h | 2 + source/blender/editors/mesh/editface.cc | 87 +++++++++++++++++++ .../editors/sculpt_paint/paint_intern.h | 2 + .../blender/editors/sculpt_paint/paint_ops.cc | 2 + .../editors/sculpt_paint/paint_utils.c | 46 ++++++++++ 7 files changed, 144 insertions(+) diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index 96e5bef6078..d9e0dce02a8 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -4437,6 +4437,8 @@ def km_weight_paint_vertex_selection(params): {"properties": [("select", True)]}), ("paint.vert_select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True}, {"properties": [("select", False)]}), + ("paint.vert_select_more", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True}, None), + ("paint.vert_select_less", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True}, None), ]) return keymap diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index ef3431fbe0a..340d06562af 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -2032,6 +2032,9 @@ class VIEW3D_MT_select_paint_mask_vertex(Menu): layout.operator("paint.vert_select_all", text="None").action = 'DESELECT' layout.operator("paint.vert_select_all", text="Invert").action = 'INVERT' + layout.operator("paint.vert_select_more"), + layout.operator("paint.vert_select_less"), + layout.separator() layout.operator("view3d.select_box") diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 531fc03f285..67b3155288b 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -444,6 +444,8 @@ void paintvert_select_linked_pick(struct bContext *C, struct Object *ob, const int region_coordinates[2], bool select); +void paintvert_select_more(struct bContext *C, struct Object *ob, bool face_step); +void paintvert_select_less(struct bContext *C, struct Object *ob, bool face_step); void paintvert_hide(struct bContext *C, struct Object *ob, bool unselected); void paintvert_reveal(struct bContext *C, struct Object *ob, bool select); diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 27d0c6808c8..26a9c6a7a4e 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -659,6 +659,93 @@ void paintvert_select_linked(bContext *C, Object *ob) paintvert_select_linked_vertices(C, ob, indices, true); } +void paintvert_select_more(bContext *C, Object *ob, const bool face_step) +{ + using namespace blender; + Mesh *mesh = BKE_mesh_from_object(ob); + if (mesh == nullptr || mesh->totpoly == 0) { + return; + } + + bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + bke::SpanAttributeWriter select_vert = attributes.lookup_or_add_for_write_span( + ".select_vert", ATTR_DOMAIN_POINT); + const VArray hide_edge = attributes.lookup_or_default( + ".hide_edge", ATTR_DOMAIN_EDGE, false); + + const Span polys = mesh->polys(); + const Span loops = mesh->loops(); + const Span edges = mesh->edges(); + + /* Need a copy of the selected verts that we can read from and is not modified. */ + BitVector<> select_vert_original(mesh->totvert, false); + for (int i = 0; i < mesh->totvert; i++) { + select_vert_original[i].set(select_vert.span[i]); + } + + for (const int i : edges.index_range()) { + const MEdge &edge = edges[i]; + bool has_vertex_selected = false; + if ((!select_vert_original[edge.v1] && !select_vert_original[edge.v2]) || hide_edge[i]) { + continue; + } + has_vertex_selected = true; + select_vert.span[edge.v1] = true; + select_vert.span[edge.v2] = true; + if (face_step && has_vertex_selected) { + } + } + + select_vert.finish(); + paintvert_flush_flags(ob); + paintvert_tag_select_update(C, ob); +} + +void paintvert_select_less(bContext *C, Object *ob, const bool face_step) +{ + using namespace blender; + Mesh *mesh = BKE_mesh_from_object(ob); + if (mesh == nullptr || mesh->totpoly == 0) { + return; + } + + bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + bke::SpanAttributeWriter select_vert = attributes.lookup_or_add_for_write_span( + ".select_vert", ATTR_DOMAIN_POINT); + + const Span polys = mesh->polys(); + const Span loops = mesh->loops(); + const Span edges = mesh->edges(); + + /* Need a copy of the selected verts that we can read from and is not modified. */ + BitVector<> select_vert_original(mesh->totvert, false); + for (int i = 0; i < mesh->totvert; i++) { + select_vert_original[i].set(select_vert.span[i]); + } + + for (const MPoly &poly : polys) { + bool has_vertex_selected = false; + for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { + if (select_vert_original[loop.v]) { + continue; + } + has_vertex_selected = true; + 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)) { + select_vert.span[loop.v] = false; + } + } + } + + select_vert.finish(); + paintvert_flush_flags(ob); + paintvert_tag_select_update(C, ob); +} + void paintvert_tag_select_update(bContext *C, Object *ob) { DEG_id_tag_update(static_cast(ob->data), ID_RECALC_COPY_ON_WRITE | ID_RECALC_SELECT); diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index cdf1256a097..289c2018721 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -387,6 +387,8 @@ void PAINT_OT_vert_select_ungrouped(struct wmOperatorType *ot); void PAINT_OT_vert_select_hide(struct wmOperatorType *ot); void PAINT_OT_vert_select_linked(struct wmOperatorType *ot); void PAINT_OT_vert_select_linked_pick(struct wmOperatorType *ot); +void PAINT_OT_vert_select_more(struct wmOperatorType *ot); +void PAINT_OT_vert_select_less(struct wmOperatorType *ot); bool vert_paint_poll(struct bContext *C); bool mask_paint_poll(struct bContext *C); diff --git a/source/blender/editors/sculpt_paint/paint_ops.cc b/source/blender/editors/sculpt_paint/paint_ops.cc index ca102b5a0b8..8b49c96542e 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_ops.cc @@ -1501,6 +1501,8 @@ void ED_operatortypes_paint(void) WM_operatortype_append(PAINT_OT_vert_select_hide); WM_operatortype_append(PAINT_OT_vert_select_linked); WM_operatortype_append(PAINT_OT_vert_select_linked_pick); + WM_operatortype_append(PAINT_OT_vert_select_more); + WM_operatortype_append(PAINT_OT_vert_select_less); /* vertex */ WM_operatortype_append(PAINT_OT_vertex_paint_toggle); diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 4953ab84687..8c9b50c1671 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -796,6 +796,52 @@ void PAINT_OT_vert_select_linked_pick(wmOperatorType *ot) "Whether to select or deselect linked vertices under the cursor"); } +static int paintvert_select_more_exec(bContext *C, wmOperator *op) +{ + const bool face_step = RNA_boolean_get(op->ptr, "face_step"); + paintvert_select_more(C, CTX_data_active_object(C), face_step); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; +} + +void PAINT_OT_vert_select_more(wmOperatorType *ot) +{ + ot->name = "Select More"; + ot->description = "Select Vertices connected to existing selection"; + ot->idname = "PAINT_OT_vert_select_more"; + + ot->exec = paintvert_select_more_exec; + ot->poll = vert_paint_poll; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + RNA_def_boolean( + ot->srna, "face_step", true, "Face Step", "Also select faces that only touch on a corner"); +} + +static int paintvert_select_less_exec(bContext *C, wmOperator *op) +{ + const bool face_step = RNA_boolean_get(op->ptr, "face_step"); + paintvert_select_less(C, CTX_data_active_object(C), face_step); + ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; +} + +void PAINT_OT_vert_select_less(wmOperatorType *ot) +{ + ot->name = "Select Less"; + ot->description = "Deselect Vertices connected to existing selection"; + ot->idname = "PAINT_OT_vert_select_less"; + + ot->exec = paintvert_select_less_exec; + ot->poll = vert_paint_poll; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + RNA_def_boolean( + ot->srna, "face_step", true, "Face Step", "Also deselect faces that only touch on a corner"); +} + static int face_select_hide_exec(bContext *C, wmOperator *op) { const bool unselected = RNA_boolean_get(op->ptr, "unselected"); -- 2.30.2 From b946ed4a8bd7f65ff2995dcb71b7c13229b56e17 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 10 Mar 2023 12:26:37 +0100 Subject: [PATCH 2/9] use edge poly map --- source/blender/editors/mesh/editface.cc | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 26a9c6a7a4e..99219488a1d 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -24,6 +24,7 @@ #include "BKE_customdata.h" #include "BKE_global.h" #include "BKE_mesh.h" +#include "BKE_mesh_mapping.h" #include "BKE_object.h" #include "ED_mesh.h" @@ -659,6 +660,15 @@ void paintvert_select_linked(bContext *C, Object *ob) paintvert_select_linked_vertices(C, ob, indices, true); } +static void select_poly_verts(const MPoly &poly, + const blender::Span &loops, + blender::bke::SpanAttributeWriter &select_vert) +{ + for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { + select_vert.span[loop.v] = true; + } +} + void paintvert_select_more(bContext *C, Object *ob, const bool face_step) { using namespace blender; @@ -672,17 +682,33 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) ".select_vert", ATTR_DOMAIN_POINT); const VArray hide_edge = attributes.lookup_or_default( ".hide_edge", ATTR_DOMAIN_EDGE, false); + const VArray hide_poly = attributes.lookup_or_default( + ".hide_poly", ATTR_DOMAIN_FACE, false); const Span polys = mesh->polys(); const Span loops = mesh->loops(); const Span 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. */ BitVector<> select_vert_original(mesh->totvert, false); for (int i = 0; i < mesh->totvert; i++) { select_vert_original[i].set(select_vert.span[i]); } + /* If we iterated over polys we wouldn't extend the selection through edges that have no face + * attached to them. */ for (const int i : edges.index_range()) { const MEdge &edge = edges[i]; bool has_vertex_selected = false; @@ -693,6 +719,14 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) select_vert.span[edge.v1] = true; select_vert.span[edge.v2] = true; if (face_step && has_vertex_selected) { + const Span 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; + } + const MPoly &poly = polys[poly_i]; + select_poly_verts(poly, loops, select_vert); + } } } -- 2.30.2 From b5ed0961321a2e12220d8ff9baf20ef416e8a1b9 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 10 Mar 2023 12:30:27 +0100 Subject: [PATCH 3/9] remove extracted function --- source/blender/editors/mesh/editface.cc | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 99219488a1d..f0d6652a168 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -660,15 +660,6 @@ void paintvert_select_linked(bContext *C, Object *ob) paintvert_select_linked_vertices(C, ob, indices, true); } -static void select_poly_verts(const MPoly &poly, - const blender::Span &loops, - blender::bke::SpanAttributeWriter &select_vert) -{ - for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { - select_vert.span[loop.v] = true; - } -} - void paintvert_select_more(bContext *C, Object *ob, const bool face_step) { using namespace blender; @@ -725,7 +716,9 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) continue; } const MPoly &poly = polys[poly_i]; - select_poly_verts(poly, loops, select_vert); + for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { + select_vert.span[loop.v] = true; + } } } } -- 2.30.2 From 96a0a0e9217ea18f6638e026bc7e0d90b53fda6a Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 10 Mar 2023 12:43:41 +0100 Subject: [PATCH 4/9] modify select less function --- source/blender/editors/mesh/editface.cc | 64 ++++++++++++++++--------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index f0d6652a168..139735a0a56 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -702,23 +702,22 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) * attached to them. */ for (const int i : edges.index_range()) { const MEdge &edge = edges[i]; - bool has_vertex_selected = false; if ((!select_vert_original[edge.v1] && !select_vert_original[edge.v2]) || hide_edge[i]) { continue; } - has_vertex_selected = true; select_vert.span[edge.v1] = true; select_vert.span[edge.v2] = true; - if (face_step && has_vertex_selected) { - const Span 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; - } - const MPoly &poly = polys[poly_i]; - for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { - select_vert.span[loop.v] = true; - } + if (!face_step) { + continue; + } + const Span 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; + } + 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::SpanAttributeWriter select_vert = attributes.lookup_or_add_for_write_span( ".select_vert", ATTR_DOMAIN_POINT); + const VArray hide_edge = attributes.lookup_or_default( + ".hide_edge", ATTR_DOMAIN_EDGE, false); + const VArray hide_poly = attributes.lookup_or_default( + ".hide_poly", ATTR_DOMAIN_FACE, false); const Span polys = mesh->polys(); const Span loops = mesh->loops(); const Span 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. */ BitVector<> select_vert_original(mesh->totvert, false); for (int i = 0; i < mesh->totvert; i++) { select_vert_original[i].set(select_vert.span[i]); } - for (const MPoly &poly : polys) { - bool has_vertex_selected = false; - for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { - if (select_vert_original[loop.v]) { + for (const int i : edges.index_range()) { + const MEdge &edge = edges[i]; + if ((select_vert_original[edge.v1] && select_vert_original[edge.v2]) && !hide_edge[i]) { + continue; + } + select_vert.span[edge.v1] = false; + select_vert.span[edge.v2] = false; + + if (!face_step) { + continue; + } + const Span 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; } - has_vertex_selected = true; - const MEdge &edge = edges[loop.e]; - select_vert.span[edge.v1] = false; - select_vert.span[edge.v2] = false; - } - if (face_step && has_vertex_selected) { + const MPoly &poly = polys[poly_i]; for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { select_vert.span[loop.v] = false; } -- 2.30.2 From d0b5a6a75462978ed14ea63638faab673f61a203 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Thu, 16 Mar 2023 11:17:57 +0100 Subject: [PATCH 5/9] use build_edge_to_poly_map --- source/blender/editors/mesh/editface.cc | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 92b42d3c222..40a48393da5 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -680,16 +680,9 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) const Span loops = mesh->loops(); const Span edges = mesh->edges(); - MeshElemMap *edge_poly_map; - int *edge_poly_mem; + Array> edge_to_face_map; 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()); + edge_to_face_map = bke::mesh_topology::build_edge_to_poly_map(polys, loops, mesh->totedge); } /* Need a copy of the selected verts that we can read from and is not modified. */ @@ -710,7 +703,7 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) if (!face_step) { continue; } - const Span neighbor_polys(edge_poly_map[i].indices, edge_poly_map[i].count); + const Span neighbor_polys = edge_to_face_map[i]; for (const int poly_i : neighbor_polys) { if (hide_poly[poly_i]) { continue; -- 2.30.2 From 3d296f327e158228e083a2538fdfa00e0e0029ec Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Thu, 23 Mar 2023 10:21:08 +0100 Subject: [PATCH 6/9] change sgnature to take Mesh pointer --- source/blender/editors/include/ED_mesh.h | 2 +- source/blender/editors/mesh/editface.cc | 8 +------- source/blender/editors/sculpt_paint/paint_utils.c | 12 +++++++++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 67b3155288b..afab15588b6 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -444,7 +444,7 @@ void paintvert_select_linked_pick(struct bContext *C, struct Object *ob, const int region_coordinates[2], bool select); -void paintvert_select_more(struct bContext *C, struct Object *ob, bool face_step); +void paintvert_select_more(struct Mesh *mesh, bool face_step); void paintvert_select_less(struct bContext *C, struct Object *ob, bool face_step); void paintvert_hide(struct bContext *C, struct Object *ob, bool unselected); void paintvert_reveal(struct bContext *C, struct Object *ob, bool select); diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 40a48393da5..ddcf7aaaa7f 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -660,13 +660,9 @@ void paintvert_select_linked(bContext *C, Object *ob) paintvert_select_linked_vertices(C, ob, indices, true); } -void paintvert_select_more(bContext *C, Object *ob, const bool face_step) +void paintvert_select_more(Mesh *mesh, const bool face_step) { using namespace blender; - Mesh *mesh = BKE_mesh_from_object(ob); - if (mesh == nullptr || mesh->totpoly == 0) { - return; - } bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); bke::SpanAttributeWriter select_vert = attributes.lookup_or_add_for_write_span( @@ -716,8 +712,6 @@ void paintvert_select_more(bContext *C, Object *ob, const bool face_step) } select_vert.finish(); - paintvert_flush_flags(ob); - paintvert_tag_select_update(C, ob); } void paintvert_select_less(bContext *C, Object *ob, const bool face_step) diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 8c9b50c1671..9eb2a9cadc2 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -798,9 +798,19 @@ void PAINT_OT_vert_select_linked_pick(wmOperatorType *ot) static int paintvert_select_more_exec(bContext *C, wmOperator *op) { + Object *ob = CTX_data_active_object(C); + Mesh *mesh = BKE_mesh_from_object(ob); + if (mesh == NULL || mesh->totpoly == 0) { + return OPERATOR_CANCELLED; + } + const bool face_step = RNA_boolean_get(op->ptr, "face_step"); - paintvert_select_more(C, CTX_data_active_object(C), face_step); + paintvert_select_more(mesh, face_step); + + paintvert_flush_flags(ob); + paintvert_tag_select_update(C, ob); ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } -- 2.30.2 From 9527c6a325d8b620ce803e6e13bf2d506bf12ae6 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Thu, 23 Mar 2023 11:16:00 +0100 Subject: [PATCH 7/9] fix memory leak --- source/blender/editors/include/ED_mesh.h | 2 +- source/blender/editors/mesh/editface.cc | 15 ++++++--------- source/blender/editors/sculpt_paint/paint_utils.c | 12 +++++++++++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index afab15588b6..ebbc9986d2d 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -445,7 +445,7 @@ void paintvert_select_linked_pick(struct bContext *C, const int region_coordinates[2], bool select); void paintvert_select_more(struct Mesh *mesh, bool face_step); -void paintvert_select_less(struct bContext *C, struct Object *ob, bool face_step); +void paintvert_select_less(struct Mesh *mesh, bool face_step); void paintvert_hide(struct bContext *C, struct Object *ob, bool unselected); void paintvert_reveal(struct bContext *C, struct Object *ob, bool select); diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index ddcf7aaaa7f..45b92d6b275 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -714,13 +714,9 @@ void paintvert_select_more(Mesh *mesh, const bool face_step) select_vert.finish(); } -void paintvert_select_less(bContext *C, Object *ob, const bool face_step) +void paintvert_select_less(Mesh *mesh, const bool face_step) { using namespace blender; - Mesh *mesh = BKE_mesh_from_object(ob); - if (mesh == nullptr || mesh->totpoly == 0) { - return; - } bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); bke::SpanAttributeWriter select_vert = attributes.lookup_or_add_for_write_span( @@ -735,7 +731,7 @@ void paintvert_select_less(bContext *C, Object *ob, const bool face_step) const Span edges = mesh->edges(); MeshElemMap *edge_poly_map; - int *edge_poly_mem; + int *edge_poly_mem = nullptr; if (face_step) { BKE_mesh_edge_poly_map_create(&edge_poly_map, &edge_poly_mem, @@ -774,10 +770,11 @@ void paintvert_select_less(bContext *C, Object *ob, const bool face_step) } } } - + if (edge_poly_mem) { + MEM_freeN(edge_poly_map); + MEM_freeN(edge_poly_mem); + } select_vert.finish(); - paintvert_flush_flags(ob); - paintvert_tag_select_update(C, ob); } void paintvert_tag_select_update(bContext *C, Object *ob) diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index 9eb2a9cadc2..7067d039809 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -831,9 +831,19 @@ void PAINT_OT_vert_select_more(wmOperatorType *ot) static int paintvert_select_less_exec(bContext *C, wmOperator *op) { + Object *ob = CTX_data_active_object(C); + Mesh *mesh = BKE_mesh_from_object(ob); + if (mesh == NULL || mesh->totpoly == 0) { + return OPERATOR_CANCELLED; + } + const bool face_step = RNA_boolean_get(op->ptr, "face_step"); - paintvert_select_less(C, CTX_data_active_object(C), face_step); + paintvert_select_less(mesh, face_step); + + paintvert_flush_flags(ob); + paintvert_tag_select_update(C, ob); ED_region_tag_redraw(CTX_wm_region(C)); + return OPERATOR_FINISHED; } -- 2.30.2 From 85936b5f455c8575e42d1b40d484b0b5c68dddda Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 24 Mar 2023 14:41:45 +0100 Subject: [PATCH 8/9] implement changes that removed MLoop --- source/blender/editors/mesh/editface.cc | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index 428c3aa45d3..b4a57c4fc9c 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -673,12 +673,14 @@ void paintvert_select_more(Mesh *mesh, const bool face_step) ".hide_poly", ATTR_DOMAIN_FACE, false); const Span polys = mesh->polys(); - const Span loops = mesh->loops(); + const Span corner_edges = mesh->corner_edges(); + const Span corner_vertices = mesh->corner_verts(); const Span edges = mesh->edges(); Array> edge_to_face_map; if (face_step) { - edge_to_face_map = bke::mesh_topology::build_edge_to_poly_map(polys, loops, mesh->totedge); + edge_to_face_map = bke::mesh_topology::build_edge_to_poly_map( + polys, corner_edges, mesh->totedge); } /* Need a copy of the selected verts that we can read from and is not modified. */ @@ -705,8 +707,8 @@ void paintvert_select_more(Mesh *mesh, const bool face_step) continue; } const MPoly &poly = polys[poly_i]; - for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { - select_vert.span[loop.v] = true; + for (const int vertex_index : corner_vertices.slice(poly.loopstart, poly.totloop)) { + select_vert.span[vertex_index] = true; } } } @@ -727,7 +729,8 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) ".hide_poly", ATTR_DOMAIN_FACE, false); const Span polys = mesh->polys(); - const Span loops = mesh->loops(); + const Span corner_edges = mesh->corner_edges(); + const Span corner_vertices = mesh->corner_verts(); const Span edges = mesh->edges(); MeshElemMap *edge_poly_map; @@ -738,12 +741,12 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) edges.size(), polys.data(), polys.size(), - loops.data(), - loops.size()); + corner_edges.data(), + corner_edges.size()); } /* 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); for (int i = 0; i < mesh->totvert; i++) { select_vert_original[i].set(select_vert.span[i]); } @@ -765,8 +768,8 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) continue; } const MPoly &poly = polys[poly_i]; - for (const MLoop &loop : loops.slice(poly.loopstart, poly.totloop)) { - select_vert.span[loop.v] = false; + for (const int vertex_index : corner_vertices.slice(poly.loopstart, poly.totloop)) { + select_vert.span[vertex_index] = false; } } } -- 2.30.2 From fc06c5f3b3c5834ed05ba09bfbf846dbddcc6b87 Mon Sep 17 00:00:00 2001 From: Christoph Lendenfeld Date: Fri, 24 Mar 2023 15:02:37 +0100 Subject: [PATCH 9/9] vertex_index -> vert --- source/blender/editors/mesh/editface.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/mesh/editface.cc b/source/blender/editors/mesh/editface.cc index b4a57c4fc9c..e06d71a0c31 100644 --- a/source/blender/editors/mesh/editface.cc +++ b/source/blender/editors/mesh/editface.cc @@ -674,7 +674,7 @@ void paintvert_select_more(Mesh *mesh, const bool face_step) const Span polys = mesh->polys(); const Span corner_edges = mesh->corner_edges(); - const Span corner_vertices = mesh->corner_verts(); + const Span corner_verts = mesh->corner_verts(); const Span edges = mesh->edges(); Array> edge_to_face_map; @@ -707,8 +707,8 @@ void paintvert_select_more(Mesh *mesh, const bool face_step) continue; } const MPoly &poly = polys[poly_i]; - for (const int vertex_index : corner_vertices.slice(poly.loopstart, poly.totloop)) { - select_vert.span[vertex_index] = true; + for (const int vert : corner_verts.slice(poly.loopstart, poly.totloop)) { + select_vert.span[vert] = true; } } } @@ -730,7 +730,7 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) const Span polys = mesh->polys(); const Span corner_edges = mesh->corner_edges(); - const Span corner_vertices = mesh->corner_verts(); + const Span corner_verts = mesh->corner_verts(); const Span edges = mesh->edges(); MeshElemMap *edge_poly_map; @@ -768,8 +768,8 @@ void paintvert_select_less(Mesh *mesh, const bool face_step) continue; } const MPoly &poly = polys[poly_i]; - for (const int vertex_index : corner_vertices.slice(poly.loopstart, poly.totloop)) { - select_vert.span[vertex_index] = false; + for (const int vert : corner_verts.slice(poly.loopstart, poly.totloop)) { + select_vert.span[vert] = false; } } } -- 2.30.2