[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