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

Joseph Eagar joeedh at gmail.com
Sun Apr 3 02:25:02 CEST 2011


Revision: 35967
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35967
Author:   joeedh
Date:     2011-04-03 00:25:01 +0000 (Sun, 03 Apr 2011)
Log Message:
-----------
=bmesh=

Implemented the solidify modifier (but
not the editmode tool, yet).

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -581,6 +581,7 @@
 			if(tree != NULL)
 			{
 				/* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */
+#if 0 //BMESH_TODO
 				EditMesh *em= data->em_evil;
 				if(em) {
 					EditFace *efa= em->faces.first;
@@ -596,6 +597,9 @@
 							BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
 						}
 					}
+#else
+				if (0) {
+#endif
 				}
 				else {
 					for(i = 0; i < numFaces; i++) {

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -1221,6 +1221,7 @@
 	}
 
 	data->totsize = offset;
+	customData_update_typemap(data);
 }
 
 int CustomData_get_layer_index(const CustomData *data, int type)
@@ -1666,10 +1667,10 @@
 
 		if (i != j)
 			data->layers[j] = data->layers[i];
-
-		if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY)
+		
+		if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY) {
 			customData_free_layer__internal(layer, totelem);
-		else
+		} else
 			j++;
 	}
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -599,7 +599,9 @@
 	}
 
 	//free memory
-	if(ss_mesh)
+	if(ss_mesh) {
+		ss_mesh->needsFree = 1;
 		ss_mesh->release(ss_mesh);
+	}
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -82,7 +82,7 @@
 	if(mmd->totlvl) {
 		if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
 			/* multires always needs a displacement layer */
-			CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, NULL, me->totface);
+			CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, NULL, me->totloop);
 		}
 	}
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -90,11 +90,16 @@
 	int *origv = NULL, *origf = NULL, *of, *ov;
 	BLI_array_declare(origv);
 	BLI_array_declare(origf);
+	DerivedMesh *copy = NULL;
 	int i;
 	
 	if (nmd->resolution <= 0)
 		return dm;
 	
+	if (!CDDM_Check(dm)) {
+		dm = copy = CDDM_copy(dm, 0);
+	}
+	
 	CDDM_recalc_tesselation(dm, 0);
 	
 	mf = dm->getTessFaceArray(dm);
@@ -291,6 +296,12 @@
 	dummy->needsFree = 1;
 	dummy->release(dummy);
 	
+	if (copy) {
+		copy->needsFree = 1;
+		copy->release(dm);
+		copy = copy;
+	}
+
 	return cddm;
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-04-03 00:25:01 UTC (rev 35967)
@@ -40,6 +40,8 @@
 #include "BLI_math.h"
 #include "BLI_edgehash.h"
 #include "BLI_utildefines.h"
+#include "BLI_array.h"
+#include "BLI_smallhash.h"
 
 #include "BKE_cdderivedmesh.h"
 #include "BKE_mesh.h"
@@ -59,7 +61,8 @@
 static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
 {
 	int i, numVerts, numEdges, numFaces;
-	MFace *mface, *mf;
+	MPoly *mpoly, *mp;
+	MLoop *mloop, *ml;
 	MVert *mvert, *mv;
 
 	float (*face_nors)[3];
@@ -69,9 +72,10 @@
 	numVerts = dm->getNumVerts(dm);
 	numEdges = dm->getNumEdges(dm);
 	numFaces = dm->getNumFaces(dm);
-	mface = dm->getTessFaceArray(dm);
+	mpoly = CDDM_get_polys(dm);
 	mvert = dm->getVertArray(dm);
-
+	mloop = CDDM_get_loops(dm);
+	
 	/* we don't want to overwrite any referenced layers */
 
 	/*
@@ -80,14 +84,14 @@
 	cddm->mvert = mv;
 	*/
 
-	face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+	face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
 	if(!face_nors) {
 		calc_face_nors = 1;
-		face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, numFaces);
+		face_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, numFaces);
 	}
 
 	mv = mvert;
-	mf = mface;
+	mp = mpoly;
 
 	{
 		EdgeHash *edge_hash = BLI_edgehash_new();
@@ -110,27 +114,19 @@
 					edge_ref->f2=i; \
 				}
 
-		for(i = 0; i < numFaces; i++, mf++) {
+		for(i = 0; i < numFaces; i++, mp++) {
+			int j;
+			
 			f_no = face_nors[i];
+			if(calc_face_nors)
+				mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, f_no);
 
-			if(mf->v4) {
-				if(calc_face_nors)
-					normal_quad_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co);
-
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2);
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3);
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v4);
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v4, mf->v1);
-			} else {
-				if(calc_face_nors)
-					normal_tri_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co);
-
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2);
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3);
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v1);
+			ml = mloop + mp->loopstart;
+			for (j=0; j<mp->totloop; j++) {
+				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml[j].v, ml[(j+1)%mp->totloop].v);
 			}
 		}
-
+		
 		for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
 			/* Get the edge vert indices, and edge value (the face indices that use it)*/
 			BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
@@ -196,7 +192,6 @@
 	return dataMask;
 }
 
-
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob, 
 						DerivedMesh *dm,
 						int UNUSED(useRenderParams),
@@ -206,20 +201,22 @@
 	DerivedMesh *result, *copy;
 	const SolidifyModifierData *smd = (SolidifyModifierData*) md;
 
-	MFace *mf, *mface, *orig_mface;
+	MVert *mv, *mvert, *orig_mvert;
 	MEdge *ed, *medge, *orig_medge;
-	MVert *mv, *mvert, *orig_mvert;
-
+	MLoop *ml, *mloop, *orig_mloop;
+	MPoly *mp, *mpoly, *orig_mpoly;
 	const int numVerts = dm->getNumVerts(dm);
 	const int numEdges = dm->getNumEdges(dm);
 	const int numFaces = dm->getNumFaces(dm);
-
+	int numLoops=0, newLoops=0, newFaces=0, newEdges=0;
+	int j;
+	
 	/* use for edges */
 	int *new_vert_arr= NULL;
-	int newFaces = 0;
-
+	BLI_array_declare(new_vert_arr);
 	int *new_edge_arr= NULL;
-	int newEdges = 0;
+	BLI_array_declare(new_edge_arr);
+	int *old_vert_arr = MEM_callocN(sizeof(int)*numVerts, "old_vert_arr in solidify");
 
 	int *edge_users= NULL;
 	char *edge_order= NULL;
@@ -236,11 +233,22 @@
 
 	if (defgrp_index >= 0)
 		dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+	
+	if (!CDDM_Check(dm)) {
+		DerivedMesh *dm2 = CDDM_copy(dm, 0);
+		dm->needsFree = 1;
+		dm->release(dm);
+		dm = dm2;
+	}
+	
+	numLoops = dm->numLoopData;
+	newLoops = 0;
+	
+	orig_mvert = CDDM_get_verts(dm);
+	orig_medge = CDDM_get_edges(dm);
+	orig_mloop = CDDM_get_loops(dm);
+	orig_mpoly = CDDM_get_polys(dm);
 
-	orig_mface = dm->getTessFaceArray(dm);
-	orig_medge = dm->getEdgeArray(dm);
-	orig_mvert = dm->getVertArray(dm);
-
 	if(smd->flag & MOD_SOLIDIFY_RIM) {
 		EdgeHash *edgehash = BLI_edgehash_new();
 		EdgeHashIterator *ehi;
@@ -272,28 +280,20 @@
 		edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges");
 		edge_order= MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder");
 		memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges);
-
-		for(i=0, mf=orig_mface; i<numFaces; i++, mf++) {
-			if(mf->v4) {
-				ADD_EDGE_USER(mf->v1, mf->v2, 0);
-				ADD_EDGE_USER(mf->v2, mf->v3, 1);
-				ADD_EDGE_USER(mf->v3, mf->v4, 2);
-				ADD_EDGE_USER(mf->v4, mf->v1, 3);
-			}
-			else {
-				ADD_EDGE_USER(mf->v1, mf->v2, 0);
-				ADD_EDGE_USER(mf->v2, mf->v3, 1);
-				ADD_EDGE_USER(mf->v3, mf->v1, 2);
-			}
+		
+		for (i=0, mp=orig_mpoly; i<numFaces; i++, mp++) {
+			MLoop *ml;
+			
+			for (ml=orig_mloop + mp->loopstart, j=0; j<mp->totloop; ml++, j++) {
+				MLoop *ml2 = orig_mloop + mp->loopstart + (j+1)%mp->totloop;
+				ADD_EDGE_USER(ml->v, ml2->v, j);
+			}	
 		}
 
 #undef ADD_EDGE_USER
 #undef INVALID_UNUSED
 #undef INVALID_PAIR
 
-
-		new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod arr");
-
 		ehi= BLI_edgehashIterator_new(edgehash);
 		for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
 			eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
@@ -301,18 +301,17 @@
 				BLI_edgehashIterator_getKey(ehi, &v1, &v2);
 				orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
 				orig_mvert[v2].flag |= ME_VERT_TMP_TAG;
-				new_edge_arr[newFaces]= eidx;
+				BLI_array_append(new_edge_arr, eidx);
 				newFaces++;
+				newLoops += 4;
 			}
 		}
 		BLI_edgehashIterator_free(ehi);
 
-
-
-		new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod new_varr");
 		for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) {
 			if(mv->flag & ME_VERT_TMP_TAG) {
-				new_vert_arr[newEdges] = i;
+				old_vert_arr[i] = BLI_array_count(new_vert_arr);
+				BLI_array_append(new_vert_arr, i);
 				newEdges++;
 
 				mv->flag &= ~ME_VERT_TMP_TAG;
@@ -327,40 +326,49 @@
 		dm_calc_normal(dm, vert_nors);
 	}
 
-	result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces, 0, 0);
+	result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, 0, (numLoops*2) + newLoops, (numFaces * 2) + newFaces);
 
-	mface = result->getTessFaceArray(result);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list