[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20939] branches/bmesh/blender/source/ blender: further fixes for modifiers, and edge loop select works now.

Joseph Eagar joeedh at gmail.com
Tue Jun 16 22:08:40 CEST 2009


Revision: 20939
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20939
Author:   joeedh
Date:     2009-06-16 22:08:40 +0200 (Tue, 16 Jun 2009)

Log Message:
-----------
further fixes for modifiers, and edge loop select works now.

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/customdata.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/intern/bmesh_interp.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-16 20:08:40 UTC (rev 20939)
@@ -65,7 +65,7 @@
 /* number of sub-elements each mesh element has (for interpolation) */
 #define SUB_ELEMS_VERT 0
 #define SUB_ELEMS_EDGE 2
-#define SUB_ELEMS_FACE 4
+#define SUB_ELEMS_FACE 50
 
 /*
 note: all mface interfaces now officially operate on tesselated data.

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-06-16 20:08:40 UTC (rev 20939)
@@ -240,8 +240,8 @@
 		CustomData_free_temporary(&dm->vertData, dm->numVertData);
 		CustomData_free_temporary(&dm->edgeData, dm->numEdgeData);
 		CustomData_free_temporary(&dm->faceData, dm->numFaceData);
-		CustomData_free(&dm->loopData, dm->numLoopData);
-		CustomData_free(&dm->polyData, dm->numPolyData);
+		CustomData_free_temporary(&dm->loopData, dm->numLoopData);
+		CustomData_free_temporary(&dm->polyData, dm->numPolyData);
 
 		return 0;
 	}
@@ -357,6 +357,8 @@
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
 	CustomData_free(&me->fdata, me->totface);
+	CustomData_free(&me->ldata, me->totloop);
+	CustomData_free(&me->pdata, me->totpoly);
 
 	/* if the number of verts has changed, remove invalid data */
 	if(tmp.totvert != me->totvert) {

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-06-16 20:08:40 UTC (rev 20939)
@@ -781,8 +781,14 @@
 	MVert *mv = cddm->mvert;
 	MPoly *mf = cddm->mpoly;
 	MLoop *ml = cddm->mloop;
-	int i, j, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+	float (*cents)[3];
+	float (*nors)[3];
+	int *flens;
+	int i, j, orig, *index;
+	int maxf=0;
 
+	index = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX);
+	mf = cddm->mpoly;
 	for(i = 0; i < dm->numPolyData; i++, mf++) {
 		float cent[3];
 		float no[3];
@@ -790,8 +796,7 @@
 		if (index) {
 			orig = *index++;
 			if(orig == ORIGINDEX_NONE) continue;
-		}
-		else
+		} else
 			orig = i;
 		
 		ml = &cddm->mloop[mf->loopstart];
@@ -804,14 +809,15 @@
 		ml = &cddm->mloop[mf->loopstart];
 		if (j > 3) {
 			CalcNormFloat4(mv[ml->v].co, mv[(ml+1)->v].co,
-			               mv[(ml+2)->v].co, mv[(ml+3)->v].co, no);
+				       mv[(ml+2)->v].co, mv[(ml+3)->v].co, no);
 		} else {
 			CalcNormFloat(mv[ml->v].co, mv[(ml+1)->v].co,
-			               mv[(ml+2)->v].co, no);
+				       mv[(ml+2)->v].co, no);
 		}
 
 		func(userData, orig, cent, no);
 	}
+
 }
 
 static void cdDM_release(DerivedMesh *dm)
@@ -1651,7 +1657,7 @@
 	MLoop *ml;
 	MPoly *mp;
 	EdgeHash *eh = BLI_edgehash_new();
-	int i, l, totloop;
+	int i, l, totloop, *index1, *index2;
 	
 	me = cddm->medge;
 	for (i=0; i<cddm->dm.numEdgeData; i++, me++) {
@@ -1664,14 +1670,25 @@
 		totloop += mf->v4 ? 4 : 3;
 	}
 
+	CustomData_free(&cddm->dm.polyData, cddm->dm.numPolyData);
+	CustomData_free(&cddm->dm.loopData, cddm->dm.numLoopData);
+	
+	cddm->dm.numLoopData = totloop;
+	cddm->dm.numPolyData = cddm->dm.numFaceData;
+
+	if (!totloop) return;
+
 	cddm->mloop = MEM_callocN(sizeof(MLoop)*totloop, "cddm->mloop in CDDM_tessfaces_to_faces");
-	cddm->dm.numLoopData = totloop;
 	cddm->mpoly = MEM_callocN(sizeof(MPoly)*cddm->dm.numFaceData, "cddm->mpoly in CDDM_tessfaces_to_faces");
-	cddm->dm.numPolyData = cddm->dm.numFaceData;
 	
 	CustomData_add_layer(&cddm->dm.loopData, CD_MLOOP, CD_ASSIGN, cddm->mloop, totloop);
 	CustomData_add_layer(&cddm->dm.polyData, CD_MPOLY, CD_ASSIGN, cddm->mpoly, cddm->dm.numPolyData);
-	
+	CustomData_merge(&cddm->dm.faceData, &cddm->dm.polyData, 
+		CD_MASK_DERIVEDMESH, CD_DUPLICATE, cddm->dm.numFaceData);
+
+	index1 = CustomData_get_layer(&cddm->dm.faceData, CD_ORIGINDEX);
+	index2 = CustomData_get_layer(&cddm->dm.polyData, CD_ORIGINDEX);
+
 	mf = cddm->mface;
 	mp = cddm->mpoly;
 	ml = cddm->mloop;

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-06-16 20:08:40 UTC (rev 20939)
@@ -806,7 +806,7 @@
 
 		if(layer->flag & CD_FLAG_NOCOPY) continue;
 		else if(!((int)mask & (int)(1 << (int)type))) continue;
-		else if(number < CustomData_number_of_layers(dest, type)) continue;
+		else if(number+1 < CustomData_number_of_layers(dest, type)) continue;
 
 		if((alloctype == CD_ASSIGN) && (layer->flag & CD_FLAG_NOFREE))
 			newlayer = customData_add_layer__internal(dest, type, CD_REFERENCE,

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-06-16 19:51:58 UTC (rev 20938)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-06-16 20:08:40 UTC (rev 20939)
@@ -428,7 +428,7 @@
 }
 #endif
 
-/* face weighting */
+
 static void calc_ss_weights(int gridFaces,
                             FaceVertWeight **qweight, FaceVertWeight **tweight)
 {
@@ -472,6 +472,61 @@
 	}
 }
 
+/* face weighting */
+typedef struct FaceVertWeightEntry {
+	FaceVertWeight *weight;
+	int valid;
+} FaceVertWeightEntry;
+
+typedef struct WeightTable {
+	FaceVertWeightEntry *weight_table;
+	int len;
+} WeightTable;
+
+static FaceVertWeight *get_ss_weights(WeightTable *wtable, int gridFaces, int faceLen)
+{
+	int i;
+
+	/*ensure we have at least the triangle and quad weights*/
+	if (wtable->len < 4) {
+		wtable->weight_table = MEM_callocN(sizeof(FaceVertWeightEntry)*5, "weight table alloc");
+		wtable->len = 5;
+
+		calc_ss_weights(gridFaces, &wtable->weight_table[4].weight, &wtable->weight_table[3].weight);
+		wtable->weight_table[4].valid = wtable->weight_table[3].valid = 1;
+	}
+	
+	if (wtable->len <= faceLen) {
+		void *tmp = MEM_callocN(sizeof(FaceVertWeightEntry)*(faceLen+1), "weight table alloc 2");
+		
+		memcpy(tmp, wtable->weight_table, sizeof(FaceVertWeightEntry)*wtable->len);
+		MEM_freeN(wtable->weight_table);
+		
+		wtable->weight_table = tmp;
+		wtable->len = faceLen+1;
+	}
+
+	if (!wtable->weight_table[faceLen].valid) {
+		/*ok, need to calculate weights here*/
+		wtable->weight_table[faceLen].weight =
+			MEM_callocN(sizeof(FaceVertWeight)*gridFaces*gridFaces, 
+			            "vert face weight");
+		wtable->weight_table[faceLen].valid = 1;
+	}
+
+	return wtable->weight_table[faceLen].weight;
+}
+
+void free_ss_weights(WeightTable *wtable)
+{
+	int i;
+
+	for (i=0; i<wtable->len; i++) {
+		if (wtable->weight_table[i].valid)
+			MEM_freeN(wtable->weight_table[i].weight);
+	}
+}
+
 static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
                                  int drawInteriorEdges, int useSubsurfUv,
                                  DerivedMesh *dm, MultiresSubsurf *ms)
@@ -493,11 +548,13 @@
 	int totvert, totedge, totface;
 	MVert *mvert;
 	MEdge *med;
+	float *w = NULL;
+	WeightTable wtable;
+	V_DECLARE(w);
 	MFace *mf;
 	int *origIndex;
-	FaceVertWeight *qweight, *tweight;
 
-	calc_ss_weights(gridFaces, &qweight, &tweight);
+	memset(&wtable, 0, sizeof(wtable));
 
 	/* vert map */
 	totvert = ccgSubSurf_getNumVerts(ss);
@@ -554,7 +611,7 @@
 	for(index = 0; index < totface; index++) {
 		CCGFace *f = faceMap2[index];
 		int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
-		FaceVertWeight *weight = (numVerts == 4) ? qweight : tweight;
+		FaceVertWeight *weight = get_ss_weights(&wtable, gridFaces, numVerts);
 
 		V_RESET(vertIdx);
 
@@ -572,19 +629,22 @@
 		++origIndex;
 		i++;
 
+		V_RESET(w);
+		for (x=0; x<numVerts; x++) {
+			V_GROW(w);
+		}
 
-#if 0 //BMESH_TODO
 		for(S = 0; S < numVerts; S++) {
 			int prevS = (S - 1 + numVerts) % numVerts;
 			int nextS = (S + 1) % numVerts;
-			int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3;
+			int otherS = (numVerts >= 4) ? (S + 2) % numVerts : 3;
 
 			for(x = 1; x < gridFaces; x++) {
-				float w[4];
 				w[prevS]  = weight[x][0][0];
 				w[S]      = weight[x][0][1];
 				w[nextS]  = weight[x][0][2];
 				w[otherS] = weight[x][0][3];
+
 				DM_interp_vert_data(dm, result, vertIdx, w, numVerts, i);
 				VecCopyf(mvert->co,
 				         ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
@@ -595,20 +655,25 @@
 				i++;
 			}
 		}
+		
+		V_RESET(w);
+		for (x=0; x<numVerts; x++) {
+			V_GROW(w);
+		}
 
 		for(S = 0; S < numVerts; S++) {
 			int prevS = (S - 1 + numVerts) % numVerts;
 			int nextS = (S + 1) % numVerts;
 			int otherS = (numVerts == 4) ? (S + 2) % numVerts : 3;
-
+			
 			for(y = 1; y < gridFaces; y++) {
 				for(x = 1; x < gridFaces; x++) {
-					float w[4];
 					w[prevS]  = weight[y * gridFaces + x][0][0];
 					w[S]      = weight[y * gridFaces + x][0][1];
 					w[nextS]  = weight[y * gridFaces + x][0][2];
 					w[otherS] = weight[y * gridFaces + x][0][3];
 					DM_interp_vert_data(dm, result, vertIdx, w, numVerts, i);
+
 					VecCopyf(mvert->co,
 					         ccgSubSurf_getFaceGridData(ss, f, S, x, y));
 					*origIndex = ORIGINDEX_NONE;
@@ -618,7 +683,6 @@
 				}
 			}
 		}
-#endif
 		*((int*)ccgSubSurf_getFaceUserData(ss, f)) = faceBase;
 		faceBase += 1 + numVerts * ((gridSize-2) + (gridSize-2) * (gridSize-2));
 	}
@@ -634,12 +698,14 @@
 		vertIdx[0] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
 		v = ccgSubSurf_getEdgeVert1(e);
 		vertIdx[1] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
+		
+		for(x = 1; x < edgeSize - 1; x++) {
+			float w2[2];
 
-		for(x = 1; x < edgeSize - 1; x++) {
-			float w[2];
-			w[1] = (float) x / (edgeSize - 1);
-			w[0] = 1 - w[1];
-			DM_interp_vert_data(dm, result, vertIdx, w, 2, i);
+			w2[1] = (float) x / (edgeSize - 1);
+			w2[0] = 1 - w2[1];

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list