[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56197] trunk/blender/source/blender/ editors: revision r56196 adding uv select more/less used 4 nested 'for' loops,
Campbell Barton
ideasman42 at gmail.com
Mon Apr 22 08:02:37 CEST 2013
Revision: 56197
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56197
Author: campbellbarton
Date: 2013-04-22 06:02:30 +0000 (Mon, 22 Apr 2013)
Log Message:
-----------
revision r56196 adding uv select more/less used 4 nested 'for' loops,
rewrite to use only 2.
also use generic, reusable functions for selection flushing so each operator doesn't need to implement its own.
and merge more-less operation into the same function, just call the selection flush function with select/deselect arg.
Revision Links:
--------------
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56196
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/ED_uvedit.h
trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
Modified: trunk/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_uvedit.h 2013-04-22 03:08:56 UTC (rev 56196)
+++ trunk/blender/source/blender/editors/include/ED_uvedit.h 2013-04-22 06:02:30 UTC (rev 56197)
@@ -64,11 +64,11 @@
int uvedit_edge_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
int uvedit_uv_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-int uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const short do_history);
+int uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool do_history);
int uvedit_face_select_disable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
+void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
void uvedit_edge_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
+void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
void uvedit_uv_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima,
Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2013-04-22 03:08:56 UTC (rev 56196)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2013-04-22 06:02:30 UTC (rev 56197)
@@ -84,6 +84,8 @@
#include "uvedit_intern.h"
static void uv_select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+static void uv_select_flush_from_tag_face(SpaceImage *sima, Scene *scene, Object *obedit, bool select);
+static void uv_select_flush_from_tag_loop(SpaceImage *sima, Scene *scene, Object *obedit, bool select);
/************************* state testing ************************/
@@ -366,7 +368,7 @@
}
}
-int uvedit_face_select_enable(Scene *scene, BMEditMesh *em, BMFace *efa, const short do_history)
+int uvedit_face_select_enable(Scene *scene, BMEditMesh *em, BMFace *efa, const bool do_history)
{
ToolSettings *ts = scene->toolsettings;
@@ -445,7 +447,7 @@
}
}
-void uvedit_edge_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
+void uvedit_edge_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const bool do_history)
{
ToolSettings *ts = scene->toolsettings;
@@ -520,7 +522,7 @@
}
}
-void uvedit_uv_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
+void uvedit_uv_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const bool do_history)
{
ToolSettings *ts = scene->toolsettings;
@@ -1321,50 +1323,8 @@
return NULL;
}
-/* ******************** select more ******************** */
-static void uv_tag_sticky_flush(Scene *scene, Image *ima, BMLoop *l_start, eSpaceImage_Sticky sticky,
- const int cd_loop_uv_offset, const int cd_poly_tex_offset)
+static int uv_select_more_less(bContext *C, const bool select)
{
- BMIter iter;
- BMLoop *l;
- MTexPoly *tf;
- MLoopUV *luv;
-
- BM_elem_flag_enable(l_start, BM_ELEM_TAG);
-
- switch (sticky) {
- case SI_STICKY_LOC:
- luv = BM_ELEM_CD_GET_VOID_P(l_start, cd_loop_uv_offset);
-
- BM_ITER_ELEM (l, &iter, l_start->v, BM_LOOPS_OF_VERT) {
- tf = BM_ELEM_CD_GET_VOID_P(l->f, cd_poly_tex_offset);
-
- if (uvedit_face_visible_test(scene, ima, l->f, tf)) {
- MLoopUV *luv_other;
- luv_other = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
- if (compare_v2v2(luv->uv, luv_other->uv, STD_UV_CONNECT_LIMIT)) {
- BM_elem_flag_enable(l, BM_ELEM_TAG);
- }
- }
- }
- break;
- case SI_STICKY_VERTEX:
- BM_ITER_ELEM (l, &iter, l_start->v, BM_LOOPS_OF_VERT) {
- tf = BM_ELEM_CD_GET_VOID_P(l->f, cd_poly_tex_offset);
-
- if (uvedit_face_visible_test(scene, ima, l->f, tf)) {
- BM_elem_flag_enable(l, BM_ELEM_TAG);
- }
- }
- break;
- case SI_STICKY_DISABLE:
- break;
- }
-}
-
-static int uv_select_more_exec(bContext *C, wmOperator *UNUSED(op))
-{
Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
Image *ima = CTX_data_edit_image(C);
@@ -1372,59 +1332,96 @@
BMEditMesh *em = BKE_editmesh_from_object(obedit);
BMFace *efa;
- BMLoop *l, *lf;
- BMIter iter, liter, fiter;
+ BMLoop *l;
+ BMIter iter, liter;
ToolSettings *ts = scene->toolsettings;
- eSpaceImage_Sticky sticky = sima->sticky;
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
if (ts->uv_flag & UV_SYNC_SELECTION) {
- EDBM_select_more(em);
+ if (select) {
+ EDBM_select_more(em);
+ }
+ else {
+ EDBM_select_less(em);
+ }
+
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
- /* clear tags */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- BM_elem_flag_disable(l->next, BM_ELEM_TAG);
+ if (ts->uv_selectmode == UV_SELECT_FACE) {
+
+ /* clear tags */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_elem_flag_disable(efa, BM_ELEM_TAG);
}
- }
- /* mark loops to be selected */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+ /* mark loops to be selected */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
- if (uvedit_face_visible_test(scene, ima, efa, tf)) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ if (uvedit_face_visible_test(scene, ima, efa, tf)) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+#define IS_SEL 1
+#define IS_UNSEL 2
- if (luv->flag & MLOOPUV_VERTSEL) {
- if (ts->uv_selectmode == UV_SELECT_FACE) {
- BM_ITER_ELEM (lf, &fiter, l->f, BM_LOOPS_OF_FACE) {
- uv_tag_sticky_flush(scene, ima, lf, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
- }
+ int sel_state = 0;
+
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ sel_state |= IS_SEL;
}
else {
- uv_tag_sticky_flush(scene, ima, l->next, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
+ sel_state |= IS_UNSEL;
+ }
- uv_tag_sticky_flush(scene, ima, l->prev, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
+ /* if we have a mixed selection, tag to grow it */
+ if (sel_state == (IS_SEL | IS_UNSEL)) {
+ BM_elem_flag_enable(efa, BM_ELEM_TAG);
+ break;
}
}
+
+#undef IS_SEL
+#undef IS_UNSEL
+
}
}
+
+ /* select tagged faces */
+ uv_select_flush_from_tag_face(sima, scene, obedit, select);
}
+ else {
- /* select tagged loops */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (BM_elem_flag_test(l, BM_ELEM_TAG)) {
- uvedit_uv_select_enable(em, scene, l, FALSE);
+ /* clear tags */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ BM_elem_flag_disable(l, BM_ELEM_TAG);
}
}
+
+ /* mark loops to be selected */
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
+ if (uvedit_face_visible_test(scene, ima, efa, tf)) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+
+ MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+
+ if (((luv->flag & MLOOPUV_VERTSEL) != 0) == select) {
+ BM_elem_flag_enable(l->next, BM_ELEM_TAG);
+ BM_elem_flag_enable(l->prev, BM_ELEM_TAG);
+ }
+ }
+ }
+ }
+
+ /* select tagged loops */
+ uv_select_flush_from_tag_loop(sima, scene, obedit, select);
}
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
@@ -1432,6 +1429,11 @@
return OPERATOR_FINISHED;
}
+static int uv_select_more_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ return uv_select_more_less(C, true);
+}
+
static void UV_OT_select_more(wmOperatorType *ot)
{
/* identifiers */
@@ -1445,76 +1447,9 @@
ot->poll = ED_operator_uvedit;
}
-/* ******************** select less ******************** */
static int uv_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene = CTX_data_scene(C);
- Object *obedit = CTX_data_edit_object(C);
- Image *ima = CTX_data_edit_image(C);
- SpaceImage *sima = CTX_wm_space_image(C);
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
-
- BMFace *efa;
- BMLoop *l;
- BMIter iter, liter;
- eSpaceImage_Sticky sticky = sima->sticky;
-
- ToolSettings *ts = scene->toolsettings;
-
- const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
- const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
-
- if (ts->uv_flag & UV_SYNC_SELECTION) {
- EDBM_select_less(em);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data);
- return OPERATOR_FINISHED;
- }
-
- /* clear tags */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- BM_elem_flag_disable(l->next, BM_ELEM_TAG);
- }
- }
-
- /* mark loops to be deselected */
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- MTexPoly *tf = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
-
- if (uvedit_face_visible_test(scene, ima, efa, tf)) {
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
-
- if (luv->flag & MLOOPUV_VERTSEL) {
- MLoopUV *luv_next;
- MLoopUV *luv_prev;
-
- luv_next = BM_ELEM_CD_GET_VOID_P(l->next, cd_loop_uv_offset);
- if (!(luv_next->flag & MLOOPUV_VERTSEL)) {
- uv_tag_sticky_flush(scene, ima, l, sticky, cd_loop_uv_offset, cd_poly_tex_offset);
- }
-
- luv_prev = BM_ELEM_CD_GET_VOID_P(l->prev, cd_loop_uv_offset);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list