[Bf-blender-cvs] [d897d52659b] temp-object-multi-mode: Muli-Edit: UV select(all) / circle / border / lasso
Campbell Barton
noreply at git.blender.org
Sun Mar 11 07:31:22 CET 2018
Commit: d897d52659bdcc9df4391e66e1b872dc9bbff626
Author: Campbell Barton
Date: Sun Mar 11 17:38:24 2018 +1100
Branches: temp-object-multi-mode
https://developer.blender.org/rBd897d52659bdcc9df4391e66e1b872dc9bbff626
Muli-Edit: UV select(all) / circle / border / lasso
===================================================================
M source/blender/editors/uvedit/uvedit_ops.c
===================================================================
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index c62a41c6d3f..9a25e7cc127 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -66,6 +66,7 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_editmesh.h"
+#include "BKE_layer.h"
#include "DEG_depsgraph.h"
@@ -89,6 +90,7 @@
#include "uvedit_intern.h"
+static bool uv_select_is_any_selected(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em);
static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, int action);
static void uv_select_flush_from_tag_face(SpaceImage *sima, Scene *scene, Object *obedit, const bool select);
static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object *obedit, const bool select);
@@ -1848,6 +1850,35 @@ static void UV_OT_weld(wmOperatorType *ot)
/* ******************** (de)select all operator **************** */
+
+static bool uv_select_is_any_selected(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em)
+{
+ ToolSettings *ts = scene->toolsettings;
+ BMFace *efa;
+ BMLoop *l;
+ BMIter iter, liter;
+ MLoopUV *luv;
+
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ return (em->bm->totvertsel || em->bm->totedgesel || em->bm->totfacesel);
+ }
+ else {
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ if (!uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ continue;
+ }
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+}
+
static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEditMesh *em, int action)
{
ToolSettings *ts = scene->toolsettings;
@@ -1858,8 +1889,11 @@ static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEd
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- if (ts->uv_flag & UV_SYNC_SELECTION) {
+ if (action == SEL_TOGGLE) {
+ action = uv_select_is_any_selected(scene, ima, obedit, em) ? SEL_DESELECT : SEL_SELECT;
+ }
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
switch (action) {
case SEL_TOGGLE:
EDBM_select_toggle_all(em);
@@ -1877,24 +1911,6 @@ static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEd
}
}
else {
- if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
- continue;
-
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
- if (luv->flag & MLOOPUV_VERTSEL) {
- action = SEL_DESELECT;
- break;
- }
- }
- }
- }
-
-
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!uvedit_face_visible_test(scene, obedit, ima, efa))
continue;
@@ -1920,16 +1936,32 @@ static void uv_select_all_perform(Scene *scene, Image *ima, Object *obedit, BMEd
static int uv_select_all_exec(bContext *C, wmOperator *op)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
Image *ima = CTX_data_edit_image(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
int action = RNA_enum_get(op->ptr, "action");
- uv_select_all_perform(scene, ima, obedit, em, action);
+ if (action == SEL_TOGGLE) {
+ action = SEL_SELECT;
+ FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, ob_iter) {
+ BMEditMesh *em = BKE_editmesh_from_object(ob_iter);
+ if (uv_select_is_any_selected(scene, ima, ob_iter, em)) {
+ action = SEL_DESELECT;
+ break;
+ }
+ } FOREACH_OBJECT_IN_EDIT_MODE_END;
+ }
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ /* don't indent to avoid diff noise! */
+ FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, ob_iter) {
+ BMEditMesh *em = BKE_editmesh_from_object(ob_iter);
+
+ uv_select_all_perform(scene, ima, ob_iter, em, action);
+
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
+
+ } FOREACH_OBJECT_IN_EDIT_MODE_END;
return OPERATOR_FINISHED;
}
@@ -2746,25 +2778,22 @@ static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object
static int uv_border_select_exec(bContext *C, wmOperator *op)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
SpaceImage *sima = CTX_wm_space_image(C);
Scene *scene = CTX_data_scene(C);
ToolSettings *ts = scene->toolsettings;
- Object *obedit = CTX_data_edit_object(C);
Image *ima = CTX_data_edit_image(C);
ARegion *ar = CTX_wm_region(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
MLoopUV *luv;
rctf rectf;
- bool changed, pinned, select, extend;
+ bool pinned, select, extend;
const bool use_face_center = (ts->uv_flag & UV_SYNC_SELECTION) ?
(ts->selectmode == SCE_SELECT_FACE) :
(ts->uv_selectmode == UV_SELECT_FACE);
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
-
/* get rectangle from operator */
WM_operator_properties_border_to_rctf(op, &rectf);
UI_view2d_region_to_view_rctf(&ar->v2d, &rectf, &rectf);
@@ -2774,8 +2803,18 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
extend = RNA_boolean_get(op->ptr, "extend");
pinned = RNA_boolean_get(op->ptr, "pinned");
+ bool changed_multi = false;
+
+ /* don't indent to avoid diff noise! */
+ FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, ob_iter) {
+ BMEditMesh *em = BKE_editmesh_from_object(ob_iter);
+
+ bool changed = false;
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
if (!extend)
- uv_select_all_perform(scene, ima, obedit, em, SEL_DESELECT);
+ uv_select_all_perform(scene, ima, ob_iter, em, SEL_DESELECT);
/* do actual selection */
if (use_face_center && !pinned) {
@@ -2788,7 +2827,7 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
/* assume not touched */
BM_elem_flag_disable(efa, BM_ELEM_TAG);
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ if (uvedit_face_visible_test(scene, ob_iter, ima, efa)) {
uv_poly_center(efa, cent, cd_loop_uv_offset);
if (BLI_rctf_isect_pt_v(&rectf, cent)) {
BM_elem_flag_enable(efa, BM_ELEM_TAG);
@@ -2799,7 +2838,7 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
/* (de)selects all tagged faces and deals with sticky modes */
if (changed) {
- uv_select_flush_from_tag_face(sima, scene, obedit, select);
+ uv_select_flush_from_tag_face(sima, scene, ob_iter, select);
}
}
else {
@@ -2808,7 +2847,7 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!uvedit_face_visible_test(scene, obedit, ima, efa))
+ if (!uvedit_face_visible_test(scene, ob_iter, ima, efa))
continue;
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
@@ -2839,14 +2878,19 @@ static int uv_border_select_exec(bContext *C, wmOperator *op)
uv_select_sync_flush(ts, em, select);
if (ts->uv_flag & UV_SYNC_SELECTION) {
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
}
-
- return OPERATOR_FINISHED;
}
+ changed_multi |= changed;
+
+ } FOREACH_OBJECT_IN_EDIT_MODE_END;
+
+ if (changed_multi) {
+ return OPERATOR_FINISHED;
+ }
return OPERATOR_CANCELLED;
-}
+}
static void UV_OT_select_border(wmOperatorType *ot)
{
@@ -2995,32 +3039,39 @@ static void UV_OT_circle_select(wmOperatorType *ot)
static bool do_lasso_select_mesh_uv(bContext *C, const int mcords[][2], short moves,
const bool select, const bool extend)
{
+ ViewLayer *view_layer = CTX_data_view_layer(C);
SpaceImage *sima = CTX_wm_space_image(C);
Image *ima = CTX_data_edit_image(C);
ARegion *ar = CTX_wm_region(C);
- Object *obedit = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
ToolSettings *ts = scene->toolsettings;
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
const bool use_face_center = (
(ts->uv_flag & UV_SYNC_SELECTION) ?
(ts->selectmode == SCE_SELECT_FACE) :
(ts->uv_selectmode == UV_SELECT_FACE));
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
BMIter iter, liter;
BMFace *efa;
BMLoop *l;
int screen_uv[2];
- bool changed = false;
+ bool changed_multi = false;
rcti rect;
BLI_lasso_boundbox(&rect, mcords, moves);
+ /* don't indent to avoid diff noise! */
+ FOREACH_OBJECT_IN_EDIT_MODE_BEGIN (view_layer, ob_iter) {
+
+ bool changed = false;
+
+ BMEditMesh *em = BKE_editmesh_from_object(ob_iter);
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
if (!extend && select) {
- uv_select_all_perform(scene, ima, obedit, em, SEL_DESELECT);
+ uv_select_all_perform(scene, ima, ob_iter, em, SEL_DESELECT);
}
if (use_face_center) { /* Face Center Sel */
@@ -3043,14 +3094,14 @@ static bool do_lasso_select_mesh_uv(bContext *C, const int mcords[][2], short mo
/* (de)selects all tagged faces and deals with sticky modes */
if (changed) {
- uv_select_flush_from_tag_face(sima, scene, obedit, select);
+ uv_select_flush_from_tag_face(sima, scene, ob_iter, select);
}
}
else { /* Vert Sel */
BM_mesh_elem_hflag_disable_all(em->bm, BM_VERT, BM_ELEM_TAG, false);
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (uvedit_face_visible_test(scene, obedit, ima, efa)) {
+ if (uvedit_face_visible_test(scene, ob_iter, ima, efa)) {
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if ((select) != (uvedit_uv_select_test(scene, l, cd_loop_uv_offset))) {
MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
@@ -3078,11 +3129,15 @@ s
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list