Fix #30456: transforming object with a hair particle system, on a frame after
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 19 Mar 2012 18:14:24 +0000 (18:14 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 19 Mar 2012 18:14:24 +0000 (18:14 +0000)
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.

source/blender/blenkernel/intern/particle_system.c
source/blender/makesdna/DNA_particle_types.h

index c3e7e4531b9b95573422c03e2469f207f584d608..50c960d6c56dc34483c5e6f2c08b36cee2b96eb6 100644 (file)
@@ -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;
index 5bb4d1009e9811a0e636f71cc0aebe6f7c3943c9..547a91e785250a8d25111931694fec234f3ce5f8 100644 (file)
@@ -498,7 +498,8 @@ typedef struct ParticleSystem
 #define PSYS_KEYED                     1024
 #define PSYS_EDITED                    2048
 //#define PSYS_PROTECT_CACHE   4096 /* deprecated */
-#define PSYS_DISABLED          8192
+#define PSYS_DISABLED                  8192
+#define PSYS_OB_ANIM_RESTORE   16384 /* runtime flag */
 
 /* pars->flag */
 #define PARS_UNEXIST           1