Fix #30496: Bugs and crashes about "make links modifers" function.
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 12 Mar 2012 14:35:07 +0000 (14:35 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 12 Mar 2012 14:35:07 +0000 (14:35 +0000)
Was missed check for if modifier is available for particular object type
which ended up with unpredictable results when modifier which isn't supported
yet for some object type as linked to that object type.

source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/object.c
source/blender/editors/object/object_modifier.c

index 1e9bb85b5497eaa2470a3e6974c1946a34687429..f5937304e7606f8302bd8feec91280feede6661f 100644 (file)
@@ -67,6 +67,8 @@ void update_base_layer(struct Scene *scene, struct Object *ob);
 void free_object(struct Object *ob);
 void object_free_display(struct Object *ob);
 
 void free_object(struct Object *ob);
 void object_free_display(struct Object *ob);
 
+int object_support_modifier_type(struct Object *ob, int modifier_type);
+
 void object_link_modifiers(struct Object *ob, struct Object *from);
 void object_free_modifiers(struct Object *ob);
 
 void object_link_modifiers(struct Object *ob, struct Object *from);
 void object_free_modifiers(struct Object *ob);
 
index 32a3ca2b7321bef21c47da8d4910372189a96164..0557fcf5fcd623f3a26981fcb7b254e37587dfed 100644 (file)
@@ -199,16 +199,40 @@ void object_free_modifiers(Object *ob)
        object_free_softbody(ob);
 }
 
        object_free_softbody(ob);
 }
 
+int object_support_modifier_type(Object *ob, int modifier_type)
+{
+       ModifierTypeInfo *mti;
+
+       mti = modifierType_getInfo(modifier_type);
+
+       if (!((mti->flags & eModifierTypeFlag_AcceptsCVs) ||
+            (ob->type==OB_MESH && (mti->flags & eModifierTypeFlag_AcceptsMesh))))
+       {
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
 void object_link_modifiers(struct Object *ob, struct Object *from)
 {
        ModifierData *md;
        object_free_modifiers(ob);
 
 void object_link_modifiers(struct Object *ob, struct Object *from)
 {
        ModifierData *md;
        object_free_modifiers(ob);
 
+       if (!ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) {
+               /* only objects listed above can have modifiers and linking them to objects
+                * which doesn't have modifiers stack is quite silly */
+               return;
+       }
+
        for (md=from->modifiers.first; md; md=md->next) {
                ModifierData *nmd = NULL;
 
                if (ELEM4(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_ParticleInstance, eModifierType_Collision)) continue;
 
        for (md=from->modifiers.first; md; md=md->next) {
                ModifierData *nmd = NULL;
 
                if (ELEM4(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_ParticleInstance, eModifierType_Collision)) continue;
 
+               if (!object_support_modifier_type(ob, md->type))
+                       continue;
+
                nmd = modifier_new(md->type);
                modifier_copyData(md, nmd);
                BLI_addtail(&ob->modifiers, nmd);
                nmd = modifier_new(md->type);
                modifier_copyData(md, nmd);
                BLI_addtail(&ob->modifiers, nmd);
@@ -954,6 +978,11 @@ void copy_object_particlesystems(Object *obn, Object *ob)
        ParticleSystem *psys, *npsys;
        ModifierData *md;
 
        ParticleSystem *psys, *npsys;
        ModifierData *md;
 
+       if (obn->type != OB_MESH) {
+               /* currently only mesh objects can have soft body */
+               return;
+       }
+
        obn->particlesystem.first= obn->particlesystem.last= NULL;
        for (psys=ob->particlesystem.first; psys; psys=psys->next) {
                npsys= copy_particlesystem(psys);
        obn->particlesystem.first= obn->particlesystem.last= NULL;
        for (psys=ob->particlesystem.first; psys; psys=psys->next) {
                npsys= copy_particlesystem(psys);
index de9e3db25b855fde954e59aa704786c531ce8efd..f1222ccf7f727b23d8bd0df3feb86cb74186bc45 100644 (file)
@@ -670,8 +670,7 @@ static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr)
                        if(mti->flags & eModifierTypeFlag_NoUserAdd)
                                continue;
 
                        if(mti->flags & eModifierTypeFlag_NoUserAdd)
                                continue;
 
-                       if(!((mti->flags & eModifierTypeFlag_AcceptsCVs) ||
-                          (ob->type==OB_MESH && (mti->flags & eModifierTypeFlag_AcceptsMesh))))
+                       if(!object_support_modifier_type(ob, md_item->value))
                                continue;
                }
                else {
                                continue;
                }
                else {