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>2018-05-15 13:34:18 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-05-15 18:20:02 +0300
commitfe01430f74f1440827c3055bd1025b33302afd7b (patch)
tree88b623d81c8ee2e0cc584d928295aba01b8713a2 /source/blender/blenkernel
parente5560e8d56774bc7502f9cf3b304ef27d16298eb (diff)
Particle edit: Make check to work within copy-on-write concept
Not fully optimal, we can probably store pointer to original psys similar to ID's orig_id.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/particle.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 37607de9c36..d740963cde8 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -291,14 +291,31 @@ void psys_enable_all(Object *ob)
bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys)
{
- ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
+ const ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
+ if (view_layer->basact == NULL) {
+ /* TODO(sergey): Needs double-check with multi-object edit. */
+ return false;
+ }
const bool use_render_params = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
-
- return (view_layer->basact &&
- (view_layer->basact->object->mode & OB_MODE_PARTICLE_EDIT) &&
- psys == psys_get_current((view_layer->basact)->object) &&
- (psys->edit || psys->pointcache->edit) &&
- !use_render_params);
+ const Object *object = view_layer->basact->object;
+ if (object->mode != OB_MODE_PARTICLE_EDIT) {
+ return false;
+ }
+ /* TODO(sergey): Find a faster way to switch to an original psys. */
+ /*const*/ Object *object_orig = DEG_get_original_object(view_layer->basact->object);
+ ParticleSystem *psys_orig = object_orig->particlesystem.first;
+ while (psys_orig != NULL) {
+ if (STREQ(psys_orig->name, psys->name)) {
+ break;
+ }
+ psys = psys->next;
+ psys_orig = psys_orig->next;
+ }
+ if (psys_orig != psys_get_current(object_orig)) {
+ return false;
+ }
+ return (psys_orig->edit || psys->pointcache->edit) &&
+ (use_render_params == false);
}
bool psys_check_enabled(Object *ob, ParticleSystem *psys, const bool use_render_params)