[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