Revision: 21808
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21808
Author:   joeedh
Date:     2009-07-23 00:35:58 +0200 (Thu, 23 Jul 2009)

Log Message:
-----------
bmeshafied uv unwrapping ops.  for lcsm (unwrap), which only takes triangles, I 
used scanfill to tesselate ngons, which mostly works.  scanfill however doesn't 
always generate nice enough tesselations for lcsm to work properly; the 
solution is to write a version of beauty fill (which basically turns an 
arbritrary triangulation into a constrained delauney triangulation) for 
scanfill, and use it to clean up the tesselations.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c

Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c     
2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c     
2009-07-22 22:35:58 UTC (rev 21808)
@@ -44,6 +44,8 @@
 #include "BLI_scanfill.h"
 #include "BLI_callbacks.h"
 
+#include "BKE_utildefines.h"
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -778,13 +780,39 @@
 
        /* reset variables */
        eve= fillvertbase.first;
+       a = 0;
        while(eve) {
                eve->f= 0;
                eve->xs= 0;
                eve->h= 0;
                eve= eve->next;
+               a += 1;
        }
 
+       if (a == 3) {
+               eve = fillvertbase.first;
+
+               addfillface(eve, eve->next, eve->next->next, 0);
+               return 1;
+       } else if (a == 4) {
+               float vec1[3], vec2[3];
+
+               eve = fillvertbase.first;
+
+               /*use shortest diagonal for quad*/
+               VecSubf(vec1, eve->co, eve->next->next->co);
+               VecSubf(vec2, eve->next->co, eve->next->next->next->co);
+
+               if (INPR(vec1, vec1) < INPR(vec2, vec2)) {
+                       addfillface(eve, eve->next, eve->next->next, 0);
+                       addfillface(eve->next->next, eve->next->next->next, 
eve, 0);
+               } else {
+                       addfillface(eve->next, eve->next->next, 
eve->next->next->next, 0);
+                       addfillface(eve->next->next->next, eve, eve->next, 0);
+               }
+               return 1;
+       }
+
        /* first test vertices if they are in edges */
        /* including resetting of flags */
        eed= filledgebase.first;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c      
2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c      
2009-07-22 22:35:58 UTC (rev 21808)
@@ -197,15 +197,17 @@
        EditMesh *em;
        EditVert *eve, **evlist;
 
-       int totvert, i, numTex, numCol;
+       int totvert, i, numTex, numCol, flag;
 
        em = MEM_callocN(sizeof(EditMesh), "EditMesh from bmesh");
 
        em->selectmode = bm->selectmode;
 
-       CustomData_copy(&bm->vdata, &em->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
-       CustomData_copy(&bm->edata, &em->edata, CD_MASK_BMESH, CD_CALLOC, 0);
-       CustomData_copy(&bm->pdata, &em->fdata, CD_MASK_BMESH, CD_CALLOC, 0);
+       flag = CD_MASK_BMESH & ~CD_MASK_MTEXPOLY;
+
+       CustomData_copy(&bm->vdata, &em->vdata, flag, CD_CALLOC, 0);
+       CustomData_copy(&bm->edata, &em->edata, flag, CD_CALLOC, 0);
+       CustomData_copy(&bm->pdata, &em->fdata, flag, CD_CALLOC, 0);
        CustomData_from_bmeshpoly(&em->fdata, &bm->pdata, &bm->ldata,0);
        numTex = CustomData_number_of_layers(&bm->pdata, CD_MTEXPOLY);
        numCol = CustomData_number_of_layers(&bm->ldata, CD_MLOOPCOL);

Modified: 
branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c    
2009-07-22 22:12:55 UTC (rev 21807)
+++ branches/bmesh/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c    
2009-07-22 22:35:58 UTC (rev 21808)
@@ -46,10 +46,12 @@
 #include "BKE_global.h"
 #include "BKE_mesh.h"
 #include "BKE_utildefines.h"
+#include "BKE_tessmesh.h"
 
 #include "BLI_arithb.h"
 #include "BLI_edgehash.h"
 #include "BLI_editVert.h"
+#include "BLI_scanfill.h"
 
 #include "PIL_time.h"
 
@@ -72,20 +74,20 @@
 
 static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
 {
-       EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
-       EditFace *efa;
-       MTFace *tf;
+       BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+       BMFace *efa;
+       BMIter iter;
 
        if(ED_uvedit_test(obedit)) {
-               BKE_mesh_end_editmesh(obedit->data, em);
                return 1;
        }
 
-       if(em && em->faces.first)
-               EM_add_data_layer(em, &em->fdata, CD_MTFACE);
-       
+       if(em && em->bm->totface) {// && !CustomData_has_layer(&em->bm->pdata, 
CD_MTEXPOLY)) {
+               BM_add_data_layer(em->bm, &em->bm->pdata, CD_MTEXPOLY);
+               BM_add_data_layer(em->bm, &em->bm->ldata, CD_MLOOPUV);
+       }
+
        if(!ED_uvedit_test(obedit)) {
-               BKE_mesh_end_editmesh(obedit->data, em);
                return 0;
        }
        
@@ -94,34 +96,33 @@
        ED_uvedit_assign_image(scene, obedit, CTX_data_edit_image(C), NULL);
        
        /* select new UV's */
-       for(efa=em->faces.first; efa; efa=efa->next) {
-               tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-               uvedit_face_select(scene, efa, tf);
+       BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+               uvedit_face_select(scene, em, efa);
        }
 
-       BKE_mesh_end_editmesh(obedit->data, em);
        return 1;
 }
 
 /****************** Parametrizer Conversion ***************/
 
-ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short 
implicit, short fill, short sel, short correct_aspect)
+ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em, short 
implicit, short fill, short sel, short correct_aspect)
 {
-#if 0
        ParamHandle *handle;
-       EditFace *efa;
-       EditEdge *eed;
-       EditVert *ev;
-       MTFace *tf;
+       BMFace *efa;
+       BMLoop *l;
+       BMEdge *eed;
+       BMVert *ev;
+       BMIter iter, liter;
+       MTexPoly *tf;
        int a;
        
        handle = param_construct_begin();
 
        if(correct_aspect) {
-               efa = EM_get_actFace(em, 1);
+               efa = EDBM_get_actFace(em, 1);
 
                if(efa) {
-                       MTFace *tf= CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
+                       MTexPoly *tf= CustomData_bmesh_get(&em->bm->pdata, 
efa->head.data, CD_MTEXPOLY);
                        float aspx, aspy;
 
                        ED_image_uv_aspect(tf->tpage, &aspx, &aspy);
@@ -132,71 +133,101 @@
        }
        
        /* we need the vert indicies */
-       for(ev= em->verts.first, a=0; ev; ev= ev->next, a++)
-               ev->tmp.l = a;
+       a = 0;
+       BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+               BMINDEX_SET(ev, a);
+               a++;
+       }
        
-       for(efa= em->faces.first; efa; efa= efa->next) {
+       BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+               EditVert *v, *lastv, *firstv;
+               EditFace *sefa;
                ParamKey key, vkeys[4];
                ParamBool pin[4], select[4];
+               BMLoop *ls[3];
+               MLoopUV *luvs[3];
                float *co[4];
                float *uv[4];
-               int nverts;
+               int lsel;
                
-               if((efa->h) || (sel && (efa->f & SELECT)==0)) 
+               if((BM_TestHFlag(efa, BM_HIDDEN)) || (sel && BM_TestHFlag(efa, 
BM_SELECT)==0)) 
                        continue;
 
-               tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, 
CD_MTFACE);
-               
-               if(implicit &&
-                       !(      uvedit_uv_selected(scene, efa, tf, 0) ||
-                               uvedit_uv_selected(scene, efa, tf, 1) ||
-                               uvedit_uv_selected(scene, efa, tf, 2) ||
-                               (efa->v4 && uvedit_uv_selected(scene, efa, tf, 
3)) )
-               ) {
-                       continue;
+               tf= (MTexPoly *)CustomData_em_get(&em->bm->pdata, 
efa->head.data, CD_MTEXPOLY);
+               lsel = 0;
+
+               BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+                       if (uvedit_uv_selected(em, scene, l)) {
+                               lsel = 1;
+                               break;
+                       }
                }
 
+               if (implicit && !lsel)
+                       continue;
+
                key = (ParamKey)efa;
-               vkeys[0] = (ParamKey)efa->v1->tmp.l;
-               vkeys[1] = (ParamKey)efa->v2->tmp.l;
-               vkeys[2] = (ParamKey)efa->v3->tmp.l;
 
-               co[0] = efa->v1->co;
-               co[1] = efa->v2->co;
-               co[2] = efa->v3->co;
+               /*scanfill time!*/
+               firstv = lastv = NULL;
+               BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+                       v = BLI_addfillvert(l->v->co);
+                       
+                       v->tmp.p = l;
 
-               uv[0] = tf->uv[0];
-               uv[1] = tf->uv[1];
-               uv[2] = tf->uv[2];
+                       if (lastv) {
+                               BLI_addfilledge(lastv, v);
+                       }
 
-               pin[0] = ((tf->unwrap & TF_PIN1) != 0);
-               pin[1] = ((tf->unwrap & TF_PIN2) != 0);
-               pin[2] = ((tf->unwrap & TF_PIN3) != 0);
+                       lastv = v;
+                       if (!firstv) 
+                               firstv = v;
+               }
 
-               select[0] = ((uvedit_uv_selected(scene, efa, tf, 0)) != 0);
-               select[1] = ((uvedit_uv_selected(scene, efa, tf, 1)) != 0);
-               select[2] = ((uvedit_uv_selected(scene, efa, tf, 2)) != 0);
+               BLI_addfilledge(firstv, v);
+               
+               BLI_edgefill(0, 0);
+               for (sefa = fillfacebase.first; sefa; sefa=sefa->next) {
+                       ls[0] = sefa->v1->tmp.p;
+                       ls[1] = sefa->v2->tmp.p;
+                       ls[2] = sefa->v3->tmp.p;
+                       
+                       luvs[0] = CustomData_bmesh_get(&em->bm->ldata, 
ls[0]->head.data, CD_MLOOPUV);
+                       luvs[1] = CustomData_bmesh_get(&em->bm->ldata, 
ls[1]->head.data, CD_MLOOPUV);
+                       luvs[2] = CustomData_bmesh_get(&em->bm->ldata, 
ls[2]->head.data, CD_MLOOPUV);
 
-               if(efa->v4) {
-                       vkeys[3] = (ParamKey)efa->v4->tmp.l;
-                       co[3] = efa->v4->co;
-                       uv[3] = tf->uv[3];
-                       pin[3] = ((tf->unwrap & TF_PIN4) != 0);
-                       select[3] = (uvedit_uv_selected(scene, efa, tf, 3) != 
0);
-                       nverts = 4;
+                       vkeys[0] = (ParamKey)BMINDEX_GET(ls[0]->v);
+                       vkeys[1] = (ParamKey)BMINDEX_GET(ls[1]->v);
+                       vkeys[2] = (ParamKey)BMINDEX_GET(ls[2]->v);
+
+                       co[0] = ls[0]->v->co;
+                       co[1] = ls[1]->v->co;
+                       co[2] = ls[2]->v->co;
+
+                       uv[0] = luvs[0]->uv;
+                       uv[1] = luvs[1]->uv;
+                       uv[2] = luvs[2]->uv;
+
+                       pin[0] = (luvs[0]->flag & MLOOPUV_PINNED) != 0;
+                       pin[1] = (luvs[1]->flag & MLOOPUV_PINNED) != 0;
+                       pin[2] = (luvs[2]->flag & MLOOPUV_PINNED) != 0;
+
+                       select[0] = uvedit_uv_selected(em, scene, ls[0]) != 0;
+                       select[1] = uvedit_uv_selected(em, scene, ls[1]) != 0;
+                       select[2] = uvedit_uv_selected(em, scene, ls[2]) != 0;
+
+                       param_face_add(handle, key, 3, vkeys, co, uv, pin, 
select);
                }
-               else
-                       nverts = 3;
 
-               param_face_add(handle, key, nverts, vkeys, co, uv, pin, select);
+               BLI_end_edgefill();
        }
 
        if(!implicit) {
-               for(eed= em->edges.first; eed; eed= eed->next) {
-                       if(eed->seam) {
+               BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+                       if(BM_TestHFlag(eed, BM_SEAM)) {
                                ParamKey vkeys[2];
-                               vkeys[0] = (ParamKey)eed->v1->tmp.l;
-                               vkeys[1] = (ParamKey)eed->v2->tmp.l;
+                               vkeys[0] = (ParamKey)BMINDEX_GET(eed->v1);
+                               vkeys[1] = (ParamKey)BMINDEX_GET(eed->v2);
                                param_edge_set_seam(handle, vkeys);
                        }
                }
@@ -205,7 +236,6 @@
        param_construct_end(handle, fill, implicit);
 
        return handle;
-#endif
 }
 
 /* ******************** Minimize Stretch operator **************** */
@@ -213,7 +243,7 @@
 typedef struct MinStretch {
        Scene *scene;
        Object *obedit;
-       EditMesh *em;
+       BMEditMesh *em;
        ParamHandle *handle;
        float blend;
        double lasttime;
@@ -225,7 +255,7 @@
 {
        Scene *scene= CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
+       BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
        MinStretch *ms;
        int fill_holes= RNA_boolean_get(op->ptr, "fill_holes");
 
@@ -407,7 +437,7 @@
 {
        Scene *scene= CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
+       BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
        ParamHandle *handle;
 
        handle = construct_param_handle(scene, em, 1, 0, 1, 1);
@@ -418,7 +448,6 @@

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to