[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