[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36773] trunk/blender/source/blender: Fix crash when accessing mesh from python while a mesh with a subsurf modifier

Brecht Van Lommel brechtvanlommel at pandora.be
Thu May 19 13:24:56 CEST 2011


Revision: 36773
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36773
Author:   blendix
Date:     2011-05-19 11:24:56 +0000 (Thu, 19 May 2011)
Log Message:
-----------
Fix crash when accessing mesh from python while a mesh with a subsurf modifier
is in editmode.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_subsurf.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c

Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2011-05-19 11:21:37 UTC (rev 36772)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h	2011-05-19 11:24:56 UTC (rev 36773)
@@ -54,7 +54,7 @@
 						struct DerivedMesh *dm,
 						struct SubsurfModifierData *smd,
 						int useRenderParams, float (*vertCos)[3],
-						int isFinalCalc, int editMode);
+						int isFinalCalc, int forEditMode, int inEditMode);
 
 void subsurf_calculate_limit_positions(struct Mesh *me, float (*positions_r)[3]);
 

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2011-05-19 11:21:37 UTC (rev 36772)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2011-05-19 11:24:56 UTC (rev 36773)
@@ -465,7 +465,7 @@
 	return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
 }
 
-static DerivedMesh *subsurf_dm_create_local(Object *UNUSED(ob), DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
 {
 	SubsurfModifierData smd= {{NULL}};
 
@@ -476,7 +476,7 @@
 	if(optimal)
 		smd.flags |= eSubsurfModifierFlag_ControlEdges;
 
-	return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0);
+	return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0, (ob->mode & OB_MODE_EDIT));
 }
 
 

Modified: trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2011-05-19 11:21:37 UTC (rev 36772)
+++ trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2011-05-19 11:24:56 UTC (rev 36773)
@@ -562,7 +562,7 @@
 			ssmd.subdivType	= ME_CC_SUBSURF;		//catmull clark
 			ssmd.levels		= smd->subsurfLevels;	//levels
 
-			ss_mesh = subsurf_make_derived_from_derived(dm, &ssmd, FALSE, NULL, 0, 0);
+			ss_mesh = subsurf_make_derived_from_derived(dm, &ssmd, FALSE, NULL, 0, 0, (ob->mode & OB_MODE_EDIT));
 
 			if(ss_mesh)
 			{

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-05-19 11:21:37 UTC (rev 36772)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2011-05-19 11:24:56 UTC (rev 36773)
@@ -2617,7 +2617,7 @@
 						struct DerivedMesh *dm,
 						struct SubsurfModifierData *smd,
 						int useRenderParams, float (*vertCos)[3],
-						int isFinalCalc, int editMode)
+						int isFinalCalc, int forEditMode, int inEditMode)
 {
 	int useSimple = smd->subdivType == ME_SIMPLE_SUBSURF;
 	int useAging = smd->flags & eSubsurfModifierFlag_DebugIncr;
@@ -2625,7 +2625,7 @@
 	int drawInteriorEdges = !(smd->flags & eSubsurfModifierFlag_ControlEdges);
 	CCGDerivedMesh *result;
 
-	if(editMode) {
+	if(forEditMode) {
 		int levels= (smd->modifier.scene)? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels): smd->levels;
 
 		smd->emCache = _getSubSurf(smd->emCache, levels, useAging, 0,
@@ -2656,7 +2656,7 @@
 		int useAging = smd->flags & eSubsurfModifierFlag_DebugIncr;
 		int levels= (smd->modifier.scene)? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels): smd->levels;
 		CCGSubSurf *ss;
-		
+
 		/* It is quite possible there is a much better place to do this. It
 		 * depends a bit on how rigourously we expect this function to never
 		 * be called in editmode. In semi-theory we could share a single
@@ -2664,8 +2664,11 @@
 		 * the same so we would need some way of converting them. Its probably
 		 * not worth the effort. But then why am I even writing this long
 		 * comment that no one will read? Hmmm. - zr
+		 *
+		 * Addendum: we can't really ensure that this is never called in edit
+		 * mode, so now we have a parameter to verify it. - brecht
 		 */
-		if(smd->emCache) {
+		if(!inEditMode && smd->emCache) {
 			ccgSubSurf_free(smd->emCache);
 			smd->emCache = NULL;
 		}

Modified: trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c	2011-05-19 11:21:37 UTC (rev 36772)
+++ trunk/blender/source/blender/modifiers/intern/MOD_subsurf.c	2011-05-19 11:24:56 UTC (rev 36773)
@@ -91,7 +91,7 @@
 	return get_render_subsurf_level(&md->scene->r, levels) == 0;
 }
 
-static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 						DerivedMesh *derivedData,
 						int useRenderParams,
 						int isFinalCalc)
@@ -100,7 +100,7 @@
 	DerivedMesh *result;
 
 	result = subsurf_make_derived_from_derived(derivedData, smd,
-			useRenderParams, NULL, isFinalCalc, 0);
+			useRenderParams, NULL, isFinalCalc, 0, (ob->flag & OB_MODE_EDIT));
 	
 	if(useRenderParams || !isFinalCalc) {
 		DerivedMesh *cddm= CDDM_copy(result);
@@ -111,7 +111,7 @@
 	return result;
 }
 
-static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
 						struct EditMesh *UNUSED(editData),
 						DerivedMesh *derivedData)
 {
@@ -119,7 +119,7 @@
 	DerivedMesh *result;
 
 	result = subsurf_make_derived_from_derived(derivedData, smd, 0,
-			NULL, 0, 1);
+			NULL, 0, 1, 1);
 
 	return result;
 }




More information about the Bf-blender-cvs mailing list