Revision: 49160
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49160
Author:   psy-fi
Date:     2012-07-23 22:57:47 +0000 (Mon, 23 Jul 2012)
Log Message:
-----------
Mirrored Unwrap
================
* support for ngons in regular unwrap.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_2D.c
    
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_2D.c
===================================================================
--- branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_2D.c  
2012-07-23 22:39:26 UTC (rev 49159)
+++ branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_2D.c  
2012-07-23 22:57:47 UTC (rev 49160)
@@ -322,8 +322,6 @@
 
        BKE_brush_randomize_size(brush);
 
-       print_v2("mouse"__FILE__, pos);
-
        if (pressure == 0.0f) {
                if (painter->lastpressure) // XXX - hack, operator misses
                        pressure = painter->lastpressure;

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c   
    2012-07-23 22:39:26 UTC (rev 49159)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/uvedit/uvedit_unwrap_ops.c   
    2012-07-23 22:57:47 UTC (rev 49160)
@@ -292,7 +292,8 @@
                BMLoop *ls[3];
                float *co[4];
                float *uv[4];
-               int i, lsel, len;
+               int i, j, lsel, len;
+               int is_mirror = FALSE;
 
                if (mirrored) {
                        poly = face_array + fi;
@@ -325,49 +326,52 @@
 
                tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, 
CD_MTEXPOLY);
 
+               /* determine if poly is mirrored */
+               if(mirrored)
+                       for (j = 0; j < poly->totloop; j++)
+                               if(orig_verts[loop_array[poly->loopstart + 
j].v] == ORIGINDEX_NONE) {
+                                       is_mirror = TRUE;
+                                       break;
+                               }
+
+
                if (len == 3 || len == 4) {
                        /* for quads let parametrize split, it can make better 
decisions
                         * about which split is best for unwrapping than 
scanfill */
                                BM_ITER_ELEM_INDEX (l, &liter, efa, 
BM_LOOPS_OF_FACE, i) {
                                        MLoopUV *luv;
                                        if (mirrored) {
-                                               int orig_index = 
orig_verts[loop_array[poly->loopstart + i].v];
+                                               int vert_index = 
loop_array[poly->loopstart + i].v;
+                                               int orig_index = 
orig_verts[vert_index];
 
-                                               BMLoop *tmpl;
-                                               BMIter liter2;
-                                               int itmp;
-                                               int is_mirror;
+                                               vkeys[i] = (ParamKey)vert_index;
+                                               co[i] = 
vert_array[vert_index].co;
 
-                                               for (itmp = 0; itmp < 
poly->totloop; itmp++)
-                                                       
if(orig_verts[loop_array[poly->loopstart + itmp].v] == ORIGINDEX_NONE)
-                                                               is_mirror = 
TRUE;
-
-                                               vkeys[i] = 
(ParamKey)loop_array[poly->loopstart + i].v;
-
                                                if(!is_mirror) {
                                                        luv = 
CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 
-                                                       co[i] = l->v->co;
                                                        uv[i] = luv->uv;
                                                        pin[i] = (luv->flag & 
MLOOPUV_PINNED) != 0;
                                                        select[i] = 
uvedit_uv_select_test(em, scene, l) != 0;
                                                } else {
                                                        if (orig_index != 
ORIGINDEX_NONE) {
-                                                               
BM_ITER_ELEM_INDEX (tmpl, &liter2, efa, BM_LOOPS_OF_FACE, itmp)
+                                                               BMLoop *tmpl;
+                                                               BMIter liter2;
+
+                                                               BM_ITER_ELEM 
(tmpl, &liter2, efa, BM_LOOPS_OF_FACE) {
                                                                        if 
(BM_elem_index_get(tmpl->v) == orig_index)
                                                                                
break;
+                                                               }
 
                                                                luv = 
CustomData_bmesh_get(&em->bm->ldata, tmpl->head.data, CD_MLOOPUV);
 
-                                                               co[i] = 
tmpl->v->co;
-                                                               uv[i] = luv->uv;
+                                                               uv[i] = NULL;
                                                                pin[i] = 
(luv->flag & MLOOPUV_PINNED) != 0;
                                                                select[i] = 
uvedit_uv_select_test(em, scene, tmpl) != 0;
                                                        } else {
-                                                               co[i] = 
vert_array[loop_array[poly->loopstart + i].v].co;
                                                                uv[i] = NULL;
                                                                pin[i] = FALSE;
-                                                               select[i] = 
FALSE;
+                                                               select[i] = 
TRUE;
                                                        }
                                                }
                                        } else {
@@ -386,47 +390,116 @@
                else {
                        /* ngon - scanfill time! */
                        BLI_scanfill_begin(&sf_ctx);
-                       
-                       sf_vert_first = sf_vert_last = NULL;
-                       BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
-                               int i;
-                               
-                               sf_vert = BLI_scanfill_vert_add(&sf_ctx, 
l->v->co);
-                               
-                               /* add small random offset */
-                               for (i = 0; i < 3; i++) {
-                                       sf_vert->co[i] += (BLI_frand() - 0.5f) 
* FLT_EPSILON * 50;
-                               }
-                               
-                               sf_vert->tmp.p = l;
 
-                               if (sf_vert_last) {
-                                       BLI_scanfill_edge_add(&sf_ctx, 
sf_vert_last, sf_vert);
+                       if (mirrored) {
+                               sf_vert_first = sf_vert_last = NULL;
+                               BM_ITER_ELEM_INDEX (l, &liter, efa, 
BM_LOOPS_OF_FACE, j) {
+                                       int i;
+                                       int vert_index = 
loop_array[poly->loopstart + j].v;
+
+                                       sf_vert = 
BLI_scanfill_vert_add(&sf_ctx, vert_array[vert_index].co);
+
+                                       /* add small random offset */
+                                       for (i = 0; i < 3; i++) {
+                                               sf_vert->co[i] += (BLI_frand() 
- 0.5f) * FLT_EPSILON * 50;
+                                       }
+
+                                       sf_vert->tmp.u = vert_index;
+
+                                       if (sf_vert_last) {
+                                               BLI_scanfill_edge_add(&sf_ctx, 
sf_vert_last, sf_vert);
+                                       }
+
+                                       sf_vert_last = sf_vert;
+                                       if (!sf_vert_first)
+                                               sf_vert_first = sf_vert;
                                }
 
-                               sf_vert_last = sf_vert;
-                               if (!sf_vert_first)
-                                       sf_vert_first = sf_vert;
-                       }
+                               BLI_scanfill_edge_add(&sf_ctx, sf_vert_first, 
sf_vert);
 
-                       BLI_scanfill_edge_add(&sf_ctx, sf_vert_first, sf_vert);
+                               BLI_scanfill_calc_ex(&sf_ctx, TRUE, efa->no);
+                               for (sf_tri = sf_ctx.fillfacebase.first; 
sf_tri; sf_tri = sf_tri->next) {
+                                       int tri_indices[3];
 
-                       BLI_scanfill_calc_ex(&sf_ctx, TRUE, efa->no);
-                       for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri 
= sf_tri->next) {
-                               ls[0] = sf_tri->v1->tmp.p;
-                               ls[1] = sf_tri->v2->tmp.p;
-                               ls[2] = sf_tri->v3->tmp.p;
+                                       tri_indices[0] = sf_tri->v1->tmp.u;
+                                       tri_indices[1] = sf_tri->v2->tmp.u;
+                                       tri_indices[2] = sf_tri->v3->tmp.u;
 
-                               for (i = 0; i < 3; i++) {
-                                       MLoopUV *luv = 
CustomData_bmesh_get(&em->bm->ldata, ls[i]->head.data, CD_MLOOPUV);
-                                       vkeys[i] = 
(ParamKey)BM_elem_index_get(ls[i]->v);
-                                       co[i] = ls[i]->v->co;
-                                       uv[i] = luv->uv;
-                                       pin[i] = (luv->flag & MLOOPUV_PINNED) 
!= 0;
-                                       select[i] = uvedit_uv_select_test(em, 
scene, ls[i]) != 0;
+                                       for (i = 0; i < 3; i++) {
+                                               MLoopUV *luv;
+                                               int vert_index = tri_indices[i];
+                                               int orig_index = 
orig_verts[vert_index];
+
+                                               vkeys[i] = (ParamKey)vert_index;
+                                               co[i] = 
vert_array[vert_index].co;
+
+                                               if (is_mirror && orig_index == 
ORIGINDEX_NONE) {
+                                                       uv[i] = NULL;
+                                                       pin[i] = FALSE;
+                                                       select[i] = TRUE;
+                                               } else {
+                                                       BMLoop *tmpl;
+                                                       BMIter liter2;
+
+                                                       BM_ITER_ELEM (tmpl, 
&liter2, efa, BM_LOOPS_OF_FACE) {
+                                                               if 
(BM_elem_index_get(tmpl->v) == orig_index)
+                                                                       break;
+                                                       }
+
+                                                       luv = 
CustomData_bmesh_get(&em->bm->ldata, tmpl->head.data, CD_MLOOPUV);
+                                                       if(is_mirror)
+                                                               uv[i] = NULL;
+                                                       else
+                                                               uv[i] = luv->uv;
+                                                       pin[i] = (luv->flag & 
MLOOPUV_PINNED) != 0;
+                                                       select[i] = 
uvedit_uv_select_test(em, scene, tmpl) != 0;
+                                               }
+                                       }
+
+                                       param_face_add(handle, key, 3, vkeys, 
co, uv, pin, select, &tf->unwrap);
                                }
+                       } else {
+                               sf_vert_first = sf_vert_last = NULL;
+                               BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) 
{
+                                       int i;
 
-                               param_face_add(handle, key, 3, vkeys, co, uv, 
pin, select, &tf->unwrap);
+                                       sf_vert = 
BLI_scanfill_vert_add(&sf_ctx, l->v->co);
+
+                                       /* add small random offset */
+                                       for (i = 0; i < 3; i++) {
+                                               sf_vert->co[i] += (BLI_frand() 
- 0.5f) * FLT_EPSILON * 50;
+                                       }
+
+                                       sf_vert->tmp.p = l;
+                                       
+                                       if (sf_vert_last) {
+                                               BLI_scanfill_edge_add(&sf_ctx, 
sf_vert_last, sf_vert);
+                                       }
+                                       
+                                       sf_vert_last = sf_vert;
+                                       if (!sf_vert_first)
+                                               sf_vert_first = sf_vert;
+                               }
+                               
+                               BLI_scanfill_edge_add(&sf_ctx, sf_vert_first, 
sf_vert);
+                               
+                               BLI_scanfill_calc_ex(&sf_ctx, TRUE, efa->no);
+                               for (sf_tri = sf_ctx.fillfacebase.first; 
sf_tri; sf_tri = sf_tri->next) {
+                                       ls[0] = sf_tri->v1->tmp.p;
+                                       ls[1] = sf_tri->v2->tmp.p;
+                                       ls[2] = sf_tri->v3->tmp.p;
+                                       
+                                       for (i = 0; i < 3; i++) {
+                                               MLoopUV *luv = 
CustomData_bmesh_get(&em->bm->ldata, ls[i]->head.data, CD_MLOOPUV);
+                                               vkeys[i] = 
(ParamKey)BM_elem_index_get(ls[i]->v);
+                                               co[i] = ls[i]->v->co;
+                                               uv[i] = luv->uv;
+                                               pin[i] = (luv->flag & 
MLOOPUV_PINNED) != 0;
+                                               select[i] = 
uvedit_uv_select_test(em, scene, ls[i]) != 0;
+                                       }
+                                       
+                                       param_face_add(handle, key, 3, vkeys, 
co, uv, pin, select, &tf->unwrap);
+                               }
                        }
 
                        BLI_scanfill_end(&sf_ctx);
@@ -475,7 +548,7 @@
 
        *uv = NULL;
        *pin = 0;
-       *select = 1;
+       *select = TRUE;
 
        if (index == ORIGINDEX_NONE)
                return;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to