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

Log Message:
-----------
made walker api compile, though I'm sure it doesn't work and needs a good 
read-through.  also made conversion code compile, though I think it may be 
missing some customdata stuff.  note, this may not actually link.

Modified Paths:
--------------
    branches/bmesh/bmesh/SConscript
    branches/bmesh/bmesh/bmesh.h
    branches/bmesh/bmesh/bmesh_marking.h
    branches/bmesh/bmesh/bmesh_walkers.h
    branches/bmesh/bmesh/intern/bmesh_operators.c
    branches/bmesh/bmesh/intern/bmesh_walkers.c

Added Paths:
-----------
    branches/bmesh/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/bmesh/intern/editmesh_to_bmesh.c

Modified: branches/bmesh/bmesh/SConscript
===================================================================
--- branches/bmesh/bmesh/SConscript     2009-01-02 10:19:58 UTC (rev 18255)
+++ branches/bmesh/bmesh/SConscript     2009-01-02 10:36:41 UTC (rev 18256)
@@ -21,7 +21,7 @@
 
 
 sources = env.Glob('intern/*.c')
-sources = env.Glob('operators/*.c')
+sources += env.Glob('operators/*.c')
 
 #sources += env.Glob('tools/*.c')
 
@@ -29,6 +29,7 @@
 incs.append('../blenlib') 
 incs.append('../makesdna')
 incs.append('../blenkernel')
+incs.append('../include')
 incs.append('./')
 incs.append('./intern')
 

Modified: branches/bmesh/bmesh/bmesh.h
===================================================================
--- branches/bmesh/bmesh/bmesh.h        2009-01-02 10:19:58 UTC (rev 18255)
+++ branches/bmesh/bmesh/bmesh.h        2009-01-02 10:36:41 UTC (rev 18256)
@@ -58,7 +58,16 @@
        struct BMFlagLayer *flags;
 */
 
-/*Defines for BMHeader->type*/
+/*auxillery bmesh flags.  note, these should
+  become internal to the api eventually.*/
+//start at 17th flag
+#define BM_SEAM                (1<<16)
+#define BM_FGON                (1<<17)
+#define BM_HIDDEN      (1<<18)
+#define BM_SHARP       (1<<19)
+#define BM_SMOOTH      (1<<20)
+
+/* Defines for BMHeader->type*/
 #define BMESH_VERT                                     1
 #define BMESH_EDGE                                     2
 #define BMESH_FACE                                     4
@@ -133,9 +142,9 @@
        int nextv, nexte, nextp, nextl;
        struct CustomData vdata, edata, pdata, ldata;
        int selectmode;
-       struct BLI_mempool *flagpool;                                           
                /*memory pool for dynamically allocated flag layers*/
-       int stackdepth;                                                         
                                /*current depth of operator stack*/
-       int totflags;                                                           
                                /*total number of tool flag layers*/
+       struct BLI_mempool *flagpool;     /*memory pool for dynamically 
allocated flag layers*/
+       int stackdepth;                   /*current depth of operator stack*/
+       int totflags, walkers;            /*total number of tool flag layers*/
 }BMesh;
 
 typedef struct BMVert

Modified: branches/bmesh/bmesh/bmesh_marking.h
===================================================================
--- branches/bmesh/bmesh/bmesh_marking.h        2009-01-02 10:19:58 UTC (rev 
18255)
+++ branches/bmesh/bmesh/bmesh_marking.h        2009-01-02 10:36:41 UTC (rev 
18256)
@@ -9,35 +9,4 @@
 
 void BM_Select(struct BMesh *bm, void *element, int select);
 
-
-/* NOTE: unused, bad: 
-
-  simple system to manipulate flags, coded here
-  to avoid having to spend excess time refactoring
-  customdata.*/
-enum {
-       BM_SELECT,
-       BM_SMOOTH,
-} BM_CommonMarks;
-
-enum {
-       BM_VNUMMARKS
-} BM_VertMarks;
-
-enum {
-       BM_FGON,
-       BM_SHARP,
-       BM_SEAM,
-       BM_ENUMMARKS
-} BM_EdgeMarks;
-
-enum {
-       BM_MATERIAL,
-       BM_FNUMMARKS
-} BM_FaceMarks;
-
-/*returns if the specifid flag is equal in both elements
-  (which much be BMHeader-derived structs of the same type).*/
-int BM_FlagEqual(void *element1, void *element2, int type);
-
 #endif

Modified: branches/bmesh/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/bmesh/bmesh_walkers.h        2009-01-02 10:19:58 UTC (rev 
18255)
+++ branches/bmesh/bmesh/bmesh_walkers.h        2009-01-02 10:36:41 UTC (rev 
18256)
@@ -10,15 +10,17 @@
        void *(*yield)(struct BMWalker *walker);
        void   (*step) (struct BMWalker *walker);
        int visitedmask;
+       int restrictflag;
 }BMWalker;
 
 void BMWalker_Init(struct BMWalker *walker, BMesh *bm, int type, int 
searchmask);
 void *BMWalker_Step(struct BMWalker *walker);
 void BMWalker_End(struct BMWalker *walker);
 
-#define BMESH_SHELLWALKER      1
-#define BMESH_LOOPWALKER       2
-#define BMESH_RINGWALKER       3
-#define BMESH_UVISLANDS                4
+#define BMESH_SHELLWALKER      0
+#define BMESH_LOOPWALKER       1
+#define BMESH_RINGWALKER       2
+#define BMESH_UVISLANDS                3
+#define BMESH_MAXWALKERS       4
 
 #endif
\ No newline at end of file

Modified: branches/bmesh/bmesh/intern/bmesh_operators.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_operators.c       2009-01-02 10:19:58 UTC 
(rev 18255)
+++ branches/bmesh/bmesh/intern/bmesh_operators.c       2009-01-02 10:36:41 UTC 
(rev 18256)
@@ -45,7 +45,6 @@
 void BMO_push(BMesh *bm, BMOperator *op)
 {
        bm->stackdepth++;
-       bm->currentop = op;
 
        /*add flag layer, if appropriate*/
        if(bm->stackdepth > 1)

Added: branches/bmesh/bmesh/intern/bmesh_to_editmesh.c
===================================================================
--- branches/bmesh/bmesh/intern/bmesh_to_editmesh.c                             
(rev 0)
+++ branches/bmesh/bmesh/intern/bmesh_to_editmesh.c     2009-01-02 10:36:41 UTC 
(rev 18256)
@@ -0,0 +1,223 @@
+#include "MEM_guardedalloc.h"
+#include "BKE_customdata.h" 
+#include "DNA_listBase.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include <string.h>
+#include "BKE_utildefines.h"
+#include "BKE_mesh.h"
+#include "BKE_global.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
+#include "BLI_editVert.h"
+#include "BIF_editmesh.h"
+#include "editmesh.h"
+#include "BLI_blenlib.h"
+#include "BLI_edgehash.h"
+
+#include "bmesh.h"
+
+/*
+ * BMESH TO EDITMESH
+ *
+ * This file contains functions for converting 
+ * from a bmesh to an editmesh
+ *
+*/
+
+/*
+ * LOOPS TO EDITMESH CORNERS
+ *
+ * Converts N-Gon loop (face-edge)
+ * data (UVs, Verts Colors, ect) to
+ * face corner data.
+ *
+*/
+
+static void loops_to_editmesh_corners(BMesh *bm, CustomData *facedata, void 
*face_block, BMFace *f,int numCol, int numTex){
+       int i, j;
+       BMLoop *l;
+       MTFace *texface;
+       MTexPoly *texpoly;
+       MCol *mcol;
+       MLoopCol *mloopcol;
+       MLoopUV *mloopuv;
+
+       for(i=0; i < numTex; i++){
+               texface = CustomData_em_get_n(facedata, face_block, CD_MTFACE, 
i);
+               texpoly = CustomData_bmesh_get_n(&bm->pdata, f->data, 
CD_MTEXPOLY, i);
+               
+               texface->tpage = texpoly->tpage;
+               texface->flag = texpoly->flag;
+               texface->transp = texpoly->transp;
+               texface->mode = texpoly->mode;
+               texface->tile = texpoly->tile;
+               texface->unwrap = texpoly->unwrap;
+
+               j = 0;
+               l = f->loopbase;
+               do{
+                       mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->data, 
CD_MLOOPUV, i);
+                       texface->uv[j][0] = mloopuv->uv[0];
+                       texface->uv[j][1] = mloopuv->uv[1];
+                       j++;
+                       l = ((BMLoop*)(l->head.next));
+               }while(l!=f->loopbase);
+
+       }
+       for(i=0; i < numCol; i++){
+               mcol = CustomData_em_get_n(facedata, face_block, CD_MCOL, i);
+               j = 0;
+               l = f->loopbase;
+               do{
+                       mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->data, 
CD_MLOOPCOL, i);
+                       mcol[j].r = mloopcol->r;
+                       mcol[j].g = mloopcol->g;
+                       mcol[j].b = mloopcol->b;
+                       mcol[j].a = mloopcol->a;
+                       j++;
+                       l = ((BMLoop*)(l->head.next));
+               }while(l!=f->loopbase);
+       }
+}
+
+static EditVert *bmeshvert_to_editvert(BMesh *bm, EditMesh *em, BMVert *v, int 
index, EditVert **evlist)
+{
+       EditVert *eve = NULL;
+
+       v->head.eflag1 = index; /*abuse!*/
+       eve = addvertlist(v->co,NULL);
+       eve->keyindex = index;
+       evlist[index]= eve;
+       if(BM_Is_Selected(&(v->head), BMESH_SELECT)) eve->f |= SELECT;
+       if(v->head.flag & BMESH_HIDDEN) eve->h = 1;
+       eve->bweight = v->bweight;
+       CustomData_em_copy_data(&bm->vdata, &em->vdata, v->data, &eve->data);
+       /*copy normal*/
+       eve->no[0] = v->no[0];
+       eve->no[1] = v->no[1];
+       eve->no[2] = v->no[2];
+
+       return eve;
+}
+
+static void bmeshedge_to_editedge_internal(BMesh *bm, EditMesh *em, BMEdge *e, 
EditEdge *eed)
+{
+       eed->crease = e->crease;
+       eed->bweight = e->bweight;
+       
+       //copy relavent flags
+       eed->f = e->head.flag & 65535;
+       if (e->head.flag & BM_SEAM) eed->seam = 1;
+       if (e->head.flag & BM_SHARP) eed->sharp = 1;
+       if (e->head.flag & BM_HIDDEN) eed->h = 1;
+       if (e->head.flag & BM_FGON) eed->h |= EM_FGON;
+       
+       CustomData_em_copy_data(&bm->edata, &em->edata, e->data, &eed->data);
+}
+
+static EditEdge *bmeshedge_to_editedge(BMesh *bm, EditMesh *em, BMEdge *e, 
EditVert **evlist)
+{
+       EditEdge *eed = NULL;
+
+       if(!(findedgelist(evlist[e->v1->head.eflag1], 
evlist[e->v2->head.eflag1]))){
+               eed= addedgelist(evlist[e->v1->head.eflag1], 
evlist[e->v2->head.eflag1], NULL);
+               bmeshedge_to_editedge_internal(bm, em, e, eed);
+       }
+
+       return eed;
+}
+
+static EditFace *bmeshface_to_editface(BMesh *bm, EditMesh *em, BMFace *f, 
EditVert **evlist, int numCol, int numTex)
+{
+       EditVert *eve1, *eve2, *eve3, *eve4;
+       EditFace *efa = NULL;
+       int len;
+       
+       len = f->len;
+       if (len==3 || len==4) {
+               eve1= evlist[f->loopbase->v->head.eflag1];
+               eve2= 
evlist[((BMLoop*)(f->loopbase->head.next))->v->head.eflag1];
+               eve3= 
evlist[((BMLoop*)(f->loopbase->head.next->next))->v->head.eflag1];
+               if (len == 4) {
+                       eve4= evlist[ 
((BMLoop*)(f->loopbase->head.prev))->v->head.eflag1];
+               }
+               else {
+                       eve4= NULL;
+               }
+
+               efa = addfacelist(eve1, eve2, eve3, eve4, NULL, NULL);
+       
+               bmeshedge_to_editedge_internal(bm, em, f->loopbase->e, efa->e1);
+               bmeshedge_to_editedge_internal(bm, em, 
((BMLoop*)(f->loopbase->head.next))->e, efa->e2);
+               bmeshedge_to_editedge_internal(bm, em, 
((BMLoop*)(f->loopbase->head.next->next))->e, efa->e3);
+               if(eve4)
+                       bmeshedge_to_editedge_internal(bm, em, 
((BMLoop*)(f->loopbase->head.prev))->e, efa->e4);
+
+               efa->mat_nr = (unsigned char)f->mat_nr;
+
+
+               /*Copy normal*/
+               efa->n[0] = f->no[0];
+               efa->n[1] = f->no[1];
+               efa->n[2] = f->no[2];
+               
+               //copy relavent original flags
+               efa->f = f->head.flag & 255;
+               if (f->head.flag & BM_HIDDEN) efa->h = 1;
+               if (f->head.flag * BM_SMOOTH) efa->flag |= ME_SMOOTH;
+
+               CustomData_em_copy_data(&bm->pdata, &em->fdata, f->data, 
&efa->data);
+       }
+       loops_to_editmesh_corners(bm, &em->fdata, efa->data, f, numCol,numTex);
+       return efa;
+}
+
+EditMesh *bmesh_to_editmesh(BMesh *bm) 
+{
+       BMVert *v;
+       BMEdge *e;
+       BMFace *f;
+
+       BMIter verts;
+       BMIter edges;
+       BMIter faces;
+
+       EditMesh *em;
+       EditVert *eve, **evlist;
+       EditFace *efa;
+
+       int totvert, i, numTex, numCol;
+
+       em = G.editMesh;
+
+       if (em == NULL) return NULL; //what?
+       em->act_face = NULL ;
+
+       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);
+       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);
+
+       totvert = BM_Count_Element(bm, BMESH_VERT);
+       evlist= MEM_mallocN(totvert*sizeof(EditVert *),"evlist");
+
+       /* make vertices */
+       for(i=0, v = BMIter_New(&verts, bm, BM_VERTS, bm); v; v = 
BMIter_Step(&verts), i++) 
+               eve = bmeshvert_to_editvert(bm, em, v, i, evlist);
+
+       /* make edges */
+       for(e = BMIter_New(&edges, bm, BM_EDGES, bm); e; e = 
BMIter_Step(&edges))

@@ 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