Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-03-12 18:35:07 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-03-12 18:35:07 +0400
commita527e3ea25bd66e4cd6d6842bcdab865be0c913f (patch)
tree9c3127ed6b28a023ecab6f695cc072985c096f95 /source/blender
parent74b7bc1228b502c1fec88e1399601144d7bd34f2 (diff)
Fix #30496: Bugs and crashes about "make links modifers" function.
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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/intern/object.c29
-rw-r--r--source/blender/editors/object/object_modifier.c3
3 files changed, 32 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 1e9bb85b549..f5937304e76 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -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);
+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);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 32a3ca2b732..0557fcf5fcd 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -199,16 +199,40 @@ void object_free_modifiers(Object *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);
+ 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;
+ if (!object_support_modifier_type(ob, md->type))
+ continue;
+
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;
+ 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);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index de9e3db25b8..f1222ccf7f7 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -670,8 +670,7 @@ static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr)
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 {