[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37463] branches/bmesh/blender/source/ blender: =bmesh=

Joseph Eagar joeedh at gmail.com
Tue Jun 14 05:16:09 CEST 2011


Revision: 37463
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37463
Author:   joeedh
Date:     2011-06-14 03:16:08 +0000 (Tue, 14 Jun 2011)
Log Message:
-----------
=bmesh=

Removed the DerivedMesh face iterators (they sucked).
This should make subsurf faster.  Also sped up multires
a bit (not sure if it's strictly correct, need to look
at it later).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/multires.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/blenlib/BLI_edgehash.h
    branches/bmesh/blender/source/blender/editors/mesh/editface.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/sculpt.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2011-06-14 03:16:08 UTC (rev 37463)
@@ -104,43 +104,6 @@
       Also, the mface origindex layer indexes mpolys, not mfaces.
 */
 
-/*DM Iterators.  For now, first implement face iterators.
-  These are read-only, at least for now.*/
-
-typedef struct DMLoopIter {
-	void (*step)(void *self);
-	int done;
-
-	int index, vindex, eindex;
-	MVert v; /*copy of the associated vert's data*/	
-
-	/*note: if layer is -1, then the active layer is retrieved.
-	  loop refers to per-face-vertex data.*/
-	void *(*getLoopCDData)(void *self, int type, int layer);
-	void *(*getVertCDData)(void *self, int type, int layer);
-} DMLoopIter;
-
-typedef struct DMFaceIter {
-	void (*step)(void *self);
-	void (*free)(void *self);
-	int done;
-
-	int index;
-	int len;
-
-	/*you can set mat_nr and flags, and the backends 
-	  must detect and update the internal faces*/
-	int mat_nr;
-	int flags;
-
-	/*note: you may only use one
-	  loop iterator at a time.*/
-	DMLoopIter *(*getLoopsIter)(void *self);
-
-	/*if layer is -1, returns active layer*/
-	void *(*getCDData)(void *self, int type, int layer);
-} DMFaceIter;
-
 typedef struct DMGridData {
 	float co[3];
 	float no[3];
@@ -170,9 +133,6 @@
 
 	/* Misc. Queries */
 	
-	/*face iterator.  initializes iter.*/
-	DMFaceIter *(*newFaceIter)(DerivedMesh *dm);
-
 	/*recalculates mesh tesselation*/
 	void (*recalcTesselation)(DerivedMesh *dm);
 
@@ -199,6 +159,8 @@
 	struct MVert *(*getVertArray)(DerivedMesh *dm);
 	struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
 	struct MFace *(*getTessFaceArray)(DerivedMesh *dm);
+	struct MLoop *(*getLoopArray)(DerivedMesh *dm);
+	struct MPoly *(*getPolyArray)(DerivedMesh *dm);
 
 	/* copy all verts/edges/faces from the derived mesh into
 	 * *{vert/edge/face}_r (must point to a buffer large enough)
@@ -206,6 +168,8 @@
 	void (*copyVertArray)(DerivedMesh *dm, struct MVert *vert_r);
 	void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
 	void (*copyTessFaceArray)(DerivedMesh *dm, struct MFace *face_r);
+		void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *loop_r);
+		void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *poly_r);
 
 	/* return a copy of all verts/edges/faces from the derived mesh
 	 * it is the caller's responsibility to free the returned pointer
@@ -213,6 +177,8 @@
 	struct MVert *(*dupVertArray)(DerivedMesh *dm);
 	struct MEdge *(*dupEdgeArray)(DerivedMesh *dm);
 	struct MFace *(*dupTessFaceArray)(DerivedMesh *dm);
+		struct MLoop *(*dupLoopArray)(DerivedMesh *dm);
+		struct MPoly *(*dupPolyArray)(DerivedMesh *dm);
 
 	/* return a pointer to a single element of vert/edge/face custom data
 	 * from the derived mesh (this gives a pointer to the actual data, not

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-06-14 02:26:43 UTC (rev 37462)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-06-14 03:16:08 UTC (rev 37463)
@@ -125,6 +125,34 @@
 	return mface;
 }
 
+static MLoop *dm_getLoopArray(DerivedMesh *dm)
+{
+	MLoop *mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
+
+	if (!mloop) {
+		mloop = CustomData_add_layer(&dm->loopData, CD_MLOOP, CD_CALLOC, NULL,
+			dm->numLoopData);
+		CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY);
+		dm->copyLoopArray(dm, mloop);
+	}
+
+	return mloop;
+}
+
+static MPoly *dm_getPolyArray(DerivedMesh *dm)
+{
+	MPoly *mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
+
+	if (!mpoly) {
+		mpoly = CustomData_add_layer(&dm->polyData, CD_MPOLY, CD_CALLOC, NULL,
+			dm->getNumFaces(dm));
+		CustomData_set_layer_flag(&dm->polyData, CD_MPOLY, CD_FLAG_TEMPORARY);
+		dm->copyPolyArray(dm, mpoly);
+	}
+
+	return mpoly;
+}
+
 static MVert *dm_dupVertArray(DerivedMesh *dm)
 {
 	MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm),
@@ -155,6 +183,26 @@
 	return tmp;
 }
 
+static MLoop *dm_dupLoopArray(DerivedMesh *dm)
+{
+	MLoop *tmp = MEM_callocN(sizeof(*tmp) * dm->numLoopData,
+							 "dm_dupLoopArray tmp");
+
+	if(tmp) dm->copyLoopArray(dm, tmp);
+
+	return tmp;
+}
+
+static MPoly *dm_dupPolyArray(DerivedMesh *dm)
+{
+	MPoly *tmp = MEM_callocN(sizeof(*tmp) * dm->numFaceData,
+							 "dm_dupPolyArray tmp");
+
+	if(tmp) dm->copyPolyArray(dm, tmp);
+
+	return tmp;
+}
+
 static CustomData *dm_getVertCData(DerivedMesh *dm)
 {
 	return &dm->vertData;
@@ -186,9 +234,13 @@
 	dm->getVertArray = dm_getVertArray;
 	dm->getEdgeArray = dm_getEdgeArray;
 	dm->getTessFaceArray = dm_getFaceArray;
+	dm->getLoopArray = dm_getLoopArray;
+	dm->getPolyArray = dm_getPolyArray;
 	dm->dupVertArray = dm_dupVertArray;
 	dm->dupEdgeArray = dm_dupEdgeArray;
 	dm->dupTessFaceArray = dm_dupFaceArray;
+	dm->dupLoopArray = dm_dupLoopArray;
+	dm->dupPolyArray = dm_dupPolyArray;
 
 	dm->getVertDataLayout = dm_getVertCData;
 	dm->getEdgeDataLayout = dm_getEdgeCData;
@@ -272,105 +324,29 @@
 	}
 }
 
-static void dm_add_polys_from_iter(CustomData *ldata, CustomData *pdata, DerivedMesh *dm, int totloop)
+void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
 {
-	DMFaceIter *iter = dm->newFaceIter(dm);
-	DMLoopIter *liter;
-	CustomData *oldata, *opdata;
-	MPoly *mpoly;
-	MLoop *mloop;
-	int p, l, i, j, lasttype;
+	CustomData_copy(&source->loopData, &target->loopData, CD_MASK_DERIVEDMESH, CD_CALLOC, source->numLoopData);
+	CustomData_copy(&source->polyData, &target->polyData, CD_MASK_DERIVEDMESH, CD_CALLOC, source->numPolyData);
 
-	oldata = dm->getLoopDataLayout(dm);
-	opdata = dm->getFaceDataLayout(dm);
+	target->numLoopData = source->numLoopData;
+	target->numPolyData = source->numPolyData;
 
-	CustomData_copy(oldata, ldata, CD_MASK_DERIVEDMESH, CD_CALLOC, totloop);
-	CustomData_copy(opdata, pdata, CD_MASK_DERIVEDMESH, CD_CALLOC, dm->getNumFaces(dm));
+	if (!CustomData_has_layer(&target->polyData, CD_MPOLY)) {
+		MPoly *mpoly;
+		MLoop *mloop;
 
-	mloop = MEM_callocN(sizeof(MLoop)*totloop, "MLoop from dm_add_polys_from_iter");
-	CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop);
-	mpoly = MEM_callocN(sizeof(MPoly)*dm->getNumFaces(dm), "MPoly from dm_add_polys_from_iter");
-	CustomData_add_layer(pdata, CD_MPOLY, CD_ASSIGN, mpoly, dm->getNumFaces(dm));
-
-	l = 0;
-	for (p=0; !iter->done; iter->step(iter), mpoly++, p++) {
-		mpoly->flag = iter->flags;
-		mpoly->loopstart = l;
-		mpoly->totloop = iter->len;
-		mpoly->mat_nr = iter->mat_nr;
-		
-		j = 0;
-		lasttype = -1;
-		for (i=0; i<opdata->totlayer; i++) {
-			void *e1, *e2;
-
-			if (opdata->layers[i].type == lasttype)
-				j++;
-			else
-				j = 0;
-
-			if (opdata->layers[i].type == CD_MPOLY)
-				continue;
-			
-			e1 = iter->getCDData(iter, opdata->layers[i].type, j);
-			e2 = (char*)CustomData_get_n(pdata, opdata->layers[i].type, p, j);
-			
-			if (!e2)
-				continue;
-
-			CustomData_copy_elements(opdata->layers[i].type, e1, e2, 1);
-			
-			lasttype = opdata->layers[i].type;				
-		}
-
-		liter = iter->getLoopsIter(iter);
-		for (; !liter->done; liter->step(liter), mloop++, l++) {
-			mloop->v = liter->vindex;
-			mloop->e = liter->eindex;
-
-			j = 0;
-			lasttype = -1;
-			for (i=0; i<oldata->totlayer; i++) {
-				void *e1, *e2;
-
-				if (oldata->layers[i].type == CD_MLOOP)
-					continue;
-				
-				if (oldata->layers[i].type == lasttype)
-					j++;
-				else
-					j = 0;
-
-				e1 = liter->getLoopCDData(liter, oldata->layers[i].type, j);
-				e2 = CustomData_get_n(ldata, oldata->layers[i].type, l, j);
-				
-				if (!e2)
-					continue;
-
-				CustomData_copy_elements(oldata->layers[i].type, e1, e2, 1);
-				lasttype = oldata->layers[i].type;				
-			}
-		}
+		mloop = source->dupLoopArray(source);
+		mpoly = source->dupPolyArray(source);
+		CustomData_add_layer(&target->loopData, CD_MLOOP, CD_ASSIGN, mloop, source->numLoopData);
+		CustomData_add_layer(&target->polyData, CD_MPOLY, CD_ASSIGN, mpoly, source->numPolyData);
 	}
-	iter->free(iter);
 }
 
-void DM_DupPolys(DerivedMesh *source, DerivedMesh *target)
-{
-	DMFaceIter *iter = source->newFaceIter(source);
-	int totloop = source->numLoopData;
-
-	dm_add_polys_from_iter(&target->loopData, &target->polyData, source, totloop);
-
-	target->numLoopData = totloop;
-	target->numPolyData = source->getNumFaces(source);
-}
-
 void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
 {
 	/* dm might depend on me, so we need to do everything with a local copy */
 	Mesh tmp = *me;
-	DMFaceIter *iter;
 	int totvert, totedge, totface, totloop, totpoly;
 	int did_shapekeys=0;
 	
@@ -384,14 +360,7 @@
 	totedge = tmp.totedge = dm->getNumEdges(dm);
 	totface = tmp.totface = dm->getNumTessFaces(dm);
 	totpoly = tmp.totpoly = dm->getNumFaces(dm);
-	
-	totloop = 0;
-	for (iter=dm->newFaceIter(dm); !iter->done; iter->step(iter)) {
-		totloop += iter->len;
-	}
-	iter->free(iter);
-	
-	tmp.totloop = totloop;
+	totloop = tmp.totloop = dm->numLoopData;
 
 	CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, totvert);
 	CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, totedge);
@@ -432,9 +401,14 @@
 		CustomData_add_layer(&tmp.edata, CD_MEDGE, CD_ASSIGN, dm->dupEdgeArray(dm), totedge);
 	if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
 		CustomData_add_layer(&tmp.fdata, CD_MFACE, CD_ASSIGN, dm->dupTessFaceArray(dm), totface);
-	if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY))
-		dm_add_polys_from_iter(&tmp.ldata, &tmp.pdata, dm, totloop);
+	if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY)) {
+		tmp.mloop = dm->dupLoopArray(dm);
+		tmp.mpoly = dm->dupPolyArray(dm);
 
+		CustomData_add_layer(&tmp.ldata, CD_MLOOP, CD_ASSIGN, tmp.mloop, tmp.totloop);
+		CustomData_add_layer(&tmp.pdata, CD_MPOLY, CD_ASSIGN, tmp.mpoly, tmp.totpoly);
+	}
+
 	/* object had got displacement layer, should copy this layer to save sculpted data */
 	/* NOTE: maybe some other layers should be copied? nazgul */
 	if(CustomData_has_layer(&me->ldata, CD_MDISPS)) {
@@ -455,7 +429,7 @@
 	/*  ok, this should now use new CD shapekey data,
 	    which shouuld be fed through the modifier 
 		stack*/
-	if(tmp.totvert != me->totvert && !did_shapekeys) {
+	if(tmp.totvert != me->totvert && !did_shapekeys && me->key) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list