diff options
author | Daniel Stokes <kupomail@gmail.com> | 2012-04-26 07:11:15 +0400 |
---|---|---|
committer | Daniel Stokes <kupomail@gmail.com> | 2012-04-26 07:11:15 +0400 |
commit | f306b50700b05707f44b5472ac0b38d58fb01b0d (patch) | |
tree | cfa63e4c17e02752b8c97752fa1ca31bc5b8546e /source/blender/editors/uvedit/uvedit_ops.c | |
parent | ef9fbb56f7d26d39de118f939995529710f141bc (diff) | |
parent | 2f74471dd96382521c57e53fc99fb0df3974f7dc (diff) |
Merged revisions 45910-45967 from trunk/blender
Diffstat (limited to 'source/blender/editors/uvedit/uvedit_ops.c')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 372 |
1 files changed, 195 insertions, 177 deletions
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index c08093e09ee..1c62ce3a684 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -82,7 +82,7 @@ #include "uvedit_intern.h" -#define EFA_F1_FLAG 2 +static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action); /************************* state testing ************************/ @@ -207,7 +207,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (uvedit_face_visible(scene, previma, efa, tf)) { + if (uvedit_face_visible_test(scene, previma, efa, tf)) { if (ima) { tf->tpage = ima; @@ -293,7 +293,7 @@ int uvedit_face_visible_nolocal(Scene *scene, BMFace *efa) return (BM_elem_flag_test(efa, BM_ELEM_HIDDEN) == 0 && BM_elem_flag_test(efa, BM_ELEM_SELECT)); } -int uvedit_face_visible(Scene *scene, Image *ima, BMFace *efa, MTexPoly *tf) +int uvedit_face_visible_test(Scene *scene, Image *ima, BMFace *efa, MTexPoly *tf) { ToolSettings *ts = scene->toolsettings; @@ -303,7 +303,7 @@ int uvedit_face_visible(Scene *scene, Image *ima, BMFace *efa, MTexPoly *tf) return uvedit_face_visible_nolocal(scene, efa); } -int uvedit_face_selected(Scene *scene, BMEditMesh *em, BMFace *efa) +int uvedit_face_select_test(Scene *scene, BMEditMesh *em, BMFace *efa) { ToolSettings *ts = scene->toolsettings; @@ -324,12 +324,16 @@ int uvedit_face_selected(Scene *scene, BMEditMesh *em, BMFace *efa) } } -int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa) +int uvedit_face_select_enable(Scene *scene, BMEditMesh *em, BMFace *efa, const short do_history) { ToolSettings *ts = scene->toolsettings; - if (ts->uv_flag & UV_SYNC_SELECTION) + if (ts->uv_flag & UV_SYNC_SELECTION) { BM_face_select_set(em->bm, efa, TRUE); + if (do_history) { + BM_select_history_store(em->bm, (BMElem *)efa); + } + } else { BMLoop *l; MLoopUV *luv; @@ -346,7 +350,7 @@ int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa) return 0; } -int uvedit_face_deselect(Scene *scene, BMEditMesh *em, BMFace *efa) +int uvedit_face_select_disable(Scene *scene, BMEditMesh *em, BMFace *efa) { ToolSettings *ts = scene->toolsettings; @@ -369,7 +373,7 @@ int uvedit_face_deselect(Scene *scene, BMEditMesh *em, BMFace *efa) return 0; } -int uvedit_edge_selected(BMEditMesh *em, Scene *scene, BMLoop *l) +int uvedit_edge_select_test(BMEditMesh *em, Scene *scene, BMLoop *l) { ToolSettings *ts = scene->toolsettings; @@ -395,7 +399,7 @@ int uvedit_edge_selected(BMEditMesh *em, Scene *scene, BMLoop *l) } } -void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l) +void uvedit_edge_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history) { ToolSettings *ts = scene->toolsettings; @@ -409,6 +413,10 @@ void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l) BM_vert_select_set(em->bm, l->e->v1, TRUE); BM_vert_select_set(em->bm, l->e->v2, TRUE); } + + if (do_history) { + BM_select_history_store(em->bm, (BMElem *)l->e); + } } else { MLoopUV *luv1, *luv2; @@ -421,7 +429,7 @@ void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l) } } -void uvedit_edge_deselect(BMEditMesh *em, Scene *scene, BMLoop *l) +void uvedit_edge_select_disable(BMEditMesh *em, Scene *scene, BMLoop *l) { ToolSettings *ts = scene->toolsettings; @@ -447,7 +455,7 @@ void uvedit_edge_deselect(BMEditMesh *em, Scene *scene, BMLoop *l) } } -int uvedit_uv_selected(BMEditMesh *em, Scene *scene, BMLoop *l) +int uvedit_uv_select_test(BMEditMesh *em, Scene *scene, BMLoop *l) { ToolSettings *ts = scene->toolsettings; @@ -464,7 +472,7 @@ int uvedit_uv_selected(BMEditMesh *em, Scene *scene, BMLoop *l) } } -void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l) +void uvedit_uv_select_enable(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history) { ToolSettings *ts = scene->toolsettings; @@ -473,6 +481,10 @@ void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l) BM_face_select_set(em->bm, l->f, TRUE); else BM_vert_select_set(em->bm, l->v, TRUE); + + if (do_history) { + BM_select_history_remove(em->bm, (BMElem *)l->v); + } } else { MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); @@ -481,7 +493,7 @@ void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l) } } -void uvedit_uv_deselect(BMEditMesh *em, Scene *scene, BMLoop *l) +void uvedit_uv_select_disable(BMEditMesh *em, Scene *scene, BMLoop *l) { ToolSettings *ts = scene->toolsettings; @@ -584,11 +596,11 @@ int ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float *min, float sel = 0; BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); DO_MINMAX2(luv->uv, min, max); sel = 1; @@ -612,12 +624,12 @@ static int ED_uvedit_median(Scene *scene, Image *ima, Object *obedit, float co[2 zero_v2(co); BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { add_v2_v2(co, luv->uv); sel++; } @@ -668,7 +680,7 @@ void uv_find_nearest_edge(Scene *scene, Image *ima, BMEditMesh *em, float co[2], BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; i = 0; @@ -717,7 +729,7 @@ static void find_nearest_uv_face(Scene *scene, Image *ima, BMEditMesh *em, float BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; cent[0] = cent[1] = 0.0f; @@ -808,14 +820,14 @@ void uv_find_nearest_vert(Scene *scene, Image *ima, BMEditMesh *em, BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; i = 0; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); - if (penalty && uvedit_uv_selected(em, scene, l)) + if (penalty && uvedit_uv_select_test(em, scene, l)) dist = fabs(co[0] - luv->uv[0]) + penalty[0] + fabs(co[1] - luv->uv[1]) + penalty[1]; else dist = fabs(co[0] - luv->uv[0]) + fabs(co[1] - luv->uv[1]); @@ -861,7 +873,7 @@ int ED_uvedit_nearest_uv(Scene *scene, Object *obedit, Image *ima, float co[2], BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { @@ -881,9 +893,22 @@ int ED_uvedit_nearest_uv(Scene *scene, Object *obedit, Image *ima, float co[2], return found; } +UvElement *ED_uv_element_get(UvElementMap *map, BMFace *efa, BMLoop *l) +{ + UvElement *element; + + element = map->vert[BM_elem_index_get(l->v)]; + + for (; element; element = element->next) + if (element->face == efa) + return element; + + return NULL; +} + /*********************** loop select ***********************/ -static void uv_vertex_loop_flag(UvMapVert *first) +static void select_edgeloop_uv_vertex_loop_flag(UvMapVert *first) { UvMapVert *iterv; int count = 0; @@ -899,7 +924,7 @@ static void uv_vertex_loop_flag(UvMapVert *first) first->flag = 1; } -static UvMapVert *uv_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a) +static UvMapVert *select_edgeloop_uv_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a) { UvMapVert *iterv, *first; BMLoop *l; @@ -917,20 +942,7 @@ static UvMapVert *uv_vertex_map_get(UvVertMap *vmap, BMFace *efa, int a) return NULL; } -UvElement *ED_uv_element_get(UvElementMap *map, BMFace *efa, BMLoop *l) -{ - UvElement *element; - - element = map->vert[BM_elem_index_get(l->v)]; - - for (; element; element = element->next) - if (element->face == efa) - return element; - - return NULL; -} - -static int uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface) +static int select_edgeloop_uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first2, int *totface) { UvMapVert *iterv1, *iterv2; BMFace *efa; @@ -948,7 +960,7 @@ static int uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first if (iterv1->f == iterv2->f) { /* if face already tagged, don't do this edge */ efa = EDBM_face_at_index(em, iterv1->f); - if (BMO_elem_flag_test(em->bm, efa, EFA_F1_FLAG)) + if (BM_elem_flag_test(efa, BM_ELEM_TAG)) return 0; tot++; @@ -973,7 +985,7 @@ static int uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first if (iterv1->f == iterv2->f) { efa = EDBM_face_at_index(em, iterv1->f); - BMO_elem_flag_enable(em->bm, efa, EFA_F1_FLAG); + BM_elem_flag_enable(efa, BM_ELEM_TAG); break; } } @@ -982,7 +994,8 @@ static int uv_edge_tag_faces(BMEditMesh *em, UvMapVert *first1, UvMapVert *first return 1; } -static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit, float limit[2], int extend) +static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit *hit, + float limit[2], const short extend) { BMFace *efa; BMIter iter, liter; @@ -990,37 +1003,29 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit MTexPoly *tf; UvVertMap *vmap; UvMapVert *iterv1, *iterv2; - int a, count, looking, nverts, starttotf, select; + int a, looking, nverts, starttotf, select; /* setup */ EDBM_index_arrays_init(em, 0, 0, 1); vmap = EDBM_uv_vert_map_create(em, 0, 0, limit); - BM_mesh_elem_index_ensure(em->bm, BM_VERT); + BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE); - count = 0; - BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { - if (!extend) { - uvedit_face_deselect(scene, em, efa); - } - - BMO_elem_flag_disable(em->bm, efa, EFA_F1_FLAG); - - BM_elem_index_set(efa, count); /* set_inline */ - - count++; + if (!extend) { + select_all_perform(scene, ima, em, SEL_DESELECT); } - em->bm->elem_index_dirty &= ~BM_FACE; + + BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, FALSE); /* set flags for first face and verts */ nverts = hit->efa->len; - iterv1 = uv_vertex_map_get(vmap, hit->efa, hit->lindex); - iterv2 = uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts); - uv_vertex_loop_flag(iterv1); - uv_vertex_loop_flag(iterv2); + iterv1 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, hit->lindex); + iterv2 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts); + select_edgeloop_uv_vertex_loop_flag(iterv1); + select_edgeloop_uv_vertex_loop_flag(iterv2); starttotf = 0; - uv_edge_tag_faces(em, iterv1, iterv2, &starttotf); + select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf); /* sorry, first edge isn't even ok */ if (iterv1->flag == 0 && iterv2->flag == 0) looking = 0; @@ -1035,24 +1040,24 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!BMO_elem_flag_test(em->bm, efa, EFA_F1_FLAG) && uvedit_face_visible(scene, ima, efa, tf)) { + if (!BM_elem_flag_test(efa, BM_ELEM_TAG) && uvedit_face_visible_test(scene, ima, efa, tf)) { nverts = efa->len; for (a = 0; a < nverts; a++) { /* check face not hidden and not tagged */ - iterv1 = uv_vertex_map_get(vmap, efa, a); - iterv2 = uv_vertex_map_get(vmap, efa, (a + 1) % nverts); + iterv1 = select_edgeloop_uv_vertex_map_get(vmap, efa, a); + iterv2 = select_edgeloop_uv_vertex_map_get(vmap, efa, (a + 1) % nverts); if (!iterv1 || !iterv2) continue; /* check if vertex is tagged and has right valence */ if (iterv1->flag || iterv2->flag) { - if (uv_edge_tag_faces(em, iterv1, iterv2, &starttotf)) { + if (select_edgeloop_uv_edge_tag_faces(em, iterv1, iterv2, &starttotf)) { looking = 1; - BMO_elem_flag_enable(em->bm, efa, EFA_F1_FLAG); + BM_elem_flag_enable(efa, BM_ELEM_TAG); - uv_vertex_loop_flag(iterv1); - uv_vertex_loop_flag(iterv2); + select_edgeloop_uv_vertex_loop_flag(iterv1); + select_edgeloop_uv_vertex_loop_flag(iterv2); break; } } @@ -1063,13 +1068,13 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit /* do the actual select/deselect */ nverts = hit->efa->len; - iterv1 = uv_vertex_map_get(vmap, hit->efa, hit->lindex); - iterv2 = uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts); + iterv1 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, hit->lindex); + iterv2 = select_edgeloop_uv_vertex_map_get(vmap, hit->efa, (hit->lindex + 1) % nverts); iterv1->flag = 1; iterv2->flag = 1; if (extend) { - if (uvedit_uv_selected(em, scene, hit->l)) + if (uvedit_uv_select_test(em, scene, hit->l)) select = 0; else select = 1; @@ -1080,11 +1085,11 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { a = 0; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - iterv1 = uv_vertex_map_get(vmap, efa, a); + iterv1 = select_edgeloop_uv_vertex_map_get(vmap, efa, a); if (iterv1->flag) { - if (select) uvedit_uv_select(em, scene, l); - else uvedit_uv_deselect(em, scene, l); + if (select) uvedit_uv_select_enable(em, scene, l, FALSE); + else uvedit_uv_select_disable(em, scene, l); } a++; @@ -1126,7 +1131,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[ BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (uvedit_face_visible(scene, ima, efa, tf)) { + if (uvedit_face_visible_test(scene, ima, efa, tf)) { BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); @@ -1285,10 +1290,10 @@ static float *uv_sel_co_from_eve(Scene *scene, Image *ima, BMEditMesh *em, BMVer BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) { MTexPoly *tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, l->f, tf)) + if (!uvedit_face_visible_test(scene, ima, l->f, tf)) continue; - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); return luv->uv; } @@ -1326,11 +1331,11 @@ static void weld_align_uv(bContext *C, int tool) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); DO_MINMAX2(luv->uv, min, max); } @@ -1348,11 +1353,11 @@ static void weld_align_uv(bContext *C, int tool) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); luv->uv[0] = cent[0]; } @@ -1367,11 +1372,11 @@ static void weld_align_uv(bContext *C, int tool) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); luv->uv[1] = cent[1]; } @@ -1397,10 +1402,10 @@ static void weld_align_uv(bContext *C, int tool) BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) { tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, l->f, tf)) + if (!uvedit_face_visible_test(scene, ima, l->f, tf)) continue; - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { BM_elem_flag_enable(eve, BM_ELEM_TAG); break; } @@ -1487,10 +1492,10 @@ static void weld_align_uv(bContext *C, int tool) BM_ITER_ELEM (l, &liter, eve_line[i], BM_LOOPS_OF_VERT) { tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, l->f, tf)) + if (!uvedit_face_visible_test(scene, ima, l->f, tf)) continue; - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); /* Projection of point (x, y) over line (x1, y1, x2, y2) along X axis: * new_y = (y2 - y1) / (x2 - x1) * (x - x1) + y1 @@ -1582,30 +1587,20 @@ static void UV_OT_weld(wmOperatorType *ot) /* ******************** (de)select all operator **************** */ -static void select_all_perform(bContext *C, int action) +static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action) { - Scene *scene; - ToolSettings *ts; - Object *obedit; - BMEditMesh *em; + ToolSettings *ts = scene->toolsettings; BMFace *efa; BMLoop *l; BMIter iter, liter; - Image *ima; MTexPoly *tf; MLoopUV *luv; - - scene = CTX_data_scene(C); - ts = CTX_data_tool_settings(C); - obedit = CTX_data_edit_object(C); - em = BMEdit_FromObject(obedit); - ima = CTX_data_edit_image(C); - + if (ts->uv_flag & UV_SYNC_SELECTION) { switch (action) { case SEL_TOGGLE: - EDBM_select_toggle_all(BMEdit_FromObject(obedit)); + EDBM_select_toggle_all(em); break; case SEL_SELECT: EDBM_flag_enable_all(em, BM_ELEM_SELECT); @@ -1625,7 +1620,7 @@ static void select_all_perform(bContext *C, int action) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { @@ -1643,7 +1638,7 @@ static void select_all_perform(bContext *C, int action) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { @@ -1667,10 +1662,14 @@ static void select_all_perform(bContext *C, int action) static int select_all_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); Object *obedit = CTX_data_edit_object(C); + Image *ima = CTX_data_edit_image(C); + BMEditMesh *em = BMEdit_FromObject(obedit); + int action = RNA_enum_get(op->ptr, "action"); - select_all_perform(C, action); + select_all_perform(scene, ima, em, action); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); @@ -1731,7 +1730,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) MTexPoly *tf; MLoopUV *luv; NearestHit hit; - int i, select = 1, selectmode, sticky, sync, *hitv = NULL, nvert; + int i, select = 1, selectmode, sticky, sync, *hitv = NULL; BLI_array_declare(hitv); int flush = 0, hitlen = 0; /* 0 == don't flush, 1 == sel, -1 == desel; only use when selection sync is enabled */ float limit[2], **hituv = NULL; @@ -1811,16 +1810,12 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) /* mark 2 edge vertices as being hit */ BLI_array_growitems(hitv, hit.efa->len); BLI_array_growitems(hituv, hit.efa->len); - for (i = 0; i < hit.efa->len; i++) { - hitv[i] = 0xFFFFFFFF; - } - - nvert = hit.efa->len; + fill_vn_i(hitv, hit.efa->len, 0xFFFFFFFF); hitv[hit.lindex] = hit.vert1; - hitv[(hit.lindex + 1) % nvert] = hit.vert2; + hitv[(hit.lindex + 1) % hit.efa->len] = hit.vert2; hituv[hit.lindex] = hit.luv->uv; - hituv[(hit.lindex + 1) % nvert] = hit.nextluv->uv; + hituv[(hit.lindex + 1) % hit.efa->len] = hit.nextluv->uv; hitlen = hit.efa->len; } @@ -1878,41 +1873,48 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) else if (extend) { if (selectmode == UV_SELECT_VERTEX) { /* (de)select uv vertex */ - if (uvedit_uv_selected(em, scene, hit.l)) { - uvedit_uv_deselect(em, scene, hit.l); + if (uvedit_uv_select_test(em, scene, hit.l)) { + uvedit_uv_select_disable(em, scene, hit.l); select = 0; } else { - uvedit_uv_select(em, scene, hit.l); + uvedit_uv_select_enable(em, scene, hit.l, TRUE); select = 1; } flush = 1; } else if (selectmode == UV_SELECT_EDGE) { /* (de)select edge */ - if (uvedit_edge_selected(em, scene, hit.l)) { - uvedit_edge_deselect(em, scene, hit.l); + if (uvedit_edge_select_test(em, scene, hit.l)) { + uvedit_edge_select_disable(em, scene, hit.l); select = 0; } else { - uvedit_edge_select(em, scene, hit.l); + uvedit_edge_select_enable(em, scene, hit.l, TRUE); select = 1; } flush = 1; } else if (selectmode == UV_SELECT_FACE) { /* (de)select face */ - if (uvedit_face_selected(scene, em, hit.efa)) { - uvedit_face_deselect(scene, em, hit.efa); + if (uvedit_face_select_test(scene, em, hit.efa)) { + uvedit_face_select_disable(scene, em, hit.efa); select = 0; } else { - uvedit_face_select(scene, em, hit.efa); + uvedit_face_select_enable(scene, em, hit.efa, TRUE); select = 1; } flush = -1; } + /* de-selecting an edge may deselect a face too - validate */ + if (sync) { + if (select == FALSE) { + BM_select_history_validate(em->bm); + } + } + /* (de)select sticky uv nodes */ if (sticky != SI_STICKY_DISABLE) { @@ -1922,13 +1924,13 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) if (select == 0) { BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) - uvedit_uv_deselect(em, scene, l); + uvedit_uv_select_disable(em, scene, l); } } flush = -1; @@ -1937,13 +1939,13 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) else { BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) - uvedit_uv_select(em, scene, l); + uvedit_uv_select_enable(em, scene, l, FALSE); } } @@ -1953,30 +1955,28 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) } else { /* deselect all */ - BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { - uvedit_face_deselect(scene, em, efa); - } + select_all_perform(scene, ima, em, SEL_DESELECT); if (selectmode == UV_SELECT_VERTEX) { /* select vertex */ - uvedit_uv_select(em, scene, hit.l); + uvedit_uv_select_enable(em, scene, hit.l, TRUE); flush = 1; } else if (selectmode == UV_SELECT_EDGE) { /* select edge */ - uvedit_edge_select(em, scene, hit.l); + uvedit_edge_select_enable(em, scene, hit.l, TRUE); flush = 1; } else if (selectmode == UV_SELECT_FACE) { /* select face */ - uvedit_face_select(scene, em, hit.efa); + uvedit_face_select_enable(scene, em, hit.efa, TRUE); } /* select sticky uvs */ if (sticky != SI_STICKY_DISABLE) { BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { @@ -1984,7 +1984,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) - uvedit_uv_select(em, scene, l); + uvedit_uv_select_enable(em, scene, l, FALSE); flush = 1; } @@ -1992,19 +1992,32 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop) } } -#if 0 /* BM_elem_select_set API handles all of this? */ - if (sync) { /* flush for mesh selection */ + + /* before bmesh */ +#if 0 if (ts->selectmode != SCE_SELECT_FACE) { if (flush == 1) EDBM_select_flush(em); else if (flush == -1) EDBM_deselect_flush(em); } - } #else - (void)flush; /* flush is otherwise UNUSED */ - (void)sync; /* sync is otherwise UNUSED */ + if (flush != 0) { + if (loop) { + /* push vertex -> edge selection */ + if (select) { + EDBM_select_flush(em); + } + else { + EDBM_deselect_flush(em); + } + } + else { + EDBM_selectmode_flush(em); + } + } #endif + } DAG_id_tag_update(obedit->data, 0); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); @@ -2230,7 +2243,7 @@ static int unlink_selection_exec(bContext *C, wmOperator *op) int desel = 0; tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { @@ -2317,9 +2330,9 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { if (BM_elem_flag_test(l->v, BM_ELEM_TAG)) { if (select) - uvedit_uv_select(em, scene, l); + uvedit_uv_select_enable(em, scene, l, FALSE); else - uvedit_uv_deselect(em, scene, l); + uvedit_uv_select_disable(em, scene, l); } } } @@ -2351,9 +2364,9 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { if (select) - uvedit_uv_select(em, scene, l); + uvedit_uv_select_enable(em, scene, l, FALSE); else - uvedit_uv_deselect(em, scene, l); + uvedit_uv_select_disable(em, scene, l); vlist_iter = EDBM_uv_vert_map_at_index(vmap, BM_elem_index_get(l->v)); @@ -2378,9 +2391,9 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje /* tf_vlist = CustomData_bmesh_get(&em->bm->pdata, efa_vlist->head.data, CD_MTEXPOLY); */ /* UNUSED */ if (select) - uvedit_uv_select(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex)); + uvedit_uv_select_enable(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex), FALSE); else - uvedit_uv_deselect(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex)); + uvedit_uv_select_disable(em, scene, BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa_vlist, vlist_iter->tfindex)); } vlist_iter = vlist_iter->next; } @@ -2395,9 +2408,9 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { if (BM_elem_flag_test(efa, BM_ELEM_TAG)) { if (select) - uvedit_face_select(scene, em, efa); + uvedit_face_select_enable(scene, em, efa, FALSE); else - uvedit_face_deselect(scene, em, efa); + uvedit_face_select_disable(scene, em, efa); } } } @@ -2436,7 +2449,7 @@ static int border_select_exec(bContext *C, wmOperator *op) extend = RNA_boolean_get(op->ptr, "extend"); if (!extend) - select_all_perform(C, SEL_DESELECT); + select_all_perform(scene, ima, em, SEL_DESELECT); if (ts->uv_flag & UV_SYNC_SELECTION) faces = (ts->selectmode == SCE_SELECT_FACE); @@ -2455,7 +2468,7 @@ static int border_select_exec(bContext *C, wmOperator *op) BM_elem_flag_disable(efa, BM_ELEM_TAG); tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (uvedit_face_visible(scene, ima, efa, tf)) { + if (uvedit_face_visible_test(scene, ima, efa, tf)) { poly_uv_center(em, efa, cent); if (BLI_in_rctf(&rectf, cent[0], cent[1])) { BM_elem_flag_enable(efa, BM_ELEM_TAG); @@ -2474,7 +2487,7 @@ static int border_select_exec(bContext *C, wmOperator *op) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) + if (!uvedit_face_visible_test(scene, ima, efa, tf)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); @@ -2483,15 +2496,15 @@ static int border_select_exec(bContext *C, wmOperator *op) /* UV_SYNC_SELECTION - can't do pinned selection */ if (BLI_in_rctf(&rectf, luv->uv[0], luv->uv[1])) { - if (select) uvedit_uv_select(em, scene, l); - else uvedit_uv_deselect(em, scene, l); + if (select) uvedit_uv_select_enable(em, scene, l, FALSE); + else uvedit_uv_select_disable(em, scene, l); } } else if (pinned) { if ((luv->flag & MLOOPUV_PINNED) && BLI_in_rctf(&rectf, luv->uv[0], luv->uv[1])) { - if (select) uvedit_uv_select(em, scene, l); - else uvedit_uv_deselect(em, scene, l); + if (select) uvedit_uv_select_enable(em, scene, l, FALSE); + else uvedit_uv_select_disable(em, scene, l); } } } @@ -2499,15 +2512,20 @@ static int border_select_exec(bContext *C, wmOperator *op) } if (change) { - /* make sure newly selected vert selection is updated*/ -#if 0 /* BM_elem_select_set API handles all of this? */ + /* bmesh API habdles flushing but not on de-select */ if (ts->uv_flag & UV_SYNC_SELECTION) { if (ts->selectmode != SCE_SELECT_FACE) { - if (select) EDBM_select_flush(em); - else EDBM_deselect_flush(em); + if (select == FALSE) { + EDBM_deselect_flush(em); + } + } + } + + if (ts->uv_flag & UV_SYNC_SELECTION) { + if (select == FALSE) { + BM_select_history_validate(em->bm); } } -#endif WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); @@ -2556,8 +2574,8 @@ static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *UNUSED(sima), S r2 = x * x + y * y; if (r2 < 1.0f) { - if (select) uvedit_uv_select(em, scene, l); - else uvedit_uv_deselect(em, scene, l); + if (select) uvedit_uv_select_enable(em, scene, l, FALSE); + else uvedit_uv_select_disable(em, scene, l); } } @@ -2715,11 +2733,11 @@ static int snap_uvs_to_cursor(Scene *scene, Image *ima, Object *obedit, SpaceIma BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tface)) + if (!uvedit_face_visible_test(scene, ima, efa, tface)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); copy_v2_v2(luv->uv, sima->cursor); change = 1; @@ -2745,10 +2763,10 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe * get unique indices and to count how much to malloc */ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { tface = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_MTEXPOLY); - if (uvedit_face_visible(scene, ima, f, tface)) { + if (uvedit_face_visible_test(scene, ima, f, tface)) { BM_elem_flag_enable(f, BM_ELEM_TAG); BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) { - BM_elem_flag_set(l, BM_ELEM_TAG, uvedit_uv_selected(em, scene, l)); + BM_elem_flag_set(l, BM_ELEM_TAG, uvedit_uv_select_test(em, scene, l)); } } else { @@ -2806,11 +2824,11 @@ static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tface)) + if (!uvedit_face_visible_test(scene, ima, efa, tface)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_uv_selected(em, scene, l)) { + if (uvedit_uv_select_test(em, scene, l)) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); snap_uv_to_pixel(luv->uv, w, h); } @@ -2891,18 +2909,18 @@ static int pin_exec(bContext *C, wmOperator *op) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tface)) + if (!uvedit_face_visible_test(scene, ima, efa, tface)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); if (!clear) { - if (uvedit_uv_selected(em, scene, l)) + if (uvedit_uv_select_test(em, scene, l)) luv->flag |= MLOOPUV_PINNED; } else { - if (uvedit_uv_selected(em, scene, l)) + if (uvedit_uv_select_test(em, scene, l)) luv->flag &= ~MLOOPUV_PINNED; } } @@ -2945,14 +2963,14 @@ static int select_pinned_exec(bContext *C, wmOperator *UNUSED(op)) BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tface)) + if (!uvedit_face_visible_test(scene, ima, efa, tface)) continue; BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV); if (luv->flag & MLOOPUV_PINNED) - uvedit_uv_select(em, scene, l); + uvedit_uv_select_enable(em, scene, l, FALSE); } } @@ -3025,7 +3043,7 @@ static int hide_exec(bContext *C, wmOperator *op) tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); - if (!uvedit_face_visible(scene, ima, efa, tf)) { + if (!uvedit_face_visible_test(scene, ima, efa, tf)) { continue; } @@ -3047,7 +3065,7 @@ static int hide_exec(bContext *C, wmOperator *op) if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) { BM_face_select_set(em->bm, efa, FALSE); } - uvedit_face_deselect(scene, em, efa); + uvedit_face_select_disable(scene, em, efa); } else { if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) { @@ -3058,7 +3076,7 @@ static int hide_exec(bContext *C, wmOperator *op) } } } - if (!swap) uvedit_face_deselect(scene, em, efa); + if (!swap) uvedit_face_select_disable(scene, em, efa); } @@ -3067,7 +3085,7 @@ static int hide_exec(bContext *C, wmOperator *op) /* check if a UV is de-selected */ if (bm_face_is_all_uv_sel(em->bm, efa, FALSE) != !swap) { BM_face_select_set(em->bm, efa, FALSE); - uvedit_face_deselect(scene, em, efa); + uvedit_face_select_disable(scene, em, efa); } } else { @@ -3086,7 +3104,7 @@ static int hide_exec(bContext *C, wmOperator *op) if (em->selectmode != SCE_SELECT_FACE) EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX | SCE_SELECT_EDGE); - EDBM_editselection_validate(em); + BM_select_history_validate(em->bm); WM_event_add_notifier(C, NC_GEOM | ND_SELECT, obedit->data); return OPERATOR_FINISHED; @@ -3498,7 +3516,7 @@ static int mark_seam_exec(bContext *C, wmOperator *UNUSED(op)) BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) { BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) { - if (uvedit_edge_selected(em, scene, loop)) { + if (uvedit_edge_select_test(em, scene, loop)) { BM_elem_flag_enable(loop->e, BM_ELEM_SEAM); } } |