diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-07-05 16:20:49 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-07-05 16:20:49 +0400 |
commit | efeb8148c8dc03a08121767492e34fa31c70d72b (patch) | |
tree | bd0fdcd50540693012ebb47b26b6a61fc4d7b32e | |
parent | 5bacd2df29855e0628d8a48c1f0321b8d1c429ac (diff) |
Fix #22213: applying deform modifier in front of multires modifier crashes,
should not do multires reshape in this case, but just regular apply.
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 7 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 11 |
3 files changed, 14 insertions, 7 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index e8bbb58a895..39fc795e6ff 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -47,7 +47,8 @@ void multires_force_external_reload(struct Object *ob); 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 *); diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 76d82889cda..56d517f1e13 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -75,11 +75,11 @@ DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob 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 multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm 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); diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index ec142d23a1f..0661b675668 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -399,7 +399,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, 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 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, 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; } |