[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45943] trunk/blender/source/blender/ editors: bmesh/uv editor
Campbell Barton
ideasman42 at gmail.com
Tue Apr 24 21:28:18 CEST 2012
Revision: 45943
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45943
Author: campbellbarton
Date: 2012-04-24 19:28:18 +0000 (Tue, 24 Apr 2012)
Log Message:
-----------
bmesh/uv editor
- selecting in UV window with sync-sel enabled now sets/validates sel-history.
- border de-select now clears sel history.
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/ED_uvedit.h
trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c
trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
Modified: trunk/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_uvedit.h 2012-04-24 19:08:26 UTC (rev 45942)
+++ trunk/blender/source/blender/editors/include/ED_uvedit.h 2012-04-24 19:28:18 UTC (rev 45943)
@@ -64,11 +64,11 @@
int uvedit_edge_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
int uvedit_uv_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
+int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const short do_history);
int uvedit_face_deselect(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
void uvedit_edge_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const short do_history);
void uvedit_uv_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima, float co[2], float uv[2]);
Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2012-04-24 19:08:26 UTC (rev 45942)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2012-04-24 19:28:18 UTC (rev 45943)
@@ -84,6 +84,8 @@
#define EFA_F1_FLAG 2
+static void select_all_perform(Scene *scene, Image *ima, BMEditMesh *em, int action);
+
/************************* state testing ************************/
int ED_uvedit_test(Object *obedit)
@@ -324,12 +326,16 @@
}
}
-int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa)
+int uvedit_face_select(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;
@@ -395,7 +401,7 @@
}
}
-void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l)
+void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
{
ToolSettings *ts = scene->toolsettings;
@@ -409,6 +415,10 @@
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;
@@ -464,7 +474,7 @@
}
}
-void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l)
+void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l, const short do_history)
{
ToolSettings *ts = scene->toolsettings;
@@ -473,6 +483,10 @@
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);
@@ -998,17 +1012,13 @@
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
- count = 0;
- BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- if (!extend) {
- uvedit_face_deselect(scene, em, efa);
- }
-
+ if (!extend) {
+ select_all_perform(scene, ima, em, SEL_DESELECT);
+ }
+
+ BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, count) {
BMO_elem_flag_disable(em->bm, efa, EFA_F1_FLAG);
-
BM_elem_index_set(efa, count); /* set_inline */
-
- count++;
}
em->bm->elem_index_dirty &= ~BM_FACE;
@@ -1083,7 +1093,7 @@
iterv1 = uv_vertex_map_get(vmap, efa, a);
if (iterv1->flag) {
- if (select) uvedit_uv_select(em, scene, l);
+ if (select) uvedit_uv_select(em, scene, l, FALSE);
else uvedit_uv_deselect(em, scene, l);
}
@@ -1582,30 +1592,20 @@
/* ******************** (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);
@@ -1667,10 +1667,14 @@
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 +1735,7 @@
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 +1815,12 @@
/* 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;
- }
+ fill_vn_i(hitv, hit.efa->len, 0xFFFFFFFF);
- nvert = hit.efa->len;
-
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;
}
@@ -1883,7 +1883,7 @@
select = 0;
}
else {
- uvedit_uv_select(em, scene, hit.l);
+ uvedit_uv_select(em, scene, hit.l, TRUE);
select = 1;
}
flush = 1;
@@ -1895,7 +1895,7 @@
select = 0;
}
else {
- uvedit_edge_select(em, scene, hit.l);
+ uvedit_edge_select(em, scene, hit.l, TRUE);
select = 1;
}
flush = 1;
@@ -1907,12 +1907,19 @@
select = 0;
}
else {
- uvedit_face_select(scene, em, hit.efa);
+ uvedit_face_select(scene, em, hit.efa, TRUE);
select = 1;
}
flush = -1;
}
+ /* de-selecting an edge may deselect a face too - validate */
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ if (select == FALSE) {
+ BM_select_history_validate(em->bm);
+ }
+ }
+
/* (de)select sticky uv nodes */
if (sticky != SI_STICKY_DISABLE) {
@@ -1943,7 +1950,7 @@
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(em, scene, l, FALSE);
}
}
@@ -1953,23 +1960,21 @@
}
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(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(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(scene, em, hit.efa, TRUE);
}
/* select sticky uvs */
@@ -1984,7 +1989,7 @@
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(em, scene, l, FALSE);
flush = 1;
}
@@ -2317,7 +2322,7 @@
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(em, scene, l, FALSE);
else
uvedit_uv_deselect(em, scene, l);
}
@@ -2351,7 +2356,7 @@
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (select)
- uvedit_uv_select(em, scene, l);
+ uvedit_uv_select(em, scene, l, FALSE);
else
uvedit_uv_deselect(em, scene, l);
@@ -2378,7 +2383,7 @@
/* 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(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));
}
@@ -2395,7 +2400,7 @@
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(scene, em, efa, FALSE);
else
uvedit_face_deselect(scene, em, efa);
}
@@ -2436,7 +2441,7 @@
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);
@@ -2483,14 +2488,14 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list