[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13893] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Feb 27 18:04:58 CET 2008


Revision: 13893
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13893
Author:   blendix
Date:     2008-02-27 18:04:58 +0100 (Wed, 27 Feb 2008)

Log Message:
-----------

Bugfix: Copy Modifiers with particle systems crashed, it didn't copy
the particle systems.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2008-02-27 14:26:47 UTC (rev 13892)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2008-02-27 17:04:58 UTC (rev 13893)
@@ -51,6 +51,10 @@
 void copy_baseflags(void);
 void copy_objectflags(void);
 struct SoftBody *copy_softbody(struct SoftBody *sb);
+void copy_object_particlesystems(struct Object *obn, struct Object *ob);
+void copy_object_softbody(struct Object *obn, struct Object *ob);
+void object_free_particlesystems(struct Object *ob);
+void object_free_softbody(struct Object *ob);
 void update_base_layer(struct Object *ob);
 
 void free_object(struct Object *ob);

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-02-27 14:26:47 UTC (rev 13892)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2008-02-27 17:04:58 UTC (rev 13893)
@@ -5412,6 +5412,7 @@
 	ParticleSystemModifierData *tpsmd= (ParticleSystemModifierData*) target;
 
 	tpsmd->dm = 0;
+	tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0;
 	//tpsmd->facepa = 0;
 	tpsmd->flag = psmd->flag;
 	/* need to keep this to recognise a bit later in copy_object */

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2008-02-27 14:26:47 UTC (rev 13892)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2008-02-27 17:04:58 UTC (rev 13893)
@@ -157,6 +157,25 @@
 	}
 }
 
+void object_free_particlesystems(Object *ob)
+{
+	while(ob->particlesystem.first){
+		ParticleSystem *psys = ob->particlesystem.first;
+
+		BLI_remlink(&ob->particlesystem,psys);
+
+		psys_free(ob,psys);
+	}
+}
+
+void object_free_softbody(Object *ob)
+{
+	if(ob->soft) {
+		sbFree(ob->soft);
+		ob->soft= NULL;
+	}
+}
+
 void object_free_modifiers(Object *ob)
 {
 	while (ob->modifiers.first) {
@@ -168,13 +187,10 @@
 	}
 
 	/* particle modifiers were freed, so free the particlesystems as well */
-	while(ob->particlesystem.first){
-		ParticleSystem *psys = ob->particlesystem.first;
+	object_free_particlesystems(ob);
 
-		BLI_remlink(&ob->particlesystem,psys);
-
-		psys_free(ob,psys);
-	}
+	/* same for softbody */
+	object_free_softbody(ob);
 }
 
 /* here we will collect all local displist stuff */
@@ -1034,6 +1050,35 @@
 	return psysn;
 }
 
+void copy_object_particlesystems(Object *obn, Object *ob)
+{
+	ParticleSystemModifierData *psmd;
+	ParticleSystem *psys, *npsys;
+	ModifierData *md;
+
+	obn->particlesystem.first= obn->particlesystem.last= NULL;
+	for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+		npsys= copy_particlesystem(psys);
+
+		BLI_addtail(&obn->particlesystem, npsys);
+
+		/* need to update particle modifiers too */
+		for(md=obn->modifiers.first; md; md=md->next) {
+			if(md->type==eModifierType_ParticleSystem) {
+				psmd= (ParticleSystemModifierData*)md;
+				if(psmd->psys==psys)
+					psmd->psys= npsys;
+			}
+		}
+	}
+}
+
+void copy_object_softbody(Object *obn, Object *ob)
+{
+	if(ob->soft)
+		obn->soft= copy_softbody(ob->soft);
+}
+
 static void copy_object_pose(Object *obn, Object *ob)
 {
 	bPoseChannel *chan;
@@ -1077,7 +1122,6 @@
 {
 	Object *obn;
 	ModifierData *md;
-	ParticleSystem *psys;
 	int a;
 
 	obn= copy_libblock(ob);
@@ -1144,22 +1188,7 @@
 		}
 	}
 
-	obn->particlesystem.first= obn->particlesystem.last= NULL;
-	for(psys=ob->particlesystem.first; psys; psys=psys->next) {
-		ParticleSystemModifierData *psmd;
-		ParticleSystem *npsys= copy_particlesystem(psys);
-
-		BLI_addtail(&obn->particlesystem, npsys);
-
-		/* need to update particle modifiers too */
-		for(md=obn->modifiers.first; md; md=md->next) {
-			if(md->type==eModifierType_ParticleSystem) {
-				psmd= (ParticleSystemModifierData*)md;
-				if(psmd->psys==psys)
-					psmd->psys= npsys;
-			}
-		}
-	}
+	copy_object_particlesystems(obn, ob);
 	
 	obn->derivedDeform = NULL;
 	obn->derivedFinal = NULL;

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c	2008-02-27 14:26:47 UTC (rev 13892)
+++ trunk/blender/source/blender/src/editobject.c	2008-02-27 17:04:58 UTC (rev 13893)
@@ -3079,7 +3079,7 @@
 	for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
 		ModifierTypeInfo *mti = modifierType_getInfo(i);
 
-		if (ELEM(i, eModifierType_Hook, eModifierType_Softbody)) continue;
+		if(ELEM3(i, eModifierType_Hook, eModifierType_Softbody, eModifierType_ParticleInstance)) continue;
 
 		if (	(mti->flags&eModifierTypeFlag_AcceptsCVs) || 
 				(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
@@ -3109,6 +3109,9 @@
 								BLI_addtail(&base->object->modifiers, nmd);
 							}
 						}
+
+						copy_object_particlesystems(base->object, ob);
+						copy_object_softbody(base->object, ob);
 					} else {
 						/* copy specific types */
 						ModifierData *md, *mdn;
@@ -3132,6 +3135,15 @@
 								modifier_copyData(md, mdn);
 							}
 						}
+
+						if(event == eModifierType_ParticleSystem) {
+							object_free_particlesystems(base->object);
+							copy_object_particlesystems(base->object, ob);
+						}
+						else if(event == eModifierType_Softbody) {
+							object_free_softbody(base->object);
+							copy_object_softbody(base->object, ob);
+						}
 					}
 				}
 				else





More information about the Bf-blender-cvs mailing list