Revision: 30358 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30358 Author: joeedh Date: 2010-07-15 03:43:09 +0200 (Thu, 15 Jul 2010)
Log Message: ----------- forgot these Added Paths: ----------- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c Added: branches/bmesh/blender/source/blender/bmesh/bmesh_class.h =================================================================== --- branches/bmesh/blender/source/blender/bmesh/bmesh_class.h (rev 0) +++ branches/bmesh/blender/source/blender/bmesh/bmesh_class.h 2010-07-15 01:43:09 UTC (rev 30358) @@ -0,0 +1,264 @@ +#ifndef _BMESH_CLASS_H +#define _BMESH_CLASS_H + +#include "DNA_listBase.h" +#include "DNA_customdata_types.h" + +struct BMesh; +struct BMVert; +struct BMEdge; +struct BMLoop; +struct BMFace; +struct BMBaseVert; +struct BMBaseEdge; +struct BMBaseLoop; +struct BMBaseFace; +struct BMLayerType; +struct BMSubClassLayer; +struct BMFlagLayer; +struct BLI_mempool; + +/* +ok: we have a simple subclassing system, to layer in bmesh api features (and +let people subclass the api). There's also a separate, compile-time system +that will end up being the back-end to a "lite" bmesh API for modifiers. + +there are two seperate and distinct subtyping strategies here. one is with +macros and struct inheritence, and the other is more dynamic. this is because +of two competing motivations for subclassing: the ability to code faster, +less memory intensive BMTools that don't use adjacency info, and the ability +to hook into higher-level API functions for things like multires interpolation, +which needs much more then what is provided in the CustomData API. + +The first strategy is part of a plan to replace CDDM with a bmesh-like API +(which is much easier for me then rewriting array, mirror, in CDDM, which +would be a huge pain). +*/ + +/*note: it is very important for BMHeader to start with two + pointers. this is a requirement of mempool's method of + iteration. +*/ +typedef struct BMHeader { + void *data; /*customdata layers*/ + void *layerdata; /*dynamic subclass data, doesn't include BMTool and adjacency which use a static compile-time method */ + int eid; /*element id*/ + short type; /*element geometric type (verts/edges/loops/faces)*/ + short flag; /*this would be a CD layer, see below*/ + short eflag1, eflag2; + int sysflag, index; /*note: do *not* touch sysflag! and use BMINDEX_GET/SET macros for index*/ + struct BMFlagLayer *flags; +} BMHeader; + +/*note: need some way to specify custom locations for custom data layers. so we can +make them point directly into structs. and some way to make it only happen to the +active layer, and properly update when switching active layers.*/ + +/*alloc type a: smallest mesh possible*/ +#define BM_BASE_VHEAD\ + BMHeader head;\ + float co[3];\ + float no[3]; + +typedef struct BMBaseVert { + BM_BASE_VHEAD +} BMBaseVert; + +#define BM_BASE_EHEAD(vtype)\ + BMHeader head;\ + struct vtype *v1, *v2; + +typedef struct BMBaseEdge { + BM_BASE_EHEAD(BMBaseVert) +} BMBaseEdge; + +#define BM_BASE_LHEAD(vtype, etype, ltype)\ + BMHeader head;\ + struct vtype *v;\ + struct etype *e;\ + struct ltype *next, *prev; /*won't be able to use listbase API, ger, due to head*/\ + int _index; /*used for sorting during tesselation*/ + +typedef struct BMBaseLoop { + BM_BASE_LHEAD(BMBaseVert, BMBaseEdge, BMBaseLoop) +} BMBaseLoop; + +#define BM_BASE_LSTHEAD(listtype, looptype)\ + struct listtype *next, *prev;\ + struct looptype *first, *last; + +typedef struct BMBaseLoopList { + BM_BASE_LSTHEAD(BMBaseLoopList, BMBaseLoop) +} BMBaseLoopList; + +#define BM_BASE_FHEAD\ + BMHeader head;\ + int len; /*includes all boundary loops*/\ + int totbounds; /*total boundaries, is one plus the number of holes in the face*/\ + ListBase loops;\ + float no[3]; /*yes, we do store this here*/\ + short mat_nr; + +typedef struct BMBaseFace { + BM_BASE_FHEAD +} BMBaseFace; + +typedef struct BMFlagLayer { + short f, pflag; /*flags*/ + int index; /*generic index*/ +} BMFlagLayer; + +#define BM_ADJ_VHEAD(etype)\ + BM_BASE_VHEAD\ + struct etype *e; + +typedef struct BMVert { + BM_ADJ_VHEAD(BMEdge) +} BMVert; + +#define BM_ADJ_EHEAD(vtype, etype, ltype)\ + BM_BASE_EHEAD(vtype)\ + struct ltype *l;\ + /*disk cycle pointers*/\ + struct {\ + struct etype *next, *prev;\ + } dlink1;\ + struct {\ + struct etype *next, *prev;\ + } dlink2; + +typedef struct BMEdge { + BM_ADJ_EHEAD(BMVert, BMEdge, BMLoop) +} BMEdge; + +#define BM_ADJ_LHEAD(vtype, etype, ltype, ftype)\ + BM_BASE_LHEAD(vtype, etype, ltype)\ + struct ltype *radial_next, *radial_prev;\ + struct ftype *f; + +typedef struct BMLoop { + BM_ADJ_LHEAD(BMVert, BMEdge, BMLoop, BMFace) +} BMLoop; + +typedef struct BMLoopList { + BM_BASE_LSTHEAD(BMLoopList, BMLoop) +} BMLoopList; + +#define BM_ADJ_FHEAD\ + BM_BASE_FHEAD +typedef struct BMFace { + BM_ADJ_FHEAD +} BMFace; + +/*this is part of the lower-level face splitting API, higer-level +stuff will be preferred*/ +typedef struct BMFaceCut { + BMLoop *l1, *l2; + ListBase origface_loops; + ListBase newface_loops; + BMFace *new_f; /*empty new face to be filled by api*/ +} BMFaceCut; + +/*ok, in nearly (if not all) cases the subclasses will use CustomData to store stuff, but they store things +here as well (except it's not saved in files obviously, or interpolating, or all the other things the CD +system does)*/ +#define BMSC_GETSELF(bm, e, type) (void*)(((char*)((BMHeader*)(e))->layerdata) + bm->layer_offsets[(type)->__index]) +#define BMSC_DEFAULT_LAYERSIZE sizeof(LayerType) + +#define BM_SUBCLASS_HEAD struct BMLayerType *type; int __index; + +typedef struct BMSubClassLayer { + BM_SUBCLASS_HEAD +} BMSubClassLayer; + +typedef struct BMLayerType { + int vsize, esize, lsize, fsize; + int meshsize; /*size of custom mesh structure, if exists*/ + + /*note that allocation is done entirely outside of the subclass functions, thus the need for + the above struct size parameters*/ + void (*new_mesh)(struct BMesh *bm, void *self); + void (*free_mesh)(struct BMesh *bm, void *self); + + /*these functions may return NULL if this child class doesn't need to store anything + outside of the CustomData API*/ + void (*new_vert)(struct BMesh *bm, BMBaseVert *v, void *self); + void (*new_edge)(struct BMesh *bm, BMBaseEdge *e, void *self); + void (*new_loop)(struct BMesh *bm, BMBaseLoop *l, void *self, BMBaseFace *f); + void (*new_face)(struct BMesh *bm, BMBaseFace *f, void *self); + + void (*free_vert)(struct BMesh *bm, BMBaseVert *v); + void (*free_edge)(struct BMesh *bm, BMBaseEdge *e); + void (*free_loop)(struct BMesh *bm, BMBaseLoop *l); + void (*free_face)(struct BMesh *bm, BMBaseFace *f); + + void (*copy_vert)(struct BMesh *bm, BMBaseVert *v); + void (*copy_edge)(struct BMesh *bm, BMBaseEdge *e); + void (*copy_loop)(struct BMesh *bm, BMBaseLoop *l); + void (*copy_face)(struct BMesh *bm, BMBaseFace *f); + + /*hrm, I wonder if I should have this at all, faces_from_faces might be + better all by itself*/ + void (*split_face)(struct BMesh *bm, void *f, BMFaceCut *cuts, int totcut); + + /*interpolates non-CustomData-stored data. faces in dest overlap some or all faces in source*/ + void (*faces_from_faces)(struct BMesh *bm, BMFace **sources, int totsource, BMFace **dests, int totdest); + + int required_base_layers; /*sets if BMTool flags or adjacency data layers are needed*/ + int customdata_required_layers; /*mask of required CD layers*/ +} BMLayerType; + +typedef struct BMesh { + int totvert, totedge, totloop, totface; + int totvertsel, totedgesel, totfacesel; + + /*element pools*/ + struct BLI_mempool *vpool, *epool, *lpool, *fpool; + + /*subclass data layer pools*/ + struct BLI_mempool *svpool, *sepool, *slpool, *sfpool; + + /*operator api stuff*/ + struct BLI_mempool *toolflagpool; + int stackdepth; + struct BMOperator *currentop; + + CustomData vdata, edata, ldata, pdata; + + struct BLI_mempool *looplistpool; + + /*stuff for compile-time subclassing*/ + int baselevel, totlayer; + BMSubClassLayer *layers; /*does not include base types*/ + int *layer_offsets; + + /*should be copy of scene select mode*/ + int selectmode; + + /*ID of the shape key this bmesh came from*/ + int shapenr; + + int walkers, totflags; + ListBase selected, error_stack; + + BMFace *act_face; + + ListBase errorstack; +} BMesh; + +void BM_Copy_Vert(BMesh *bm, BMVert *destv, BMVert *source); +void BM_Copy_Edge(BMesh *bm, BMEdge *deste, BMEdge *source); +void BM_Copy_Loop(BMesh *bm, BMLoop *destl, BMLoop *source); +void BM_Copy_Face(BMesh *bm, BMFace *destf, BMFace *source); + +#define LAYER_BASE 1 +#define LAYER_TOOL 2 +#define LAYER_ADJ 4 +#define MAX_LAYERS 2 /*does not include base*/ + +#define BM_VERT 1 +#define BM_EDGE 2 +#define BM_LOOP 4 +#define BM_FACE 8 + +#endif /* _BMESH_CLASS_H */ Added: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c (rev 0) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c 2010-07-15 01:43:09 UTC (rev 30358) @@ -0,0 +1,1204 @@ +#include "BLI_math_vector.h" + +#include "BKE_utildefines.h" +#include "BKE_customdata.h" +#include "BKE_DerivedMesh.h" + +#include "BLI_blenlib.h" +#include "BLI_mempool.h" +#include "BLI_ghash.h" +#include "BLI_array.h" + +#include "DNA_listBase.h" + +#include "bmesh_class.h" + +#include "bmesh_iterators.h" +#include "bmesh_private.h" + +/*note: first three layers, base through adjacency, do *not* use the + LayerType system for speed/memory cache efficiency and whatnot*/ + +static void inherit_vert(BMesh *bm, BMBaseVert *v) +{ + int i; + + for (i=0; i<bm->totlayer; i++) { + void *ldata = BMSC_GETSELF(bm, v, bm->layers+i); + bm->layers[i].type->new_vert(bm, v, ldata); + } + + if (bm->baselevel >= LAYER_ADJ) { + /*not sure anything is needed here either, verts generally come first before all else*/ + } +} + +static void inherit_edge(BMesh *bm, BMBaseEdge *ebase) +{ + int i; + + if (bm->baselevel >= LAYER_ADJ) { + BMEdge *e = (BMEdge*)ebase; + + bmesh_disk_append_edge(e, e->v1); + bmesh_disk_append_edge(e, e->v2); + } + + for (i=0; i<bm->totlayer; i++) { + void *ldata = BMSC_GETSELF(bm, ebase, bm->layers+i); + bm->layers[i].type->new_edge(bm, ebase, ldata); + } +} + +static void inherit_loop(BMesh *bm, BMBaseLoop *l, BMBaseFace *f) +{ + int i; + + for (i=0; i<bm->totlayer; i++) { + void *self; + + if (!bm->layers[i].type->new_loop) continue; + + self = BMSC_GETSELF(bm, l, &bm->layers[i]); + bm->layers[i].type->new_loop(bm, (BMBaseLoop*)l, self, (BMBaseFace*)f); + } +} + +/* +static void inherit_face(BMesh *bm, BMBaseFace *basef) +{ + int i; + + for (i=0; i<bm->totlayer; i++) { @@ 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