[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22660] branches/blender2.5/blender/source /blender: 2.5 Multires:

Nicholas Bishop nicholasbishop at gmail.com
Thu Aug 20 19:37:41 CEST 2009


Revision: 22660
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22660
Author:   nicholasbishop
Date:     2009-08-20 19:37:38 +0200 (Thu, 20 Aug 2009)

Log Message:
-----------
2.5 Multires:

* Fixed a memory corruption bug when deleting a multiresmodifier, was hanging on to a bad pointer. Reported on IRC by lusque

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_multires.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/multires.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_multires.h	2009-08-20 16:43:55 UTC (rev 22659)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_multires.h	2009-08-20 17:37:38 UTC (rev 22660)
@@ -35,10 +35,11 @@
 
 typedef struct MultiresSubsurf {
 	struct MultiresModifierData *mmd;
-	struct Mesh *me;
+	struct Object *ob;
 } MultiresSubsurf;
 
 /* MultiresDM */
+struct Object *MultiresDM_get_object(struct DerivedMesh *dm);
 struct Mesh *MultiresDM_get_mesh(struct DerivedMesh *dm);
 struct DerivedMesh *MultiresDM_new(struct MultiresSubsurf *, struct DerivedMesh*, int, int, int);
 void *MultiresDM_get_vertnorm(struct DerivedMesh *);
@@ -59,7 +60,7 @@
 void multires_force_update(struct Object *ob);
 
 struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*,
-						    struct Mesh *, int, int);
+						    struct Object *, int, int);
 
 struct MultiresModifierData *find_multires_modifier(struct Object *ob);
 int multiresModifier_switch_level(struct Object *, const int);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-20 16:43:55 UTC (rev 22659)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2009-08-20 17:37:38 UTC (rev 22660)
@@ -1297,7 +1297,7 @@
 	IndexNode *vert_face_map_mem, *vert_edge_map_mem;
 	int *face_offsets;
 
-	Mesh *me;
+	Object *ob;
 	int modified;
 
 	void (*update)(DerivedMesh*);
@@ -1308,15 +1308,19 @@
 	MultiresDM *mrdm = (MultiresDM*)dm;
 	int mvert_layer;
 
+	/* Check that mmd still exists */
+	if(BLI_findindex(&mrdm->ob->modifiers, mrdm->mmd) < 0)
+		mrdm->mmd = NULL;
+
 	/* Before freeing, need to update the displacement map */
-	if(dm->needsFree && mrdm->modified)
+	if(dm->needsFree && mrdm->modified && mrdm->mmd)
 		mrdm->update(dm);
 
 	/* If the MVert data is being used as the sculpt undo store, don't free it */
 	mvert_layer = CustomData_get_layer_index(&dm->vertData, CD_MVERT);
 	if(mvert_layer != -1) {
 		CustomDataLayer *cd = &dm->vertData.layers[mvert_layer];
-		if(cd->data == mrdm->mmd->undo_verts)
+		if(mrdm->mmd && cd->data == mrdm->mmd->undo_verts)
 			cd->flag |= CD_FLAG_NOFREE;
 	}
 
@@ -1348,7 +1352,7 @@
 	dm = &mrdm->cddm.dm;
 
 	mrdm->mmd = ms->mmd;
-	mrdm->me = ms->me;
+	mrdm->ob = ms->ob;
 
 	if(dm) {
 		MDisps *disps;
@@ -1391,9 +1395,14 @@
 
 Mesh *MultiresDM_get_mesh(DerivedMesh *dm)
 {
-	return ((MultiresDM*)dm)->me;
+	return get_mesh(((MultiresDM*)dm)->ob);
 }
 
+Object *MultiresDM_get_object(DerivedMesh *dm)
+{
+	return ((MultiresDM*)dm)->ob;
+}
+
 void *MultiresDM_get_orco(DerivedMesh *dm)
 {
 	return ((MultiresDM*)dm)->orco;
@@ -1428,10 +1437,11 @@
 ListBase *MultiresDM_get_vert_face_map(DerivedMesh *dm)
 {
 	MultiresDM *mrdm = (MultiresDM*)dm;
+	Mesh *me = mrdm->ob->data;
 
 	if(!mrdm->vert_face_map)
-		create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, mrdm->me->mface,
-				     mrdm->me->totvert, mrdm->me->totface);
+		create_vert_face_map(&mrdm->vert_face_map, &mrdm->vert_face_map_mem, me->mface,
+				     me->totvert, me->totface);
 
 	return mrdm->vert_face_map;
 }
@@ -1439,10 +1449,11 @@
 ListBase *MultiresDM_get_vert_edge_map(DerivedMesh *dm)
 {
 	MultiresDM *mrdm = (MultiresDM*)dm;
+	Mesh *me = mrdm->ob->data;
 
 	if(!mrdm->vert_edge_map)
-		create_vert_edge_map(&mrdm->vert_edge_map, &mrdm->vert_edge_map_mem, mrdm->me->medge,
-				     mrdm->me->totvert, mrdm->me->totedge);
+		create_vert_edge_map(&mrdm->vert_edge_map, &mrdm->vert_edge_map_mem, me->medge,
+				     me->totvert, me->totedge);
 
 	return mrdm->vert_edge_map;
 }
@@ -1450,6 +1461,7 @@
 int *MultiresDM_get_face_offsets(DerivedMesh *dm)
 {
 	MultiresDM *mrdm = (MultiresDM*)dm;
+	Mesh *me = mrdm->ob->data;
 	int i, accum = 0;
 
 	if(!mrdm->face_offsets) {
@@ -1457,11 +1469,11 @@
 		int area = len * len;
 		int t = 1 + len * 3 + area * 3, q = t + len + area;
 
-		mrdm->face_offsets = MEM_callocN(sizeof(int) * mrdm->me->totface, "mrdm face offsets");
-		for(i = 0; i < mrdm->me->totface; ++i) {
+		mrdm->face_offsets = MEM_callocN(sizeof(int) * me->totface, "mrdm face offsets");
+		for(i = 0; i < me->totface; ++i) {
 			mrdm->face_offsets[i] = accum;
 
-			accum += (mrdm->me->mface[i].v4 ? q : t);
+			accum += (me->mface[i].v4 ? q : t);
 		}
 	}
 

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c	2009-08-20 16:43:55 UTC (rev 22659)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c	2009-08-20 17:37:38 UTC (rev 22660)
@@ -8102,14 +8102,13 @@
 						   int useRenderParams, int isFinalCalc)
 {
 	MultiresModifierData *mmd = (MultiresModifierData*)md;
-	Mesh *me = get_mesh(ob);
 	DerivedMesh *final;
 
 	/* TODO: for now just skip a level1 mesh */
 	if(mmd->lvl == 1)
 		return dm;
 
-	final = multires_dm_create_from_derived(mmd, dm, me, useRenderParams, isFinalCalc);
+	final = multires_dm_create_from_derived(mmd, dm, ob, useRenderParams, isFinalCalc);
 	if(mmd->undo_signal && mmd->undo_verts && mmd->undo_verts_tot == final->getNumVerts(final)) {
 		int i;
 		MVert *dst = CDDM_get_verts(final);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/multires.c	2009-08-20 16:43:55 UTC (rev 22659)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/multires.c	2009-08-20 17:37:38 UTC (rev 22660)
@@ -204,10 +204,11 @@
 	a[2] += b[2];
 }
 
-static void multires_subdisp(DerivedMesh *orig, Mesh *me, DerivedMesh *final, int lvl, int totlvl,
+static void multires_subdisp(DerivedMesh *orig, Object *ob, DerivedMesh *final, int lvl, int totlvl,
 			     int totsubvert, int totsubedge, int totsubface, int addverts)
 {
 	DerivedMesh *mrdm;
+	Mesh *me = ob->data;
 	MultiresModifierData mmd_sub;
 	MVert *mvs = CDDM_get_verts(final);
 	MVert *mvd, *mvd_f1, *mvs_f1, *mvd_f3, *mvd_f4;
@@ -222,7 +223,7 @@
 
 	memset(&mmd_sub, 0, sizeof(MultiresModifierData));
 	mmd_sub.lvl = mmd_sub.totlvl = totlvl;
-	mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
+	mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
 		
 	mvd = CDDM_get_verts(mrdm);
 	/* Need to map from ccg to mrdm */
@@ -395,7 +396,7 @@
 		}
 	}
 
-	final->needsFree = 1;
+	final->needsFree  = 1;
 	final->release(final);
 	mrdm->needsFree = 1;
 	MultiresDM_mark_as_modified(mrdm);
@@ -468,7 +469,7 @@
 		orig = CDDM_from_mesh(me, NULL);
 		memset(&mmd_sub, 0, sizeof(MultiresModifierData));
 		mmd_sub.lvl = mmd_sub.totlvl = mmd->lvl;
-		mrdm = multires_dm_create_from_derived(&mmd_sub, orig, me, 0, 0);
+		mrdm = multires_dm_create_from_derived(&mmd_sub, orig, ob, 0, 0);
 		totsubvert = mrdm->getNumVerts(mrdm);
 		totsubedge = mrdm->getNumEdges(mrdm);
 		totsubface = mrdm->getNumFaces(mrdm);
@@ -497,7 +498,7 @@
 
 		orig = CDDM_from_mesh(me, NULL);
 
-		multires_subdisp(orig, me, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
+		multires_subdisp(orig, ob, final, mmd->lvl, mmd->totlvl, totsubvert, totsubedge, totsubface, 0);
 
 		orig->needsFree = 1;
 		orig->release(orig);
@@ -1166,9 +1167,11 @@
 
 static void multiresModifier_update(DerivedMesh *dm)
 {
+	Object *ob;
 	Mesh *me;
 	MDisps *mdisps;
 
+	ob = MultiresDM_get_object(dm);
 	me = MultiresDM_get_mesh(dm);
 	mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
 
@@ -1189,7 +1192,7 @@
 			   (includes older displacements but not new sculpts) */
 			mmd.totlvl = totlvl;
 			mmd.lvl = lvl;
-			subco_dm = multires_dm_create_from_derived(&mmd, orig, me, 0, 0);
+			subco_dm = multires_dm_create_from_derived(&mmd, orig, ob, 0, 0);
 			cur_lvl_orig_verts = CDDM_get_verts(subco_dm);
 
 			/* Subtract the original vertex cos from the new vertex cos */
@@ -1199,7 +1202,7 @@
 
 			final = multires_subdisp_pre(dm, totlvl - lvl, 0);
 
-			multires_subdisp(orig, me, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
+			multires_subdisp(orig, ob, final, lvl, totlvl, dm->getNumVerts(dm), dm->getNumEdges(dm),
 					 dm->getNumFaces(dm), 1);
 
 			subco_dm->release(subco_dm);
@@ -1226,7 +1229,7 @@
 	}
 }
 
-struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Mesh *me,
+struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, DerivedMesh *dm, Object *ob,
 						    int useRenderParams, int isFinalCalc)
 {
 	SubsurfModifierData smd;
@@ -1235,7 +1238,7 @@
 	int i;
 
 	ms.mmd = mmd;
-	ms.me = me;
+	ms.ob = ob;
 
 	memset(&smd, 0, sizeof(SubsurfModifierData));
 	smd.levels = smd.renderLevels = mmd->lvl - 1;

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-20 16:43:55 UTC (rev 22659)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-20 17:37:38 UTC (rev 22660)
@@ -9416,7 +9416,7 @@
 
 					mmd->lvl = mmd->totlvl;
 					orig = CDDM_from_mesh(me, NULL);
-					dm = multires_dm_create_from_derived(mmd, orig, me, 0, 0);
+					dm = multires_dm_create_from_derived(mmd, orig, ob, 0, 0);
                                        
 					multires_load_old(dm, me->mr);
 





More information about the Bf-blender-cvs mailing list