[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36193] branches/bmesh/blender/source/ blender: =bmesh= odd bug, sometimes edge slide would result in invalid derivedmesh.

Joseph Eagar joeedh at gmail.com
Sun Apr 17 06:12:55 CEST 2011


Revision: 36193
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36193
Author:   joeedh
Date:     2011-04-17 04:12:53 +0000 (Sun, 17 Apr 2011)
Log Message:
-----------
=bmesh= odd bug, sometimes edge slide would result in invalid derivedmesh.  I had to put a recalcData() call into edge slide's free function.  not sure why edge slide but not other transform tools are acting up.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
    branches/bmesh/blender/source/blender/editors/transform/transform.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_explode.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -360,12 +360,12 @@
 
 BMVert *EDBM_get_vert_for_index(BMEditMesh *tm, int index)
 {
-	return tm->vert_index?tm->vert_index[index]:NULL;
+	return tm->vert_index && index < tm->bm->totvert ?tm->vert_index[index]:NULL;
 }
 
 BMEdge *EDBM_get_edge_for_index(BMEditMesh *tm, int index)
 {
-	return tm->edge_index?tm->edge_index[index]:NULL;
+	return tm->edge_index && index < tm->bm->totedge ?tm->edge_index[index]:NULL;
 }
 
 BMFace *EDBM_get_face_for_index(BMEditMesh *tm, int index)

Modified: branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -2104,7 +2104,7 @@
 {
 	BMEditMesh *em = userData;
 	BMEdge *eed = EDBM_get_edge_for_index(userData, index);
-	float *crease = bm_get_cd_float(&em->bm->edata, eed->head.data, CD_CREASE);
+	float *crease = eed ? bm_get_cd_float(&em->bm->edata, eed->head.data, CD_CREASE) : NULL;
 	
 	if (!crease)
 		return 0;

Modified: branches/bmesh/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/transform/transform.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/editors/transform/transform.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -4773,6 +4773,8 @@
 	MEM_freeN(sld);
 	
 	t->customData = NULL;
+	
+	recalcData(t);
 }
 
 void initEdgeSlide(TransInfo *t)

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_explode.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_explode.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_explode.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -201,7 +201,7 @@
 static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
 {
 	MFace *df = CDDM_get_tessface(split, cur);
-	DM_copy_face_data(dm, split, i, cur, 1);
+	DM_copy_tessface_data(dm, split, i, cur, 1);
 	*df = *mf;
 	return df;
 }
@@ -925,7 +925,7 @@
 		if(source.v4)
 			source.v4 = edgecut_get(vertpahash, source.v4, mindex);
 
-		DM_copy_face_data(dm,explode,i,i,1);
+		DM_copy_tessface_data(dm,explode,i,i,1);
 
 		*mf = source;
 
@@ -949,6 +949,7 @@
 
 	/* finalization */
 	CDDM_calc_edges(explode);
+	CDDM_tessfaces_to_faces(explode);
 	CDDM_calc_normals(explode);
 
 	if(psmd->psys->lattice){
@@ -956,10 +957,6 @@
 		psmd->psys->lattice= NULL;
 	}
 
-	dm = CDDM_copy(explode, 1); /*builds ngon faces from tess (mface) faces*/
-	explode->needsFree = 1;
-	explode->release(explode);
-
 	return explode;
 }
 

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -100,7 +100,7 @@
 		dm = copy = CDDM_copy(dm, 0);
 	}
 	
-	CDDM_recalc_tesselation(dm, 0);
+	CDDM_recalc_tesselation(dm, 1);
 	
 	mf = dm->getTessFaceArray(dm);
 	of = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-04-17 02:47:32 UTC (rev 36192)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-04-17 04:12:53 UTC (rev 36193)
@@ -198,7 +198,7 @@
 						int UNUSED(isFinalCalc))
 {
 	int i;
-	DerivedMesh *result, *copy;
+	DerivedMesh *result, *copy, *odm = dm;
 	const SolidifyModifierData *smd = (SolidifyModifierData*) md;
 
 	MVert *mv, *mvert, *orig_mvert;
@@ -241,8 +241,6 @@
 	
 	if (!CDDM_Check(dm)) {
 		DerivedMesh *dm2 = CDDM_copy(dm, 0);
-		dm->needsFree = 1;
-		dm->release(dm);
 		dm = dm2;
 	}
 	
@@ -679,8 +677,8 @@
 		MEM_freeN(edge_vert_nos);
 #endif
 
-		MEM_freeN(new_vert_arr);
-		MEM_freeN(new_edge_arr);
+		BLI_array_free(new_vert_arr);
+		BLI_array_free(new_edge_arr);
 		MEM_freeN(edge_users);
 		MEM_freeN(edge_order);
 	}
@@ -688,13 +686,18 @@
 	if (old_vert_arr)
 		MEM_freeN(old_vert_arr);
 	
-	CDDM_recalc_tesselation(result, 1);
-	
 	/* must recalculate normals with vgroups since they can displace unevenly [#26888] */
 	if(dvert) {
 		CDDM_calc_normals(result);
+	} else {
+		CDDM_recalc_tesselation(result, 1);
 	}
-
+	
+	if (dm != odm) {
+		dm->needsFree = 1;
+		dm->release(dm);
+	}
+	
 	return result;
 }
 




More information about the Bf-blender-cvs mailing list