diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-03-19 22:14:24 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-03-19 22:14:24 +0400 |
commit | d7b072f450d122f31d28d1fc0aa216da8dee38fc (patch) | |
tree | b90cba58f72352e3e5d5b13ec5edc1a61d6444e6 /source/blender/blenkernel/intern/particle_system.c | |
parent | 8e0493b290edd7a5b4dca4b84a4e13be9c021e6b (diff) |
Fix #30456: transforming object with a hair particle system, on a frame after
the cache end frame would reset to the previous state on confirm. Was an issue
with object animation being evaluated unnecessarily, now make check more
precise.
Diffstat (limited to 'source/blender/blenkernel/intern/particle_system.c')
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index c3e7e4531b9..50c960d6c56 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -1814,6 +1814,8 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime, } ob = sim->ob; where_is_object_time(sim->scene, ob, pa->time); + + psys->flag |= PSYS_OB_ANIM_RESTORE; } psys_get_birth_coordinates(sim, pa, &pa->state, dtime, cfra); @@ -4438,6 +4440,9 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) /* execute drivers only, as animation has already been done */ BKE_animsys_evaluate_animdata(scene, &part->id, part->adt, cfra, ADT_RECALC_DRIVERS); + /* to verify if we need to restore object afterwards */ + psys->flag &= ~PSYS_OB_ANIM_RESTORE; + if(psys->recalc & PSYS_RECALC_TYPE) psys_changed_type(&sim); @@ -4550,14 +4555,16 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys) } } - if(psys->cfra < cfra) { - /* make sure emitter is left at correct time (particle emission can change this) */ + /* make sure emitter is left at correct time (particle emission can change this) */ + if(psys->flag & PSYS_OB_ANIM_RESTORE) { while(ob) { BKE_animsys_evaluate_animdata(scene, &ob->id, ob->adt, cfra, ADT_RECALC_ANIM); ob = ob->parent; } ob = sim.ob; where_is_object_time(scene, ob, cfra); + + psys->flag &= ~PSYS_OB_ANIM_RESTORE; } psys->cfra = cfra; |