[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29986] trunk/blender/source/blender: Fix #22213: applying deform modifier in front of multires modifier crashes ,

Brecht Van Lommel brecht at blender.org
Mon Jul 5 14:20:49 CEST 2010


Revision: 29986
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29986
Author:   blendix
Date:     2010-07-05 14:20:49 +0200 (Mon, 05 Jul 2010)

Log Message:
-----------
Fix #22213: applying deform modifier in front of multires modifier crashes,
should not do multires reshape in this case, but just regular apply.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_multires.h
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/editors/object/object_modifier.c

Modified: trunk/blender/source/blender/blenkernel/BKE_multires.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_multires.h	2010-07-05 11:52:54 UTC (rev 29985)
+++ trunk/blender/source/blender/blenkernel/BKE_multires.h	2010-07-05 12:20:49 UTC (rev 29986)
@@ -47,7 +47,8 @@
 struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
 	int local_mmd, struct DerivedMesh*, struct Object *, int, int);
 
-struct MultiresModifierData *find_multires_modifier(struct Scene *scene, struct Object *ob);
+struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
+	struct ModifierData *lastmd);
 struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
 				struct Object *ob);
 void multiresModifier_join(struct Object *);

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2010-07-05 11:52:54 UTC (rev 29985)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2010-07-05 12:20:49 UTC (rev 29986)
@@ -75,11 +75,11 @@
 	return dm;
 }
 
-MultiresModifierData *find_multires_modifier(Scene *scene, Object *ob)
+MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *lastmd)
 {
 	ModifierData *md;
 
-	for(md = ob->modifiers.first; md; md = md->next) {
+	for(md = lastmd; md; md = md->prev) {
 		if(md->type == eModifierType_Multires) {
 			if (modifier_isEnabled(scene, md, eModifierMode_Realtime))
 				return (MultiresModifierData*)md;
@@ -249,6 +249,9 @@
 	int numVerts, result;
 	float (*deformedVerts)[3];
 
+	if(multires_get_level(ob, mmd, 0) == 0)
+		return 0;
+
 	/* Create DerivedMesh for deformation modifier */
 	dm = get_multires_dm(scene, mmd, ob);
 	numVerts= dm->getNumVerts(dm);

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2010-07-05 11:52:54 UTC (rev 29985)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2010-07-05 12:20:49 UTC (rev 29986)
@@ -399,7 +399,7 @@
 	if (ob->type==OB_MESH) {
 		DerivedMesh *dm;
 		Mesh *me = ob->data;
-		MultiresModifierData *mmd= find_multires_modifier(scene, ob);
+		MultiresModifierData *mmd= find_multires_modifier_before(scene, md);
 
 		if( me->key) {
 			BKE_report(reports, RPT_ERROR, "Modifier cannot be applied to Mesh with Shape Keys");
@@ -412,12 +412,15 @@
 		if(md->type == eModifierType_Multires)
 			multires_force_update(ob);
 
-		if (mmd && mti->type==eModifierTypeType_OnlyDeform) {
-			multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md);
+		if (mmd && mmd->totlvl && mti->type==eModifierTypeType_OnlyDeform) {
+			if(!multiresModifier_reshapeFromDeformMod (scene, mmd, ob, md)) {
+				BKE_report(reports, RPT_ERROR, "Multires modifier returned error, skipping apply");
+				return 0;
+			}
 		} else {
 			dm = mesh_create_derived_for_modifier(scene, ob, md);
 			if (!dm) {
-				BKE_report(reports, RPT_ERROR, "Modifier is returned error, skipping apply");
+				BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply");
 				return 0;
 			}
 





More information about the Bf-blender-cvs mailing list