Revision: 18604
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18604
Author:   joeedh
Date:     2009-01-21 11:11:01 +0100 (Wed, 21 Jan 2009)

Log Message:
-----------
conversion code now uses triangulator for fgonafication of ngons.  also 
implemented a collapse vert operator (execute it with jkey).  note to Briggs: 
BM_Collapse_Disk wasn't quite finished. . .I got it to mostly work, but it 
still needs work (and the way I had it handle 2- and 3-valence verts may be 
wrong).  Also it can make 2-edged faces in certain situations.  Need to work 
through the code some more.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c

Removed Paths:
-------------
    branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-01-21 08:15:48 UTC 
(rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-01-21 10:11:01 UTC 
(rev 18604)
@@ -191,6 +191,7 @@
 struct BMVert *BM_Split_Edge(struct BMesh *bm, struct BMVert *v, struct BMEdge 
*e, struct BMEdge **ne, float percent, int calcnorm);
 struct BMVert  *BM_Split_Edge_Multi(struct BMesh *bm, struct BMEdge *e, int 
numcuts);
 BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf);
+void BM_Dissolve_Disk(BMesh *bm, BMVert *v);
 
 /*Interpolation*/
 void BM_Data_Interp_From_Verts(struct BMesh *bm, struct BMVert *v1, struct 
BMVert *v2, struct BMVert *v, float fac);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h       
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h       
2009-01-21 10:11:01 UTC (rev 18604)
@@ -141,8 +141,8 @@
 #define BMOP_TRIANGULATE               6
 
 #define BMOP_TRIANG_FACEIN             0
-#define BMOP_NEW_EDGES                 1
-#define BMOP_NEW_FACES                 2
+#define BMOP_TRIANG_NEW_EDGES  1
+#define BMOP_TRIANG_NEW_FACES  2
 #define BMOP_TRIANG_TOTSLOT            3
 
 /*dissolve faces*/
@@ -151,8 +151,17 @@
 #define BMOP_DISFACES_FACEIN   0
 #define BMOP_DISFACES_TOTSLOT  1
 
+/*dissolve verts*/
+#define BMOP_DISSOLVE_VERTS            8
+
+#define BMOP_DISVERTS_VERTIN   0
+#define BMOP_DISVERTS_TOTSLOT  1
+
+#define BMOP_MAKE_FGONS                        9
+#define BMOP_MAKE_FGONS_TOTSLOT        0
+
 /*keep this updated!*/
-#define BMOP_TOTAL_OPS                 8
+#define BMOP_TOTAL_OPS                 10
 /*-------------------------------end operator 
defines-------------------------------*/
 
 extern BMOpDefine *opdefines[];

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c     
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c     
2009-01-21 10:11:01 UTC (rev 18604)
@@ -40,9 +40,10 @@
  *     1 for success, 0 for failure.
  */
 
-void BM_Dissolve_Disk(BMesh *bm, BMVert *v){
+void BM_Dissolve_Disk(BMesh *bm, BMVert *v) {
        BMFace *f, *f2;
        BMEdge *e, *keepedge=NULL, *baseedge=NULL;
+       BMLoop *loop;
        int done, len;
 
        if(BM_Nonmanifold_Vert(bm, v)) return;
@@ -50,6 +51,7 @@
        if(v->edge){
                /*v->edge we keep, what else?*/
                e = v->edge;
+               len = 0;
                do{
                        e = bmesh_disk_nextedge(e,v);
                        if(!(BM_Edge_Share_Faces(e, v->edge))){
@@ -57,9 +59,30 @@
                                baseedge = v->edge;
                                break;
                        }
+                       len++;
                }while(e != v->edge);
        }
        
+       /*this code for handling 2 and 3-valence verts
+         may be totally bad.*/
+       if (keepedge == NULL && len == 3) {
+               /*handle specific case for three-valence.  solve it by
+                 increasing valence to four.  this may be hackish. . .*/
+               loop = e->loop;
+               if (loop->v == v) loop = (BMLoop*) loop->head.next;
+               BM_Split_Face(bm, loop->f, v, loop->v, NULL, NULL, 0);
+
+               BM_Dissolve_Disk(bm, v);
+               return;
+       } else if (keepedge == NULL && len == 2) {
+               /*handle two-valence*/
+               f = v->edge->loop->f;
+               f2 = ((BMLoop*)v->edge->loop->radial.next->data)->f;
+               /*collapse the vertex*/
+               BM_Collapse_Vert(bm, v->edge, v, 1.0, 0);
+               BM_Join_Faces(bm, f, f2, NULL, 0, 0);
+       }
+
        if(keepedge){
                done = 0;
                while(!done){
@@ -74,14 +97,18 @@
                                        done = 0;
                                        break;
                                }
+                               e = bmesh_disk_nextedge(e, v);
                        }while(e != v->edge);
                }
 
                /*get remaining two faces*/
                f = v->edge->loop->f;
-               f2 = ((BMLoop*)f->loopbase->radial.next->data)->f;
+               f2 = ((BMLoop*)v->edge->loop->radial.next->data)->f;
                /*collapse the vertex*/
                BM_Collapse_Vert(bm, baseedge, v, 1.0, 0);
+
+               /*join two remaining faces*/
+               BM_Join_Faces(bm, f, f2, NULL, 0, 0);
        }
 }
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c        
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c        
2009-01-21 10:11:01 UTC (rev 18604)
@@ -3,6 +3,20 @@
 
 #include <stdio.h>
 
+BMOpDefine def_makefgonsop = {
+       {0},
+       bmesh_make_fgons_exec,
+       BMOP_MAKE_FGONS_TOTSLOT,
+       0
+};
+
+BMOpDefine def_dissolvevertsop = {
+       {BMOP_OPSLOT_PNT_BUF},
+       dissolveverts_exec,
+       BMOP_DISVERTS_TOTSLOT,
+       0
+};
+
 BMOpDefine def_dissolvefacesop = {
        {BMOP_OPSLOT_PNT_BUF},
        dissolvefaces_exec,
@@ -70,6 +84,8 @@
        &def_subdop,
        &def_triangop,
        &def_dissolvefacesop,
+       &def_dissolvevertsop,
+       &def_makefgonsop,
 };
 
 int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*));

Modified: 
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- 
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h    
    2009-01-21 08:15:48 UTC (rev 18603)
+++ 
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h    
    2009-01-21 10:11:01 UTC (rev 18604)
@@ -15,5 +15,7 @@
 void bmesh2edit_exec(BMesh *bmesh, BMOperator *op);
 void triangulate_exec(BMesh *bmesh, BMOperator *op);
 void dissolvefaces_exec(BMesh *bmesh, BMOperator *op);
+void dissolveverts_exec(BMesh *bmesh, BMOperator *op);
+void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op);
 
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c  
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c  
2009-01-21 10:11:01 UTC (rev 18604)
@@ -431,7 +431,7 @@
                                return 1;
                        }
                        l = (BMLoop*)(l->radial.next->data);
-               }while(l != f->loopbase);
+               }while(l != e1->loop);
        }
        return 0;
 }

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c      
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c      
2009-01-21 10:11:01 UTC (rev 18604)
@@ -224,6 +224,9 @@
                bmeshface_to_editface(bm, em, f, evlist, numCol, numTex);
                        
        MEM_freeN(evlist);
+
+       EM_fgon_flags(em);
+
        return em;
 }
 
@@ -232,15 +235,52 @@
        BMO_Set_Pnt(op, BMOP_TO_EDITMESH_EMOUT, 
bmesh_to_editmesh_intern(bmesh));
 }
 
+#define FACE_NGON      1
+
+void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op)
+{
+       BMOperator triop;
+       BMFace *face;
+       BMIter iter;
+       BMEdge *edge;
+       BMOpSlot *eout;
+       int i;
+
+       BMO_Init_Op(&triop, BMOP_TRIANGULATE);
+       
+       /*HACK: I don't know if this'll conflict with other flags at all!*/
+       for (face = BMIter_New(&iter, bmesh, BM_FACES, NULL); face; 
face=BMIter_Step(&iter)) {
+               if (face->len > 4) {
+                       BMO_SetFlag(bmesh, face, FACE_NGON);
+               }
+       }
+
+       BMO_Flag_To_Slot(bmesh, &triop, BMOP_TRIANG_FACEIN, FACE_NGON, BM_FACE);
+       BMO_Exec_Op(bmesh, &triop);
+
+       eout = BMO_GetSlot(&triop, BMOP_TRIANG_NEW_EDGES);
+       for (i=0; i<eout->len; i++) {
+               edge = ((BMEdge**)eout->data.buf)[i];
+               edge->head.flag |= BM_FGON;
+       }
+
+       BMO_Finish_Op(bmesh, &triop);
+}
+
 EditMesh *bmesh_to_editmesh(BMesh *bmesh)
 {
-       BMOperator conv;
+       BMOperator conv, makefgon;
        EditMesh *em;
+       
+       /*first fgon-afy the mesh*/
+       BMO_Init_Op(&makefgon, BMOP_MAKE_FGONS);
+       BMO_Exec_Op(bmesh, &makefgon);
+       BMO_Finish_Op(bmesh, &makefgon);
 
        BMO_Init_Op(&conv, BMOP_TO_EDITMESH);
        BMO_Exec_Op(bmesh, &conv);
        em = conv.slots[BMOP_TO_EDITMESH_EMOUT].data.p;
        BMO_Finish_Op(bmesh, &conv);
-
+       
        return em;
 }
\ No newline at end of file

Deleted: branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c     
2009-01-21 08:15:48 UTC (rev 18603)
+++ branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c     
2009-01-21 10:11:01 UTC (rev 18604)
@@ -1,26 +0,0 @@
-#include "MEM_guardedalloc.h"
-
-#include "BKE_utildefines.h"
-
-#include "bmesh.h"
-#include "bmesh_private.h"
-#include "BLI_arithb.h"
-
-#include <stdio.h>
-
-#define FACE_MARK      1
-void dissolvefaces_exec(BMesh *bmesh, BMOperator *op)
-{
-       BMOpSlot *finput;
-       BMFace *face;
-       float projectverts[400][3];
-       void *projverts;
-       int i, count = 0;
-       
-       BMO_Flag_Buffer(bmesh, op, BMOP_DISFACES_FACEIN, FACE_MARK);
-
-       /*TODO: need to discuss with Briggs how best to implement this, seems 
this would be
-         a great time to use the walker api, get it up to snuff.  perhaps have 
a walker
-         that goes over inner vertices of a contiguously-flagged region?  then 
you
-         could just use dissolve disk on them.*/
-}
\ No newline at end of file

Copied: branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c 
(from rev 18602, 
branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c)
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c         
                (rev 0)
+++ branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c 
2009-01-21 10:11:01 UTC (rev 18604)
@@ -0,0 +1,50 @@
+#include "MEM_guardedalloc.h"
+
+#include "BKE_utildefines.h"
+
+#include "bmesh.h"
+#include "bmesh_private.h"
+#include "BLI_arithb.h"
+
+#include <stdio.h>
+
+#define FACE_MARK      1
+void dissolvefaces_exec(BMesh *bmesh, BMOperator *op)
+{
+       BMOpSlot *finput;
+       BMFace *face;
+       float projectverts[400][3];
+       void *projverts;
+       int i, count = 0;
+       
+       BMO_Flag_Buffer(bmesh, op, BMOP_DISFACES_FACEIN, FACE_MARK);
+
+       /*TODO: need to discuss with Briggs how best to implement this, seems 
this would be
+         a great time to use the walker api, get it up to snuff.  perhaps have 
a walker
+         that goes over inner vertices of a contiguously-flagged region?  then 
you
+         could just use dissolve disk on them.*/
+}
+
+void dissolveverts_exec(BMesh *bmesh, BMOperator *op)
+{
+       BMOpSlot *vinput;
+       BMVert *vert;
+       int i;
+       
+       vinput = BMO_GetSlot(op, BMOP_DISVERTS_VERTIN);
+
+       /*
+       BMO_Flag_Buffer(bmesh, op, BMOP_DISVERTS_VERTIN, VERT_MARK);
+
+       for (vert=BMIter_New(&iter, bmesh, BM_VERTS, NULL); vert; 
vert=BMIter_Step(&iter)) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to