From f2a21472c4939bf0b5666ec654bbc12bbc6a6e81 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Mon, 18 Feb 2019 16:59:31 +0100 Subject: Fix T61473: Crash particle system is updating Original and localized particle settings were sharing some of the runtime pointers. --- source/blender/blenkernel/BKE_effect.h | 1 + source/blender/blenkernel/intern/effect.c | 12 ++++++++++++ source/blender/blenkernel/intern/particle.c | 4 ++-- source/blender/blenlib/BLI_rand.h | 1 + source/blender/blenlib/intern/rand.c | 5 +++++ 5 files changed, 21 insertions(+), 2 deletions(-) (limited to 'source/blender') diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h index a9271335be6..dfcb482ec06 100644 --- a/source/blender/blenkernel/BKE_effect.h +++ b/source/blender/blenkernel/BKE_effect.h @@ -110,6 +110,7 @@ typedef struct EffectorRelation { struct PartDeflect *BKE_partdeflect_new(int type); +struct PartDeflect *BKE_partdeflect_copy(const struct PartDeflect *pd_src); void BKE_partdeflect_free(struct PartDeflect *pd); struct ListBase *BKE_effector_relations_create( diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c index 48b427d5837..d1ad7f10206 100644 --- a/source/blender/blenkernel/intern/effect.c +++ b/source/blender/blenkernel/intern/effect.c @@ -131,6 +131,18 @@ PartDeflect *BKE_partdeflect_new(int type) /************************ PARTICLES ***************************/ +PartDeflect *BKE_partdeflect_copy(const struct PartDeflect *pd_src) +{ + if (pd_src == NULL) { + return NULL; + } + PartDeflect *pd_dst = MEM_dupallocN(pd_src); + if (pd_dst->rng != NULL) { + pd_dst->rng = BLI_rng_copy(pd_dst->rng); + } + return pd_dst; +} + void BKE_partdeflect_free(PartDeflect *pd) { if (!pd) { diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index d7210f28565..5d29c8c5941 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3297,8 +3297,8 @@ void BKE_particlesettings_twist_curve_init(ParticleSettings *part) void BKE_particlesettings_copy_data( Main *UNUSED(bmain), ParticleSettings *part_dst, const ParticleSettings *part_src, const int UNUSED(flag)) { - part_dst->pd = MEM_dupallocN(part_src->pd); - part_dst->pd2 = MEM_dupallocN(part_src->pd2); + part_dst->pd = BKE_partdeflect_copy(part_src->pd); + part_dst->pd2 = BKE_partdeflect_copy(part_src->pd2); part_dst->effector_weights = MEM_dupallocN(part_src->effector_weights); part_dst->fluid = MEM_dupallocN(part_src->fluid); diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h index 8a1479b4f68..fd078ae3a36 100644 --- a/source/blender/blenlib/BLI_rand.h +++ b/source/blender/blenlib/BLI_rand.h @@ -37,6 +37,7 @@ typedef struct RNG_THREAD_ARRAY RNG_THREAD_ARRAY; struct RNG *BLI_rng_new(unsigned int seed); struct RNG *BLI_rng_new_srandom(unsigned int seed); +struct RNG *BLI_rng_copy(struct RNG *rng) ATTR_NONNULL(1); void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1); void BLI_rng_seed(struct RNG *rng, unsigned int seed) ATTR_NONNULL(1); diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c index 262ae67a5f7..e453d5a01f8 100644 --- a/source/blender/blenlib/intern/rand.c +++ b/source/blender/blenlib/intern/rand.c @@ -76,6 +76,11 @@ RNG *BLI_rng_new_srandom(unsigned int seed) return rng; } +RNG *BLI_rng_copy(RNG *rng) +{ + return MEM_dupallocN(rng); +} + void BLI_rng_free(RNG *rng) { MEM_freeN(rng); -- cgit v1.2.3