Revision: 33661
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33661
Author:   jhk
Date:     2010-12-14 16:49:36 +0100 (Tue, 14 Dec 2010)

Log Message:
-----------
Fix for [#25206] Particles system can't start at frame 0
* The basic problem is that frame 0 can't be cached, so the correct solution is 
to read frame 1 and interpolate backwards from that state.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c   2010-12-14 
15:14:16 UTC (rev 33660)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c   2010-12-14 
15:49:36 UTC (rev 33661)
@@ -4229,18 +4229,21 @@
                        else if(pa->prev_state.time==state->time)
                                copy_particle_key(state, &pa->prev_state, 1);
                        else {
+                               float dfra, frs_sec = sim->scene->r.frs_sec;
                                /* let's interpolate to try to be as accurate 
as possible */
-                               if(pa->state.time + 2.0f > state->time && 
pa->prev_state.time - 2.0f < state->time) {
-                                       ParticleKey keys[4];
-                                       float dfra, keytime, frs_sec = 
sim->scene->r.frs_sec;
+                               if(pa->state.time + 2.0f >= state->time && 
pa->prev_state.time - 2.0f <= state->time) {
+                                       if(pa->prev_state.time >= 
pa->state.time) {
+                                               /* prev_state is wrong so let's 
not use it, this can happen at frames 1, 0 or particle birth */
+                                               dfra = state->time - 
pa->state.time;
 
-                                       if(pa->prev_state.time >= 
pa->state.time) {
-                                               /* prev_state is wrong so let's 
not use it, this can happen at frame 1 or particle birth */
                                                copy_particle_key(state, 
&pa->state, 1);
 
-                                               VECADDFAC(state->co, state->co, 
state->vel, (state->time-pa->state.time)/frs_sec);
+                                               madd_v3_v3v3fl(state->co, 
state->co, state->vel, dfra/frs_sec);
                                        }
                                        else {
+                                               ParticleKey keys[4];
+                                               float keytime;
+
                                                copy_particle_key(keys+1, 
&pa->prev_state, 1);
                                                copy_particle_key(keys+2, 
&pa->state, 1);
 
@@ -4261,6 +4264,15 @@
                                                interp_qt_qtqt(state->rot, 
keys[1].rot, keys[2].rot, keytime);
                                        }
                                }
+                               else if(pa->state.time + 1.f >= state->time && 
pa->state.time - 1.f <= state->time) {
+                                       /* linear interpolation using only 
pa->state */
+
+                                       dfra = state->time - pa->state.time;
+
+                                       copy_particle_key(state, &pa->state, 1);
+
+                                       madd_v3_v3v3fl(state->co, state->co, 
state->vel, dfra/frs_sec);
+                               }
                                else {
                                        /* extrapolating over big ranges is not 
accurate so let's just give something close to reasonable back */
                                        copy_particle_key(state, &pa->state, 0);

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c    
2010-12-14 15:14:16 UTC (rev 33660)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c    
2010-12-14 15:49:36 UTC (rev 33661)
@@ -3776,6 +3776,7 @@
 
                /* simulation is only active during a specific period */
                if(framenr < startframe) {
+                       BKE_ptcache_read_cache(use_cache, startframe, 
sim->scene->r.frs_sec);
                        /* set correct particle state and reset particles */
                        cached_step(sim, cfra);
                        return;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to