[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45493] trunk/blender/source/blender/ editors/uvedit/uvedit_ops.c: fix [#30880] Selected to Adjacent Unselected broken
Campbell Barton
ideasman42 at gmail.com
Tue Apr 10 02:09:57 CEST 2012
Revision: 45493
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45493
Author: campbellbarton
Date: 2012-04-10 00:09:54 +0000 (Tue, 10 Apr 2012)
Log Message:
-----------
fix [#30880] Selected to Adjacent Unselected broken
Modified Paths:
--------------
trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2012-04-09 19:02:29 UTC (rev 45492)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c 2012-04-10 00:09:54 UTC (rev 45493)
@@ -2743,97 +2743,56 @@
static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obedit)
{
BMEditMesh *em = BMEdit_FromObject(obedit);
- BMFace *efa;
- BMLoop *l;
- BMIter iter, liter;
- BMVert *eve;
+ BMesh *bm = em->bm;
+ BMFace *f;
+ BMLoop *l, *lsub;
+ BMIter iter, liter, lsubiter;
MTexPoly *tface;
MLoopUV *luv;
- short change = 0;
- int count = 0;
- float *coords;
- short *usercount, users;
-
- /* BMESH_TODO - stop setting the index, bad juju
- * not totally simple because 3 states and because the count is not
- * based on the global vertex index :S - campbell */
-
- /* set all verts to -1 : an unused index*/
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- BM_elem_index_set(eve, -1); /* set_dirty! */
- em->bm->elem_index_dirty |= BM_VERT;
+ short change = FALSE;
/* index every vert that has a selected UV using it, but only once so as to
* get unique indices and to count how much to malloc */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (!uvedit_face_visible(scene, ima, efa, tface)) {
- BM_elem_flag_disable(efa, BM_ELEM_TAG);
- continue;
+ BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ tface = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_MTEXPOLY);
+ if (uvedit_face_visible(scene, ima, f, tface)) {
+ BM_elem_flag_enable(f, BM_ELEM_TAG);
+ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_elem_flag_set(l, BM_ELEM_TAG, uvedit_uv_selected(em, scene, l));
+ }
}
else {
- BM_elem_flag_enable(efa, BM_ELEM_TAG);
+ BM_elem_flag_disable(f, BM_ELEM_TAG);
}
-
- change = 1;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- if (uvedit_uv_selected(em, scene, l) && BM_elem_index_get(l->v) == -1) {
- BM_elem_index_set(l->v, count); /* set_dirty! */
- count++;
- }
- }
}
- em->bm->elem_index_dirty |= BM_VERT; /* set above but include for completeness since they are made dirty again */
-
- coords = MEM_callocN(sizeof(float)*count*2, "snap to adjacent coords");
- usercount = MEM_callocN(sizeof(short)*count, "snap to adjacent counts");
-
- /* add all UV coords from visible, unselected UV coords as well as counting them to average later */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
- tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (!uvedit_face_visible(scene, ima, efa, tface))
- continue;
+ BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ if (BM_elem_flag_test(f, BM_ELEM_TAG)) { /* face: visible */
+ BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ if (BM_elem_flag_test(f, BM_ELEM_TAG)) { /* loop: selected*/
+ float uv[2] = {0.0f, 0.0f};
+ int uv_tot = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- if (BM_elem_index_get(l->v) >= 0 &&
- (!uvedit_uv_selected(em, scene, l))) {
- luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- add_v2_v2(&coords[BM_elem_index_get(l->v) * 2], luv->uv);
- change = 1;
- }
- }
- }
-
- /* no other verts selected, bail out */
- if (!change) {
- MEM_freeN(coords);
- MEM_freeN(usercount);
- return change;
- }
-
- /* copy the averaged unselected UVs back to the selected UVs */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
- continue;
+ BM_ITER(lsub, &lsubiter, bm, BM_LOOPS_OF_VERT, l->v) {
+ if (BM_elem_flag_test(lsub->f, BM_ELEM_TAG) && /* face: visible */
+ !BM_elem_flag_test(lsub, BM_ELEM_TAG)) /* loop: unselected */
+ {
- tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (!uvedit_face_visible(scene, ima, efa, tface))
- continue;
+ luv = CustomData_bmesh_get(&bm->ldata, lsub->head.data, CD_MLOOPUV);
+ add_v2_v2(uv, luv->uv);
+ uv_tot++;
+ }
+ }
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- if (uvedit_uv_selected(em, scene, l) && BM_elem_index_get(l->v) >= 0
- && (users = usercount[BM_elem_index_get(l->v)])) {
- luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- copy_v2_v2(luv->uv, &coords[BM_elem_index_get(l->v) * 2]);
+ if (uv_tot) {
+ luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
+ mul_v2_v2fl(luv->uv, uv, 1.0f / (float)uv_tot);
+ change = TRUE;
+ }
+ }
}
}
}
-
- MEM_freeN(coords);
- MEM_freeN(usercount);
return change;
}
More information about the Bf-blender-cvs
mailing list