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