[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18256] branches/bmesh/bmesh: made walker api compile, though I'm sure it doesn' t work and needs a good read-through.
Joseph Eagar
joeedh at gmail.com
Fri Jan 2 11:36:41 CET 2009
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. @@
More information about the Bf-blender-cvs
mailing list