diff options
author | Bastien Montagne <bastien@blender.org> | 2020-07-09 12:44:11 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2020-07-09 12:46:28 +0300 |
commit | 8ddf7556a512b2b2ce89b75c9660e01a7aba8675 (patch) | |
tree | af98ecda886e9a12f65a30eba87357ea011eed8a /source/blender/blenkernel/intern/particle.c | |
parent | ea5fe7abc183c1e53d327f97280f589499fe60bb (diff) |
Fix T78718: Crash when deleting particle system modifier with the X Shortcut.
Duplication and deletion code of modifiers was totally wrong for
particle system, that special weird thing needs its own custom
management.
Note that for now I chose not to duplicate the particle settings ID when
duplicating the modifier...
Diffstat (limited to 'source/blender/blenkernel/intern/particle.c')
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 942f3e0ca2b..cb1b523a7a9 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3611,7 +3611,8 @@ void psys_mat_hair_to_global( /************************************************/ /* ParticleSettings handling */ /************************************************/ -ModifierData *object_add_particle_system(Main *bmain, Scene *scene, Object *ob, const char *name) +static ModifierData *object_add_or_copy_particle_system( + Main *bmain, Scene *scene, Object *ob, const char *name, const ParticleSystem *psys_orig) { ParticleSystem *psys; ModifierData *md; @@ -3622,7 +3623,7 @@ ModifierData *object_add_particle_system(Main *bmain, Scene *scene, Object *ob, } if (name == NULL) { - name = DATA_("ParticleSettings"); + name = (psys_orig != NULL) ? psys_orig->name : DATA_("ParticleSettings"); } psys = ob->particlesystem.first; @@ -3635,8 +3636,13 @@ ModifierData *object_add_particle_system(Main *bmain, Scene *scene, Object *ob, BLI_addtail(&ob->particlesystem, psys); psys_unique_name(ob, psys, name); - psys->part = BKE_particlesettings_add(bmain, psys->name); - + if (psys_orig != NULL) { + psys->part = psys_orig->part; + id_us_plus(&psys->part->id); + } + else { + psys->part = BKE_particlesettings_add(bmain, psys->name); + } md = BKE_modifier_new(eModifierType_ParticleSystem); BLI_strncpy(md->name, psys->name, sizeof(md->name)); BKE_modifier_unique_name(&ob->modifiers, md); @@ -3656,6 +3662,20 @@ ModifierData *object_add_particle_system(Main *bmain, Scene *scene, Object *ob, return md; } + +ModifierData *object_add_particle_system(Main *bmain, Scene *scene, Object *ob, const char *name) +{ + return object_add_or_copy_particle_system(bmain, scene, ob, name, NULL); +} + +ModifierData *object_copy_particle_system(Main *bmain, + Scene *scene, + Object *ob, + const ParticleSystem *psys_orig) +{ + return object_add_or_copy_particle_system(bmain, scene, ob, NULL, psys_orig); +} + void object_remove_particle_system(Main *bmain, Scene *UNUSED(scene), Object *ob) { ParticleSystem *psys = psys_get_current(ob); |