[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30358] branches/bmesh/blender/source/ blender/bmesh: forgot these

Joseph Eagar joeedh at gmail.com
Thu Jul 15 03:43:12 CEST 2010


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




More information about the Bf-blender-cvs mailing list