[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21098] branches/bmesh/blender/source/ blender: Array modifier is now implemented using bmesh

Joseph Eagar joeedh at gmail.com
Tue Jun 23 07:35:49 CEST 2009


Revision: 21098
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21098
Author:   joeedh
Date:     2009-06-23 07:35:49 +0200 (Tue, 23 Jun 2009)

Log Message:
-----------
Array modifier is now implemented using bmesh
(though it's not completely feature-complete yet).
I ported over the remove doubles code from the
old bmesh branch for this, and split it into two
bmops, "Weld Verts" and "Remove Doubles".

Weld verts welds specific verts together, while remove
doubles finds doubles and welds them.

I also reverted the hotkey change I made earlier.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.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/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/modifier.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_structure.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/bmesh/operators/createops.c
    branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/bmesh/operators/subdivideop.c
    branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
    branches/bmesh/blender/source/blender/bmesh/operators/utils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_lib.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_buttons.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-23 00:45:41 UTC (rev 21097)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-23 05:35:49 UTC (rev 21098)
@@ -175,6 +175,19 @@
 	void *(*getVertDataArray)(DerivedMesh *dm, int type);
 	void *(*getEdgeDataArray)(DerivedMesh *dm, int type);
 	void *(*getTessFaceDataArray)(DerivedMesh *dm, int type);
+	
+	/*retrieves the base CustomData structures for 
+	  verts/edges/tessfaces/loops/facdes*/
+	CustomData *(*getVertDataLayout)(DerivedMesh *dm);
+	CustomData *(*getEdgeDataLayout)(DerivedMesh *dm);
+	CustomData *(*getTessFaceDataLayout)(DerivedMesh *dm);
+	CustomData *(*getLoopDataLayout)(DerivedMesh *dm);
+	CustomData *(*getFaceDataLayout)(DerivedMesh *dm);
+	
+	/*copies all customdata for an element source into dst at index dest*/
+	void (*copyFromVertCData)(DerivedMesh *dm, int source, CustomData *dst, int dest);
+	void (*copyFromEdgeCData)(DerivedMesh *dm, int source, CustomData *dst, int dest);
+	void (*copyFromFaceCData)(DerivedMesh *dm, int source, CustomData *dst, int dest);
 
 	/* Iterate over each mapped vertex in the derived mesh, calling the
 	 * given function with the original vert and the mapped vert's new

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-06-23 00:45:41 UTC (rev 21097)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h	2009-06-23 05:35:49 UTC (rev 21098)
@@ -69,6 +69,12 @@
 void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
                       CustomDataMask mask, int alloctype, int totelem);
 
+/*bmesh version of CustomData_merge; merges the layouts of source and dest,
+  then goes through the mesh and makes sure all the customdata blocks are
+  consistent with the new layout.*/
+void CustomData_bmesh_merge(struct CustomData *source, struct CustomData *dest, 
+                            int mask, int alloctype, struct BMesh *bm, int type);
+
 /* frees data associated with a CustomData object (doesn't free the object
  * itself, though)
  */

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-23 00:45:41 UTC (rev 21097)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-23 05:35:49 UTC (rev 21098)
@@ -163,6 +163,31 @@
 	return tmp;
 }
 
+CustomData *dm_getVertCData(DerivedMesh *dm)
+{
+	return &dm->vertData;
+}
+
+CustomData *dm_getEdgeCData(DerivedMesh *dm)
+{
+	return &dm->edgeData;
+}
+
+CustomData *dm_getFaceCData(DerivedMesh *dm)
+{
+	return &dm->faceData;
+}
+
+CustomData *dm_getLoopCData(DerivedMesh *dm)
+{
+	return &dm->loopData;
+}
+
+CustomData *dm_getPolyCData(DerivedMesh *dm)
+{
+	return &dm->polyData;
+}
+
 void DM_init_funcs(DerivedMesh *dm)
 {
 	/* default function implementations */
@@ -173,6 +198,12 @@
 	dm->dupEdgeArray = dm_dupEdgeArray;
 	dm->dupTessFaceArray = dm_dupFaceArray;
 
+	dm->getVertDataLayout = dm_getVertCData;
+	dm->getEdgeDataLayout = dm_getEdgeCData;
+	dm->getTessFaceDataLayout = dm_getFaceCData;
+	dm->getLoopDataLayout = dm_getLoopCData;
+	dm->getFaceDataLayout = dm_getPolyCData;
+
 	dm->getVertData = DM_get_vert_data;
 	dm->getEdgeData = DM_get_edge_data;
 	dm->getTessFaceData = DM_get_face_data;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-23 00:45:41 UTC (rev 21097)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-23 05:35:49 UTC (rev 21098)
@@ -1089,7 +1089,7 @@
 
 	for(i=0; i < numTex; i++){
 		texface = CustomData_get_n(facedata, CD_MTFACE, cdindex, i);
-		texpoly = CustomData_bmesh_get_n(&bm->pdata, f->data, CD_MTEXPOLY, i);
+		texpoly = CustomData_bmesh_get_n(&bm->pdata, f->head.data, CD_MTEXPOLY, i);
 		
 		texface->tpage = texpoly->tpage;
 		texface->flag = texpoly->flag;
@@ -1100,7 +1100,7 @@
 	
 		for (j=0; j<3; i++) {
 			l = l3[j];
-			mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPUV, i);
+			mloopuv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
 			texface->uv[j][0] = mloopuv->uv[0];
 			texface->uv[j][1] = mloopuv->uv[1];
 		}
@@ -1111,7 +1111,7 @@
 		
 		for (j=0; j<3; j++) {
 			l = l3[j];
-			mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->data, CD_MLOOPCOL, i);
+			mloopcol = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPCOL, i);
 			mcol[j].r = mloopcol->r;
 			mcol[j].g = mloopcol->g;
 			mcol[j].b = mloopcol->b;
@@ -1137,14 +1137,17 @@
 	MPoly *mpoly = cddm->mpoly;
 	int numCol = CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPCOL);
 	int numTex = CustomData_number_of_layers(&em->bm->pdata, CD_MTEXPOLY);
-	int i, j, *index;
+	int i, j, *index, add_orig;
 
 	dm->deformedOnly = 1;
+	
+	/*don't add origindex layer if one already exists*/
+	add_orig = !CustomData_has_layer(&em->bm->pdata, CD_ORIGINDEX);
 
 	CustomData_merge(&em->bm->vdata, &dm->vertData, CD_MASK_DERIVEDMESH,
 	                 CD_CALLOC, dm->numVertData);
-	/* CustomData_merge(&em->edata, &dm->edgeData, CD_MASK_DERIVEDMESH,
-	                 CD_CALLOC, dm->numEdgeData); */
+	CustomData_merge(&em->bm->edata, &dm->edgeData, CD_MASK_DERIVEDMESH,
+	                 CD_CALLOC, dm->numEdgeData);
 	CustomData_merge(&em->bm->pdata, &dm->faceData, CD_MASK_DERIVEDMESH,
 	                 CD_CALLOC, dm->numFaceData);
 	CustomData_merge(&em->bm->ldata, &dm->loopData, CD_MASK_DERIVEDMESH,
@@ -1174,6 +1177,8 @@
 
 		VECCOPY(mv->co, eve->co);
 
+		BMINDEX_SET(eve, i);
+
 		mv->no[0] = eve->no[0] * 32767.0;
 		mv->no[1] = eve->no[1] * 32767.0;
 		mv->no[2] = eve->no[2] * 32767.0;
@@ -1182,9 +1187,9 @@
 		mv->mat_nr = 0;
 		mv->flag = BMFlags_To_MEFlags(eve);
 
-		*index = i;
+		if (add_orig) *index = i;
 
-		CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->data, i);
+		CustomData_from_bmesh_block(&bm->vdata, &dm->vertData, eve->head.data, i);
 	}
 
 	index = dm->getEdgeDataArray(dm, CD_ORIGINDEX);
@@ -1192,6 +1197,8 @@
 	for (i=0; eed; eed=BMIter_Step(&iter), i++, index++) {
 		MEdge *med = &medge[i];
 
+		BMINDEX_SET(eed, i);
+
 		med->v1 = BMINDEX_GET(eed->v1);
 		med->v2 = BMINDEX_GET(eed->v2);
 		med->crease = (unsigned char) (eed->crease * 255.0f);
@@ -1200,9 +1207,8 @@
 		
 		med->flag = BMFlags_To_MEFlags(eed);
 
-		*index = i;
-
-		/* CustomData_from_em_block(&em->edata, &dm->edgeData, eed->data, i); */
+		CustomData_from_bmesh_block(&bm->edata, &dm->edgeData, eed->head.data, i);
+		if (add_orig) *index = i;
 	}
 
 	efa = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
@@ -1222,15 +1228,14 @@
 		mf->v4 = 0;
 		mf->mat_nr = efa->mat_nr;
 		mf->flag = BMFlags_To_MEFlags(efa);
+		
+		*index = add_orig ? BMINDEX_GET(efa) : *(int*)CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_ORIGINDEX);
 
-		*index = BMINDEX_GET(efa);
-
 		loops_to_customdata_corners(bm, &dm->faceData, i, l, numCol, numTex);
-
 		test_index_face(mf, &dm->faceData, i, 3);
 	}
 	
-	index = CustomData_get(&dm->polyData, 0, CD_ORIGINDEX);
+	index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
 	j = 0;
 	efa = BMIter_New(&iter, bm, BM_FACES_OF_MESH, NULL);
 	for (i=0; efa; i++, efa=BMIter_Step(&iter), index++) {
@@ -1245,13 +1250,15 @@
 		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
 			mloop->v = BMINDEX_GET(l->v);
 			mloop->e = BMINDEX_GET(l->e);
-			CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l->data, j);
+			CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l->head.data, j);
 
 			j++;
 			mloop++;
 		}
 
-		*index = i;
+		CustomData_from_bmesh_block(&bm->pdata, &dm->polyData, efa->head.data, i);
+
+		if (add_orig) *index = i;
 	}
 
 	return dm;
@@ -1357,8 +1364,6 @@
 	liter->head.eindex = ml->e;
 	liter->head.v = liter->cddm->mvert[ml->v];
 	liter->head.vindex = ml->v;
-
-	return;
 }
 
 DMFaceIter *cdDM_newFaceIter(DerivedMesh *source)

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-06-23 00:45:41 UTC (rev 21097)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-06-23 05:35:49 UTC (rev 21098)
@@ -45,6 +45,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "bmesh.h"
+
 #include <math.h>
 #include <string.h>
 
@@ -753,7 +755,7 @@
 	CD_MASK_MCOL | CD_MASK_ORIGINDEX | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
 	CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
 	CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORCO | CD_MASK_TANGENT | CD_MASK_WEIGHT_MCOL;
-const CustomDataMask CD_MASK_BMESH = 
+const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
 	CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
 const CustomDataMask CD_MASK_FACECORNERS =
 	CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
@@ -1862,6 +1864,54 @@
 	if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize);
 }
 
+void CustomData_bmesh_merge(CustomData *source, CustomData *dest, 
+                            int mask, int alloctype, BMesh *bm, int type)
+{
+	BMHeader *h;
+	BMIter iter;
+	CustomData destold = *dest;
+	void *tmp;
+	int i, t;
+	
+	CustomData_merge(source, dest, mask, alloctype, 0);
+	CustomData_bmesh_init_pool(dest, 512);
+
+	switch (type) {
+		case BM_VERT:
+			t = BM_VERTS_OF_MESH; break;
+		case BM_EDGE:
+			t = BM_EDGES_OF_MESH; break;
+		case BM_LOOP:
+			t = BM_LOOPS_OF_FACE; break;
+		case BM_FACE:
+			t = BM_FACES_OF_MESH; break;
+	}
+
+	if (t != BM_LOOPS_OF_FACE) {
+		/*ensure all current elements follow new customdata layout*/
+		BM_ITER(h, &iter, bm, t, NULL) {
+			CustomData_bmesh_copy_data(&destold, dest, h->data, &tmp);
+			CustomData_bmesh_free_block(&destold, &h->data);
+			h->data = tmp;
+		}
+	} else {
+		BMFace *f;
+		BMLoop *l;
+		BMIter liter;
+
+		/*ensure all current elements follow new customdata layout*/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list