[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35630] branches/bmesh/blender/source/ blender: =bmesh= fixed bunches of modifier stack bugs

Joseph Eagar joeedh at gmail.com
Sat Mar 19 22:33:34 CET 2011


Revision: 35630
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35630
Author:   joeedh
Date:     2011-03-19 21:33:33 +0000 (Sat, 19 Mar 2011)
Log Message:
-----------
=bmesh= fixed bunches of modifier stack bugs

Modified Paths:
--------------
    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/subsurf_ccg.c
    branches/bmesh/blender/source/blender/editors/object/object_vgroup.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_armature.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_curve.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_hook.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_lattice.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -881,7 +881,7 @@
 	unsigned char *wtcol;
 	unsigned char(*wlcol)[4] = NULL;
 	BLI_array_declare(wlcol);
-	int i, totface=dm->getNumTessFaces(dm), totpoly=dm->getNumFaces, totloop;
+	int i, totface=dm->getNumTessFaces(dm), totloop;
 	int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX);
 	
 	wtcol = MEM_callocN (sizeof (unsigned char) * totface*4*4, "weightmap");
@@ -889,11 +889,12 @@
 	/*first add colors to the tesselation faces*/
 	memset(wtcol, 0x55, sizeof (unsigned char) * totface*4*4);
 	for (i=0; i<totface; i++, mf++) {
-		calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4]); 
-		calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4]); 
-		calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4]); 
+		/*origindex being NULL means we're operating on original mesh data*/
+		calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v1] : mf->v1, &wtcol[(i*4 + 0)*4]); 
+		calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v2] : mf->v2, &wtcol[(i*4 + 1)*4]); 
+		calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v3] : mf->v3, &wtcol[(i*4 + 2)*4]); 
 		if (mf->v4)
-			calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4]); 
+			calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v4] : mf->v4, &wtcol[(i*4 + 3)*4]); 
 	}
 	
 	CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, totface);
@@ -904,9 +905,12 @@
 	for (; !dfiter->done; dfiter->step(dfiter)) {
 		dliter = dfiter->getLoopsIter(dfiter);
 		for (; !dliter->done; dliter->step(dliter), totloop++) {
+			int *oi = (int*)dliter->getVertCDData(dliter, CD_ORIGINDEX, -1);
+			
 			BLI_array_growone(wlcol);
-			calc_weightpaint_vert_color(ob, coba, dliter->vindex, (unsigned
-char *)&wlcol[totloop]);			 
+			
+			calc_weightpaint_vert_color(ob, coba, oi ? *oi : dliter->vindex, 
+			                            (unsigned char *)&wlcol[totloop]);			 
 		}
 	}
 
@@ -1108,9 +1112,6 @@
 					CDDM_calc_normals(dm);
 				}
 
-				if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
-					add_weight_mcol_dm(ob, dm);
-
 				/* Constructive modifiers need to have an origindex
 				 * otherwise they wont have anywhere to copy the data from.
 				 *
@@ -1133,6 +1134,10 @@
 					orig = DM_get_face_data_layer(dm, CD_ORIGINDEX);
 					for(i=0; i<dm->numPolyData; i++) *orig++= i;
 				}
+
+				if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
+					add_weight_mcol_dm(ob, dm);
+
 			}
 
 			

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -1634,7 +1634,7 @@
 	return dm;
 }
 
-DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
+DerivedMesh *disabled__CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
 {
 	DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
 	                           BLI_countlist(&em->edges),
@@ -2025,10 +2025,10 @@
 	CDDM_LoopIter *iter = self;
 
 	if (layer == -1) return CustomData_get(&iter->cddm->dm.vertData, 
-		                               iter->cddm->mloop[iter->head.vindex].v,
+		                               iter->cddm->mloop[iter->head.index].v,
 					       type);
 	else return CustomData_get_n(&iter->cddm->dm.vertData, type, 
-	                             iter->cddm->mloop[iter->head.vindex].v, layer);
+	                             iter->cddm->mloop[iter->head.index].v, layer);
 }
 
 DMLoopIter *cddmiter_get_loopiter(void *self)

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -896,7 +896,7 @@
 #endif
 }
 
-static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
+static int ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
 									 float (*vertexCos)[3], int useFlatSubdiv)
 {
 	float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
@@ -976,7 +976,7 @@
 				hasGivenError = 1;
 			}
 
-			return;
+			return 0;
 		}
 
 		((int*)ccgSubSurf_getFaceUserData(ss, f))[1] = (index)? *index++: i;
@@ -986,6 +986,7 @@
 	ccgSubSurf_processSync(ss);
 
 	BLI_array_free(fVerts);
+	return 1;
 }
 
 /***/
@@ -3106,7 +3107,7 @@
 	ccgdm->useSubsurfUv = useSubsurfUv;
 
 	totvert = ccgSubSurf_getNumVerts(ss);
-	ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
+	ccgdm->vertMap = MEM_callocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
 	vi = ccgSubSurf_getVertIterator(ss);
 	for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 		CCGVert *v = ccgVertIterator_getCurrent(vi);
@@ -3116,7 +3117,7 @@
 	ccgVertIterator_free(vi);
 
 	totedge = ccgSubSurf_getNumEdges(ss);
-	ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap");
+	ccgdm->edgeMap = MEM_callocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap");
 	ei = ccgSubSurf_getEdgeIterator(ss);
 	for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 		CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
@@ -3125,7 +3126,7 @@
 	}
 
 	totface = ccgSubSurf_getNumFaces(ss);
-	ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), "faceMap");
+	ccgdm->faceMap = MEM_callocN(totface * sizeof(*ccgdm->faceMap), "faceMap");
 	fi = ccgSubSurf_getFaceIterator(ss);
 	for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 		CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -3458,7 +3459,14 @@
 			smd->mCache = ss = _getSubSurf(smd->mCache, levels,
 										   useAging, 0, useSimple);
 
-			ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
+			if (!ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple)) {
+				//ccgSubSurf_free(smd->mCache);
+				smd->mCache = ss = _getSubSurf(NULL, levels,
+											   useAging, 0, useSimple);
+				
+				ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
+	
+			}
 
 			result = getCCGDerivedMesh(smd->mCache,
 									   drawInteriorEdges,

Modified: branches/bmesh/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/object/object_vgroup.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/editors/object/object_vgroup.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -292,12 +292,12 @@
 
 	for(i=0; i<dvert_tot; i++, dvf++, dv++) {
 		if((*dv)->dw)
-			MEM_freeN((*dv)->dw);
+			BLI_cellalloc_free((*dv)->dw);
 
 		*(*dv)= *(*dvf);
 
 		if((*dv)->dw)
-			(*dv)->dw= MEM_dupallocN((*dv)->dw);
+			(*dv)->dw= BLI_cellalloc_dupalloc((*dv)->dw);
 	}
 
 	MEM_freeN(dvert_array);
@@ -365,7 +365,7 @@
 			 * left then just remove the deform weight
 			 */
 			else {
-				MEM_freeN(dvert->dw);
+				BLI_cellalloc_free(dvert->dw);
 				dvert->dw = NULL;
 				break;
 			}
@@ -1186,7 +1186,7 @@
 							if(dvert->dw){
 								memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
 								memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
-								MEM_freeN(dvert->dw);
+								BLI_cellalloc_free(dvert->dw);
 							}
 							dvert->dw=newdw;
 						}
@@ -1280,7 +1280,7 @@
 		else if(ob->type==OB_LATTICE) {
 			Lattice *lt= vgroup_edit_lattice(ob);
 			if(lt->dvert) {
-				MEM_freeN(lt->dvert);
+				BLI_cellalloc_free(lt->dvert);
 				lt->dvert= NULL;
 			}
 		}
@@ -1320,7 +1320,7 @@
 	else if(ob->type==OB_LATTICE) {
 		Lattice *lt= vgroup_edit_lattice(ob);
 		if(lt->dvert) {
-			MEM_freeN(lt->dvert);
+			BLI_cellalloc_free(lt->dvert);
 			lt->dvert= NULL;
 		}
 	}

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_armature.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_armature.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_armature.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -137,13 +137,13 @@
 }
 
 static void deformVertsEM(
-					   ModifierData *md, Object *ob, struct EditMesh *editData,
+					   ModifierData *md, Object *ob, struct BMEditMesh *editData,
 	DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
 {
 	ArmatureModifierData *amd = (ArmatureModifierData*) md;
 	DerivedMesh *dm = derivedData;
 
-	if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
+	if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
 
 	armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts,
 				  amd->deformflag, NULL, amd->defgrp_name);
@@ -152,14 +152,14 @@
 }
 
 static void deformMatricesEM(
-						  ModifierData *md, Object *ob, struct EditMesh *editData,
+						  ModifierData *md, Object *ob, struct BMEditMesh *editData,
 	   DerivedMesh *derivedData, float (*vertexCos)[3],
 						 float (*defMats)[3][3], int numVerts)
 {
 	ArmatureModifierData *amd = (ArmatureModifierData*) md;
 	DerivedMesh *dm = derivedData;
 
-	if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
+	if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
 
 	armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
 				  amd->deformflag, NULL, amd->defgrp_name);

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_curve.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_curve.c	2011-03-19 18:23:21 UTC (rev 35629)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_curve.c	2011-03-19 21:33:33 UTC (rev 35630)
@@ -125,12 +125,12 @@
 }
 
 static void deformVertsEM(
-					ModifierData *md, Object *ob, struct EditMesh *editData,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list