diff options
Diffstat (limited to 'source/blender/blenkernel/intern/particle_system.c')
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index aa48336247c..720bf3b2a47 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2308,8 +2308,7 @@ void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings VECCOPY(start, pa->prev_state.co); VECCOPY(end, pa->state.co); - sub_v3_v3v3(v, end, start); - mul_v3_fl(v, 1.f/dtime); + VECCOPY(v, pa->state.vel); neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn); @@ -2386,7 +2385,7 @@ void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings static void apply_particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra){ ParticleTarget *pt; - float dtime = dfra*psys_get_timestep(sim); +// float dtime = dfra*psys_get_timestep(sim); float particle_mass = part->mass; particle_fluidsim(psys, pa, part, sim, dfra, cfra, particle_mass); @@ -3689,7 +3688,7 @@ static void system_step(ParticleSimulationData *sim, float cfra) PARTICLE_P; int oldtotpart; float disp, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; - int init= 0, emit= 0, only_children_changed= 0; + int init= 0, emit= 0; //, only_children_changed= 0; int framenr, framedelta, startframe = 0, endframe = 100; framenr= (int)sim->scene->r.cfra; @@ -3732,6 +3731,8 @@ static void system_step(ParticleSimulationData *sim, float cfra) oldtotpart = psys->totpart; emit = emit_particles(sim, use_cache, cfra); + if(use_cache && emit > 0) + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, cfra); init = emit*emit + (psys->recalc & PSYS_RECALC_RESET); if(init) { @@ -3788,18 +3789,23 @@ static void system_step(ParticleSimulationData *sim, float cfra) } if(psys->totpart) { - int dframe, totframesback = 0; - + int dframe, subframe = 0, totframesback = 0, totsubframe = part->subframes+1; + float fraction; + /* handle negative frame start at the first frame by doing * all the steps before the first frame */ if(framenr == startframe && part->sta < startframe) totframesback = (startframe - (int)part->sta); - + for(dframe=-totframesback; dframe<=0; dframe++) { /* ok now we're all set so let's go */ - dynamics_step(sim, cfra+dframe); - psys->cfra = cfra+dframe; + for (subframe = 1; subframe <= totsubframe; subframe++) { + fraction = (float)subframe/(float)totsubframe; + dynamics_step(sim, cfra+dframe+fraction - 1.f); + psys->cfra = cfra+dframe+fraction - 1.f; + } } + } /* 4. only write cache starting from second frame */ |