[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33661] trunk/blender/source/blender/ blenkernel/intern: Fix for [#25206] Particles system can't start at frame 0

Janne Karhu jhkarh at gmail.com
Tue Dec 14 16:49:36 CET 2010


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;





More information about the Bf-blender-cvs mailing list