[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22531] branches/bmesh/blender/source/ blender/blenkernel/intern: subsurf interpolation works for per-face data ( uvs/vcol) in editmode.

Joseph Eagar joeedh at gmail.com
Sun Aug 16 21:55:05 CEST 2009


Revision: 22531
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22531
Author:   joeedh
Date:     2009-08-16 21:55:05 +0200 (Sun, 16 Aug 2009)

Log Message:
-----------
subsurf interpolation works for per-face data (uvs/vcol) in editmode.  still need to do edge and vert data and object mode.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-08-16 19:50:00 UTC (rev 22530)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2009-08-16 19:55:05 UTC (rev 22531)
@@ -591,7 +591,6 @@
 }
 
 ///
-
 static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3])
 {
 	DerivedMesh *dm = CDDM_from_mesh(me, ob);

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-08-16 19:50:00 UTC (rev 22530)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2009-08-16 19:55:05 UTC (rev 22531)
@@ -477,6 +477,7 @@
 /* face weighting */
 typedef struct FaceVertWeightEntry {
 	FaceVertWeight *weight;
+	float *w;
 	int valid;
 } FaceVertWeightEntry;
 
@@ -485,10 +486,56 @@
 	int len;
 } WeightTable;
 
-static FaceVertWeight *get_ss_weights(WeightTable *wtable, int gridFaces, int faceLen)
+static float *get_ss_weights(WeightTable *wtable, int gridCuts, int faceLen)
 {
-	int i;
+	int x, y, i, j;
+	float *w, w1, w2, w4, fac, fac2, fx, fy;
 
+	if (wtable->len <= faceLen) {
+		void *tmp = MEM_callocN(sizeof(FaceVertWeightEntry)*(faceLen+1), "weight table alloc 2");
+		
+		if (wtable->len) {
+			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) {
+		wtable->weight_table[faceLen].valid = 1;
+		wtable->weight_table[faceLen].w = w = MEM_callocN(sizeof(float)*faceLen*faceLen*(gridCuts+2)*(gridCuts+2), "weight table alloc");
+		fac = 1.0 / (float)faceLen;
+
+		for (i=0; i<faceLen; i++) {
+			for (x=0; x<gridCuts+2; x++) {
+				for (y=0; y<gridCuts+2; y++) {
+					fx = 0.5f - (float)x / (float)(gridCuts+1) / 2.0f;
+					fy = 0.5f - (float)y / (float)(gridCuts+1) / 2.0f;
+				
+					fac2 = faceLen - 4;
+					w1 = (1.0f - fx) * (1.0f - fy) + (-fac2*fx*fy*fac);
+					w2 = (1.0f - fx + fac2*fx*-fac) * (fy);
+					w4 = (fx) * (1.0 - fy + -fac2*fy*fac);
+					
+					fac2 = 1.0 - (w1+w2+w4);
+					fac2 = fac2 / (float)(faceLen-3);
+					for (j=0; j<faceLen; j++)
+						w[j] = fac2;
+					
+					w[i] = w1;
+					w[(i-1+faceLen)%faceLen] = w2;
+					w[(i+1)%faceLen] = w4;
+
+					w += faceLen;
+				}
+			}
+		}
+	}
+
+	return wtable->weight_table[faceLen].w;
+#if 0
 	/*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");
@@ -508,16 +555,8 @@
 		wtable->len = faceLen+1;
 	}
 
-	if (!wtable->weight_table[faceLen].valid) {
-		wtable->weight_table[faceLen].weight =
-			MEM_callocN(sizeof(FaceVertWeight)*gridFaces*gridFaces, 
-			            "vert face weight");
-		wtable->weight_table[faceLen].valid = 1;
-
-		/*ok, need to calculate weights here*/
-	}
-
 	return wtable->weight_table[faceLen].weight;
+#endif
 }
 
 void free_ss_weights(WeightTable *wtable)
@@ -526,7 +565,7 @@
 
 	for (i=0; i<wtable->len; i++) {
 		if (wtable->weight_table[i].valid)
-			MEM_freeN(wtable->weight_table[i].weight);
+			MEM_freeN(wtable->weight_table[i].w);
 	}
 }
 
@@ -614,7 +653,7 @@
 	for(index = 0; index < totface; index++) {
 		CCFace *f = faceMap2[index];
 		int x, y, S, numVerts = CCS_getFaceNumVerts(f);
-		FaceVertWeight *weight = get_ss_weights(&wtable, gridFaces, numVerts);
+		FaceVertWeight *weight = 0;//get_ss_weights(&wtable, gridFaces-1, numVerts);
 
 		V_RESET(vertIdx);
 
@@ -625,7 +664,9 @@
 			vertIdx[S] = GET_INT_FROM_POINTER(CCS_getVertVertHandle(v));
 		}
 
+#if 0
 		DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
+#endif
 		VecCopyf(mvert->co, CCS_getFaceCenterData(f));
 		*origIndex = ORIGINDEX_NONE;
 		++mvert;
@@ -643,12 +684,14 @@
 			int otherS = (numVerts >= 4) ? (S + 2) % numVerts : 3;
 
 			for(x = 1; x < gridFaces; x++) {
+#if 0
 				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);
+#endif
 				VecCopyf(mvert->co,
 				         CCS_getFaceGridEdgeData(ss, f, S, x));
 
@@ -671,11 +714,13 @@
 			
 			for(y = 1; y < gridFaces; y++) {
 				for(x = 1; x < gridFaces; x++) {
+#if 0
 					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);
+#endif
 
 					VecCopyf(mvert->co,
 					         CCS_getFaceGridData(ss, f, S, x, y));
@@ -837,7 +882,7 @@
 		}
 
 		for(S = 0; S < numVerts; S++) {
-			FaceVertWeight *weight = get_ss_weights(&wtable, gridFaces, numVerts);
+			FaceVertWeight *weight = 0;//get_ss_weights(&wtable, gridFaces-1, numVerts);
 			
 			for(y = 0; y < gridFaces; y++) {
 				for(x = 0; x < gridFaces; x++) {
@@ -851,7 +896,7 @@
 					                      edgeSize, gridSize);
 					mf->mat_nr = mat_nr;
 					mf->flag = flag;
-#if 1 //BMESH_TODO
+#if 0 //BMESH_TODO
 					if(dm) {
 						int prevS = (S - 1 + numVerts) % numVerts;
 						int nextS = (S + 1) % numVerts;
@@ -2475,6 +2520,49 @@
 	}
 }
 
+
+void ccg_loops_to_corners(CustomData *fdata, CustomData *ldata, 
+			  CustomData *pdata, int loopstart, int findex, 
+			  int polyindex, int numTex, int numCol) 
+{
+	MTFace *texface;
+	MTexPoly *texpoly;
+	MCol *mcol;
+	MLoopCol *mloopcol;
+	MLoopUV *mloopuv;
+	int i, j;
+
+	for(i=0; i < numTex; i++){
+		texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
+		texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
+		
+		texface->tpage = texpoly->tpage;
+		texface->flag = texpoly->flag;
+		texface->transp = texpoly->transp;
+		texface->mode = texpoly->mode;
+		texface->tile = texpoly->tile;
+		texface->unwrap = texpoly->unwrap;
+
+		mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, loopstart, i);
+		for (j=0; j<4; j++, mloopuv++) {
+			texface->uv[j][0] = mloopuv->uv[0];
+			texface->uv[j][1] = mloopuv->uv[1];
+		}
+	}
+
+	for(i=0; i < numCol; i++){
+		mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, loopstart, i);
+		mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
+
+		for (j=0; j<4; j++, mloopcol++) {
+			mcol[j].r = mloopcol->r;
+			mcol[j].g = mloopcol->g;
+			mcol[j].b = mloopcol->b;
+			mcol[j].a = mloopcol->a;
+		}
+	}
+}
+
 static CCGDerivedMesh *getCCGDerivedMesh(CSubSurf *ss,
                                          int drawInteriorEdges,
                                          int useSubsurfUv,
@@ -2495,17 +2583,20 @@
 	int loopindex, loopindex2;
 	int edgeSize;
 	int gridSize;
-	int gridFaces;
+	int gridFaces, gridCuts;
 	int gridSideVerts;
 	/*int gridInternalVerts; - as yet unused */
 	int gridSideEdges;
+	int numTex, numCol;
 	int gridInternalEdges;
 	int index2;
 	float *w = NULL;
 	DMFaceIter *dfiter, *dfiter2;
 	DMLoopIter *dliter, *dliter2;
+	WeightTable wtable = {0};
 	V_DECLARE(w);
 	/* MVert *mvert = NULL; - as yet unused */
+	MCol *mcol;
 	MEdge *medge = NULL;
 	MFace *mface = NULL;
 	/*a spare loop that's not used by anything*/
@@ -2520,6 +2611,14 @@
 	DM_add_tessface_layer(&cgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
 	DM_add_face_layer(&cgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
 	DM_add_edge_layer(&cgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
+	
+	numTex = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPUV);
+	numCol = CustomData_number_of_layers(&cgdm->dm.loopData, CD_MLOOPCOL);
+	
+	if (numTex && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MTFACE)==0)
+		CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, CCS_getNumFinalFaces(ss));
+	else if (numCol && CustomData_number_of_layers(&cgdm->dm.faceData, CD_MCOL)==0)
+		CustomData_from_bmeshpoly(&cgdm->dm.faceData, &cgdm->dm.polyData, &cgdm->dm.loopData, CCS_getNumFinalFaces(ss));
 
 	CustomData_set_layer_flag(&cgdm->dm.faceData, CD_FLAGS, CD_FLAG_NOCOPY);
 	CustomData_set_layer_flag(&cgdm->dm.edgeData, CD_FLAGS, CD_FLAG_NOCOPY);
@@ -2604,6 +2703,7 @@
 	gridSize = CCS_getGridSize(ss);
 	gridFaces = gridSize - 1;
 	gridSideVerts = gridSize - 2;
+	gridCuts = gridSize - 2;
 	/*gridInternalVerts = gridSideVerts * gridSideVerts; - as yet, unused */
 	gridSideEdges = gridSize - 1;
 	gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2; 
@@ -2626,6 +2726,11 @@
 	polyOrigIndex = DM_get_face_data_layer(&cgdm->dm, CD_ORIGINDEX);
 	polyFlags = DM_get_face_data_layer(&cgdm->dm, CD_FLAGS);
 
+	if (!CustomData_has_layer(&cgdm->dm.faceData, CD_MCOL))
+		DM_add_tessface_layer(&cgdm->dm, CD_MCOL, CD_CALLOC, NULL);
+
+	mcol = DM_get_tessface_data_layer(&cgdm->dm, CD_MCOL);
+
 	index2 = 0;
 	dfiter = dm->newFaceIter(dm);
 	dfiter2 = cgdm->dm.newFaceIter(cgdm);
@@ -2636,6 +2741,7 @@
 		int numFinalEdges = numVerts * (gridSideEdges + gridInternalEdges);
 		int mapIndex = cgdm_getFaceMapIndex(ss, f);
 		int origIndex = GET_INT_FROM_POINTER(CCS_getFaceFaceHandle(ss, f));
+		int g2_wid = gridCuts+2;
 		int s, x, y;
 
 		cgdm->faceMap[index].startVert = vertNum;
@@ -2646,30 +2752,58 @@
 		V_RESET(loopidx);
 
 		for (s=0; s<numVerts; s++) {
-			V_GROW(w);
-			if (s % 2==0) {
-				V_GROW(loopidx);
-				loopidx[s/2] = loopindex++;
-			}
-
-			w[s] = 1.0f / ((float)numVerts);
+			V_GROW(loopidx);
+			loopidx[s] = loopindex++;
 		}
 
+		w = get_ss_weights(&wtable, gridCuts, numVerts);
+
 		/* set the face base vert */
 		*((int*)CCS_getFaceUserData(ss, f)) = vertNum;
 		for (s=0; s<numVerts; s++) {
-			for (y=0; y<gridFaces; y++) {
-				for (x=0; x<gridFaces; x++) {
-					for (i=0; i<4; i++) {
-						float f1, f2;
+			int x1, y1;
 
-						//CustomData_interp(&dm->loopData, &cgdm->dm.loopData, 
-						//                  loopidx, w, NULL, numVerts/2, loopindex2);
+			for (y1=0; y1<gridFaces; y1++) {
+				for (x1=0; x1<gridFaces; x1++) {
+					float *w2;
 
-						loopindex2++;
-					}
+					x = x1; //gridFaces - x1 - 1;
+					y = y1; //gridFaces - y1 - 1;
+					//for (i=0; i<4; i++) {
+						/*float f1, f2;
+						f1 = (float)x / ((float)gridFaces-1.0f);
+						f2 = (float)y / ((float)gridFaces-1.0f);
 
+						mcol->r = f1*255.0f;
+						mcol->g = f2*255.0f;
+						mcol->b = 0;*/
+
+					w2 = w + s*numVerts*g2_wid*g2_wid + (y*g2_wid+x)*numVerts;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list