Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-07-04 11:42:35 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-07-04 16:47:41 +0300
commit7ba096e1e72d99c2c43986cf009b14dfbea539a4 (patch)
tree33d2d6bf280cc5269a27f95416bf8aeee71b19d7 /source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
parent9e8e479a52206be6cd2ce0440730bdb75e05f297 (diff)
Fix T63788: Crash if particle system is turned off in particle editing mode
Make sure particle system edit never points to a modifier or particle system which becomes inactive. This is needed because copy-on-write will change pointers of them and those pointers are supposed to be restored from particle system evaluation. But since the particle system is disabled it never updates pointers. Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D5180
Diffstat (limited to 'source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc')
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index be78eee91cc..3fef7fc9c02 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -87,6 +87,7 @@ extern "C" {
#include "BKE_library_query.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_pointcache.h"
#include "BKE_sequencer.h"
#include "BKE_sound.h"
}
@@ -683,10 +684,22 @@ void set_particle_system_modifiers_loaded(Object *object_cow)
}
}
+void reset_particle_system_edit_eval(Object *object_cow)
+{
+ LISTBASE_FOREACH (ParticleSystem *, psys, &object_cow->particlesystem) {
+ ParticleSystem *orig_psys = psys->orig_psys;
+ if (orig_psys->edit != NULL) {
+ orig_psys->edit->psys_eval = NULL;
+ orig_psys->edit->psmd_eval = NULL;
+ }
+ }
+}
+
void update_particles_after_copy(const Object *object_orig, Object *object_cow)
{
update_particle_system_orig_pointers(object_orig, object_cow);
set_particle_system_modifiers_loaded(object_cow);
+ reset_particle_system_edit_eval(object_cow);
}
void update_pose_orig_pointers(const bPose *pose_orig, bPose *pose_cow)