[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43066] branches/bmesh/blender/source/ blender/blenkernel/intern/DerivedMesh.c: fix for crash in the modifier stack when applying a deform modifier after a constructive modifier , also sync minor edits with trunk.

Campbell Barton ideasman42 at gmail.com
Mon Jan 2 07:53:19 CET 2012


Revision: 43066
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43066
Author:   campbellbarton
Date:     2012-01-02 06:53:09 +0000 (Mon, 02 Jan 2012)
Log Message:
-----------
fix for crash in the modifier stack when applying a deform modifier after a constructive modifier, also sync minor edits with trunk.

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

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-01-02 03:52:10 UTC (rev 43065)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2012-01-02 06:53:09 UTC (rev 43066)
@@ -1298,7 +1298,7 @@
 
 			/* if this is not the last modifier in the stack then recalculate the normals
 			 * to avoid giving bogus normals to the next modifier see: [#23673] */
-			if(dm && isPrevDeform &&  mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+			if(isPrevDeform &&  mti->dependsOnNormals && mti->dependsOnNormals(md)) {
 				/* XXX, this covers bug #23673, but we may need normal calc for other types */
 				if(dm && dm->type == DM_TYPE_CDDM) {
 					CDDM_apply_vert_coords(dm, deformedVerts);
@@ -1453,12 +1453,10 @@
 		dm->release(dm);
 
 		CDDM_apply_vert_coords(finaldm, deformedVerts);
-
 		CDDM_calc_normals(finaldm);
 
 		if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
 			add_weight_mcol_dm(ob, finaldm, draw_flag);
-
 	} else if(dm) {
 		finaldm = dm;
 	} else {
@@ -1571,7 +1569,7 @@
 	ModifierData *md;
 	float (*deformedVerts)[3] = NULL;
 	CustomDataMask mask;
-	DerivedMesh *dm = NULL, *orcodm = NULL, *finaldm = NULL;
+	DerivedMesh *dm, *orcodm = NULL;
 	int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
 	LinkNode *datamasks, *curr;
 	int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1582,6 +1580,7 @@
 		*cage_r = getEditDerivedBMesh(em, ob, NULL);
 	}
 
+	dm = NULL;
 	md = modifiers_getVirtualModifierList(ob);
 
 	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
@@ -1723,24 +1722,24 @@
 	 * then we need to build one.
 	 */
 	if(dm && deformedVerts) {
-		finaldm = CDDM_copy(dm, 0);
+		*final_r = CDDM_copy(dm, 0);
 
 		if(!(cage_r && dm == *cage_r)) dm->release(dm);
 
 		CDDM_apply_vert_coords(*final_r, deformedVerts);
+		CDDM_calc_normals(*final_r);
 	} else if (dm) {
-		finaldm = dm;
+		*final_r = dm;
+		(*final_r)->calcNormals(*final_r); /* BMESH_ONLY - BMESH_TODO. check if this is needed */
 	} else if (!deformedVerts && cage_r && *cage_r) {
-		finaldm = *cage_r;
+		*final_r = *cage_r;
+		(*final_r)->calcNormals(*final_r); /* BMESH_ONLY - BMESH_TODO. check if this is needed */
 	} else {
-		finaldm = getEditDerivedBMesh(em, ob, deformedVerts);
+		*final_r = getEditDerivedBMesh(em, ob, deformedVerts);
 		deformedVerts = NULL;
+		(*final_r)->calcNormals(*final_r); /* BMESH_ONLY - BMESH_TODO. check if this is needed */
 	}
 
-	finaldm->calcNormals(finaldm);
-
-	*final_r = finaldm;
-
 	/* add an orco layer if needed */
 	if(dataMask & CD_MASK_ORCO)
 		add_orco_dm(ob, em, *final_r, orcodm, CD_ORCO);




More information about the Bf-blender-cvs mailing list