[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44834] trunk/blender/source/blender: Fix #30496: Bugs and crashes about "make links modifers" function.

Sergey Sharybin sergey.vfx at gmail.com
Mon Mar 12 15:35:12 CET 2012


Revision: 44834
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44834
Author:   nazgul
Date:     2012-03-12 14:35:07 +0000 (Mon, 12 Mar 2012)
Log Message:
-----------
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.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2012-03-12 13:04:06 UTC (rev 44833)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2012-03-12 14:35:07 UTC (rev 44834)
@@ -67,6 +67,8 @@
 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);
 

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2012-03-12 13:04:06 UTC (rev 44833)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2012-03-12 14:35:07 UTC (rev 44834)
@@ -199,16 +199,40 @@
 	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 @@
 	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);

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2012-03-12 13:04:06 UTC (rev 44833)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2012-03-12 14:35:07 UTC (rev 44834)
@@ -670,8 +670,7 @@
 			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 {




More information about the Bf-blender-cvs mailing list