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

Joseph Eagar joeedh at gmail.com
Fri Mar 25 01:32:38 CET 2011


Revision: 35761
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35761
Author:   joeedh
Date:     2011-03-25 00:32:38 +0000 (Fri, 25 Mar 2011)
Log Message:
-----------
=bmesh=

Coded a new modifier, "Precision UV Interpolation", 
that triangulates, subdivides, then uses brecht's mean
value interpolation to interpolate face data.

Textures on ngon faces get interpolated a bit nicer, in 
other words (though concave cases, e.g. 'N', don't work very well).

Modified Paths:
--------------
    branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py
    branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
    branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    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/editbmesh_add.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_image.c
    branches/bmesh/blender/source/blender/editors/transform/transform_conversions.c
    branches/bmesh/blender/source/blender/makesdna/DNA_modifier_types.h
    branches/bmesh/blender/source/blender/makesrna/intern/rna_modifier.c
    branches/bmesh/blender/source/blender/modifiers/CMakeLists.txt
    branches/bmesh/blender/source/blender/modifiers/MOD_modifiertypes.h
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_util.c

Added Paths:
-----------
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c

Modified: branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py
===================================================================
--- branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/release/scripts/ui/properties_data_modifier.py	2011-03-25 00:32:38 UTC (rev 35761)
@@ -69,7 +69,13 @@
 
         col = layout.column()
         col.prop(md, "use_multi_modifier")
-
+	
+    def NGONINTERP(self, layout, ob, md):
+        split = layout.split()
+        
+        col = split.column()
+        col.prop(md, "resolution", text="Res")
+        
     def ARRAY(self, layout, ob, md):
         layout.prop(md, "fit_type")
 

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_cdderivedmesh.h	2011-03-25 00:32:38 UTC (rev 35761)
@@ -116,8 +116,11 @@
    faces*/
 void CDDM_calc_edges_poly(struct DerivedMesh *dm);
 
-/*reconstitute face triangulation*/
-void CDDM_recalc_tesselation(struct DerivedMesh *dm);
+/*reconstitute face triangulation.  if orig_use_polyorig is nonzero, sets
+  the mface origindex layer to copy to the origindex values of the 
+  parent mpolys; otherwise the mface origindex will point to the index of
+  the parent mpoly*/
+void CDDM_recalc_tesselation(struct DerivedMesh *dm, int orig_use_polyorig);
 
 /* lowers the number of vertices/edges/faces in a CDDerivedMesh
  * the layer data stays the same size

Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h	2011-03-25 00:32:38 UTC (rev 35761)
@@ -198,6 +198,11 @@
 
 void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
 
+/*convert a triangle of loop facedata to mface facedata*/
+void mesh_loops_to_tri_corners(struct CustomData *fdata, struct CustomData *ldata, 
+			   struct CustomData *pdata, int lindex[3], int findex, 
+			   int polyindex);
+
 #ifdef __cplusplus
 }
 #endif

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-03-25 00:32:38 UTC (rev 35761)
@@ -1465,11 +1465,6 @@
 	cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 }
 
-void CDDM_recalc_tesselation(DerivedMesh *dm)
-{
-	cdDM_recalcTesselation(dm);
-}
-
 /*ignores original poly origindex layer*/
 static void cdDM_recalcTesselation2(DerivedMesh *dm)
 {
@@ -1482,6 +1477,14 @@
 	cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
 }
 
+void CDDM_recalc_tesselation(DerivedMesh *dm, int orig_use_polyorig)
+{
+	if (orig_use_polyorig)
+		cdDM_recalcTesselation(dm);
+	else
+		cdDM_recalcTesselation2(dm);
+}
+
 static void cdDM_free_internal(CDDerivedMesh *cddm)
 {
 	if(cddm->fmap) MEM_freeN(cddm->fmap);
@@ -2458,7 +2461,7 @@
 	memcpy(cddm2->mpoly, mpoly, sizeof(MPoly)*BLI_array_count(mpoly));
 	BLI_array_free(mvert); BLI_array_free(medge); BLI_array_free(mloop); BLI_array_free(mpoly);
 
-	CDDM_recalc_tesselation(cddm2);
+	CDDM_recalc_tesselation(cddm2, 1);
 	
 	if (newv) 
 		MEM_freeN(newv); 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-03-25 00:32:38 UTC (rev 35761)
@@ -1890,9 +1890,9 @@
 	}
 }
 
-static void mesh_loops_to_corners(CustomData *fdata, CustomData *ldata, 
-			   CustomData *pdata, int lindex[4], int findex, 
-			   int polyindex, int numTex, int numCol, int tot) 
+void mesh_loops_to_tri_corners(CustomData *fdata, CustomData *ldata, 
+			   CustomData *pdata, int lindex[3], int findex, 
+			   int polyindex) 
 {
 	MTFace *texface;
 	MTexPoly *texpoly;
@@ -1900,7 +1900,9 @@
 	MLoopCol *mloopcol;
 	MLoopUV *mloopuv;
 	int i, j, hasWCol = CustomData_has_layer(ldata, CD_WEIGHT_MLOOPCOL);
-
+	int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+	int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
+	
 	for(i=0; i < numTex; i++){
 		texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
 		texpoly = CustomData_get_n(pdata, CD_MTEXPOLY, polyindex, i);
@@ -1912,7 +1914,7 @@
 		texface->tile = texpoly->tile;
 		texface->unwrap = texpoly->unwrap;
 
-		for (j=0; j<tot; j++) {
+		for (j=0; j<3; j++) {
 			mloopuv = CustomData_get_n(ldata, CD_MLOOPUV, lindex[j], i);
 			texface->uv[j][0] = mloopuv->uv[0];
 			texface->uv[j][1] = mloopuv->uv[1];
@@ -1922,7 +1924,7 @@
 	for(i=0; i < numCol; i++){
 		mcol = CustomData_get_n(fdata, CD_MCOL, findex, i);
 
-		for (j=0; j<tot; j++) {
+		for (j=0; j<3; j++) {
 			mloopcol = CustomData_get_n(ldata, CD_MLOOPCOL, lindex[j], i);
 			mcol[j].r = mloopcol->r;
 			mcol[j].g = mloopcol->g;
@@ -1934,7 +1936,7 @@
 	if (hasWCol) {
 		mcol = CustomData_get(fdata,  findex, CD_WEIGHT_MCOL);
 
-		for (j=0; j<tot; j++) {
+		for (j=0; j<3; j++) {
 			mloopcol = CustomData_get(ldata, lindex[j], CD_WEIGHT_MLOOPCOL);
 			mcol[j].r = mloopcol->r;
 			mcol[j].g = mloopcol->g;
@@ -2059,8 +2061,8 @@
 		mf->v2 = mloop[mf->v2].v;
 		mf->v3 = mloop[mf->v3].v;
 
-		mesh_loops_to_corners(fdata, ldata, pdata,
-			lindex, i, mf->v4, numTex, numCol, 3);
+		mesh_loops_to_tri_corners(fdata, ldata, pdata,
+			lindex, i, mf->v4);
 		
 		mf->v4 = 0;
 	}

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-03-25 00:23:02 UTC (rev 35760)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-03-25 00:32:38 UTC (rev 35761)
@@ -517,383 +517,6 @@
 	CDDM_calc_normals(result);
 
 	return result;
-#if 0
-	DerivedMesh *result;
-	int edgeSize = ccgSubSurf_getEdgeSize(ss);
-	int gridSize = ccgSubSurf_getGridSize(ss);
-	int gridFaces = gridSize - 1;
-	int edgeBase, faceBase;
-	int i, j, k, S, x, y, index;
-	int *vertIdx = NULL;
-	BLI_array_declare(vertIdx);
-	CCGVertIterator *vi;
-	CCGEdgeIterator *ei;
-	CCGFaceIterator *fi;
-	CCGFace **faceMap2;
-	CCGEdge **edgeMap2;
-	CCGVert **vertMap2;
-	int totvert, totedge, totface;
-	MVert *mvert;
-	MEdge *med;
-	float *w = NULL;
-	WeightTable wtable;
-	BLI_array_declare(w);
-	MFace *mf;
-	int *origIndex;
-
-	memset(&wtable, 0, sizeof(wtable));
-
-	/* vert map */
-	totvert = ccgSubSurf_getNumVerts(ss);
-	vertMap2 = MEM_mallocN(totvert*sizeof(*vertMap2), "vertmap");
-	vi = ccgSubSurf_getVertIterator(ss);
-	for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
-		CCGVert *v = ccgVertIterator_getCurrent(vi);
-
-		vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
-	}
-	ccgVertIterator_free(vi);
-
-	totedge = ccgSubSurf_getNumEdges(ss);
-	edgeMap2 = MEM_mallocN(totedge*sizeof(*edgeMap2), "edgemap");
-	ei = ccgSubSurf_getEdgeIterator(ss);
-	for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
-		CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
-
-		edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
-	}
-
-	totface = ccgSubSurf_getNumFaces(ss);
-	faceMap2 = MEM_mallocN(totface*sizeof(*faceMap2), "facemap");
-	fi = ccgSubSurf_getFaceIterator(ss);
-	for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
-		CCGFace *f = ccgFaceIterator_getCurrent(fi);
-
-		faceMap2[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(ss, f))] = f;
-	}
-	ccgFaceIterator_free(fi);
-
-	if(ms) {
-		result = MultiresDM_new(ms, dm, ccgSubSurf_getNumFinalVerts(ss),
-					ccgSubSurf_getNumFinalEdges(ss),
-					ccgSubSurf_getNumFinalFaces(ss), 0, 0);
-	}
-	else {
-		if(dm) {
-			result = CDDM_from_template(dm, ccgSubSurf_getNumFinalVerts(ss),
-						    ccgSubSurf_getNumFinalEdges(ss),
-						    ccgSubSurf_getNumFinalFaces(ss), 0, 0);
-		} else {
-			result = CDDM_new(ccgSubSurf_getNumFinalVerts(ss),
-					  ccgSubSurf_getNumFinalEdges(ss),
-					  ccgSubSurf_getNumFinalFaces(ss), 0, 0);
-		}
-	}
-
-	// load verts
-	faceBase = i = 0;
-	mvert = CDDM_get_verts(result);
-	origIndex = result->getVertData(result, 0, CD_ORIGINDEX);
-
-	for(index = 0; index < totface; index++) {
-		CCGFace *f = faceMap2[index];
-		int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
-		FaceVertWeight *weight = 0;//get_ss_weights(&wtable, gridFaces-1, numVerts);
-
-		BLI_array_empty(vertIdx);
-
-		for(S = 0; S < numVerts; S++) {
-			CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
-			BLI_array_growone(vertIdx);
-
-			vertIdx[S] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
-		}
-
-#if 0
-		DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
-#endif
-		copy_v3_v3(mvert->co, ccgSubSurf_getFaceCenterData(f));
-		*origIndex = ORIGINDEX_NONE;
-		++mvert;
-		++origIndex;
-		i++;
-
-		BLI_array_empty(w);
-		for (x=0; x<numVerts; x++) {
-			BLI_array_growone(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(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
-				copy_v3_v3(mvert->co,
-				         ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
-
-				*origIndex = ORIGINDEX_NONE;
-				++mvert;
-				++origIndex;
-				i++;
-			}
-		}
-		
-		BLI_array_empty(w);
-		for (x=0; x<numVerts; x++) {
-			BLI_array_growone(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++) {
-#if 0
-					w[prevS]  = weight[y * gridFaces + x][0][0];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list