From 59ef68cd9a2e8ccb5eaaa88e4602a491fcfffe7e Mon Sep 17 00:00:00 2001 From: Alex Fraser Date: Tue, 8 Jan 2013 04:28:44 +0000 Subject: Fix for [#33788] Particles - Fluid "exploding" behavior Particle mass was being used incorrectly by DDR solver (my fault). --- source/blender/blenkernel/intern/particle_system.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'source/blender/blenkernel/intern/particle_system.c') diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 3b897e94241..eabfbf2e251 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2396,6 +2396,7 @@ typedef struct SPHRangeData { ParticleData *pa; float h; + float mass; float massfac; int use_size; } SPHRangeData; @@ -2408,7 +2409,7 @@ static void sph_evaluate_func(BVHTree *tree, ParticleSystem **psys, float co[3], for (i=0; i < 10 && psys[i]; i++) { pfr->npsys = psys[i]; - pfr->massfac = psys[i]->part->mass; + pfr->massfac = psys[i]->part->mass / pfr->mass; pfr->use_size = psys[i]->part->flag & PART_SIZEMASS; if (tree) { @@ -2491,7 +2492,6 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa ParticleSpring *spring = NULL; SPHRangeData pfr; SPHNeighbor *pfn; - float mass = sphdata->mass; float *gravity = sphdata->gravity; EdgeHash *springhash = sphdata->eh; @@ -2501,7 +2501,7 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa float visc = fluid->viscosity_omega; float stiff_visc = fluid->viscosity_beta * (fluid->flag & SPH_FAC_VISCOSITY ? fluid->viscosity_omega : 1.f); - float inv_mass = 1.0f/mass; + float inv_mass = 1.0f / sphdata->mass; float spring_constant = fluid->spring_k; /* 4.0 seems to be a pretty good value */ @@ -2526,6 +2526,7 @@ static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, floa pfr.data = data; pfr.h = h; pfr.pa = pa; + pfr.mass = sphdata->mass; sph_evaluate_func( NULL, psys, state->co, &pfr, interaction_radius, sph_density_accum_cb); @@ -2644,7 +2645,7 @@ static void sphclassical_density_accum_cb(void *userdata, int index, float UNUSE * q1(x) = (2.0 - x)**4 * ( 1.0 + 2.0 * x) * plot [0:2] q1(x) */ q = qfac / pow3(pfr->h) * pow4(2.0f - rij_h) * ( 1.0f + 2.0f * rij_h); - q *= pfr->massfac; + q *= pfr->npsys->part->mass; if (pfr->use_size) q *= pfr->pa->size; @@ -2792,6 +2793,7 @@ static void sphclassical_calc_dens(ParticleData *pa, float UNUSED(dfra), SPHData pfr.data = data; pfr.h = interaction_radius * sphdata->hfac; pfr.pa = pa; + pfr.mass = sphdata->mass; sph_evaluate_func( NULL, psys, pa->state.co, &pfr, interaction_radius, sphclassical_density_accum_cb); pa->sphdensity = MIN2(MAX2(data[0], fluid->rest_density * 0.9f), fluid->rest_density * 1.1f); @@ -2851,7 +2853,8 @@ void psys_sph_density(BVHTree *tree, SPHData *sphdata, float co[3], float vars[2 density[0] = density[1] = 0.0f; pfr.data = density; - pfr.h = interaction_radius*sphdata->hfac; + pfr.h = interaction_radius * sphdata->hfac; + pfr.mass = sphdata->mass; sph_evaluate_func(tree, psys, co, &pfr, interaction_radius, sphdata->density_cb); -- cgit v1.2.3