[Bf-blender-cvs] [3bd5139] soc-2014-fluid: faster SDF, displaying smoke
Roman Pogribnyi
noreply at git.blender.org
Fri Aug 15 20:18:15 CEST 2014
Commit: 3bd51397614e6931f5c4423eb390a76d92860636
Author: Roman Pogribnyi
Date: Fri Aug 15 20:17:23 2014 +0200
Branches: soc-2014-fluid
https://developer.blender.org/rB3bd51397614e6931f5c4423eb390a76d92860636
faster SDF, displaying smoke
===================================================================
M intern/smoke/intern/MANTA.cpp
M source/blender/blenkernel/intern/smoke.c
M source/blender/python/manta_pp/plugin/initplugins.cpp
===================================================================
diff --git a/intern/smoke/intern/MANTA.cpp b/intern/smoke/intern/MANTA.cpp
index 9006544..c02de39 100644
--- a/intern/smoke/intern/MANTA.cpp
+++ b/intern/smoke/intern/MANTA.cpp
@@ -506,7 +506,11 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
}
ss << " applyInflow=False\n";
ss << " if (t>=0 and t<75):\n";
- ss << " source.applyToGrid(grid=density, value=1,cutoff=7)\n";
+// ss << " source.applyToGrid(grid=density, value=1,cutoff=7)\n";
+ if (noise_val_scale > 0.)
+ ss << " densityInflowMeshNoise( flags=flags, density=density, noise=noise, mesh=source, scale=3, sigma=0.5 )\n";
+ else
+ ss << " densityInflowMesh(flags=flags, density=density, mesh=source, value=1)\n";
// ss << " densityInflowMesh( flags=flags, density=density, noise=noise, mesh=source, scale=3, sigma=0.5 )\n";
//ss << " sourceVel.applyToGrid( grid=vel , value=velInflow )\n";
@@ -551,7 +555,10 @@ void generate_manta_sim_file(Scene *scene, SmokeModifierData *smd)
ss << " for substep in range(upres): \n";
ss << " advectSemiLagrange(flags=xl_flags, vel=xl_vel, grid=xl_density, order=2) \n";
ss << " if (applyInflow): \n";
- ss << " densityInflowMesh( flags=xl_flags, density=xl_density, noise=xl_noise, mesh=xl_source, scale=3, sigma=0.5 ) \n";
+ if (noise_val_scale > 0.)
+ ss << " densityInflowMesh(flags=xl_flags, density=xl_density, mesh=source, value=1)\n";
+ else
+ ss << " densityInflowMeshNoise( flags=xl_flags, density=xl_density, noise=xl_noise, mesh=xl_source, scale=3, sigma=0.5 ) \n";
ss << " xl_density.save('densityXl_%04d.uni' % t)\n";
//ss << " densityInflow( flags=xl_flags, density=xl_density, noise=xl_noise, shape=xl_source, scale=1, sigma=0.5 ) \n";
// ss << " xl.step() \n";
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 4a2b52d..cd09df2 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -2767,30 +2767,6 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
return;
}
- if(smd->domain->flags & MOD_SMOKE_USE_MANTA) /*load manta sim data into fluid object*/
- {
- const char *density_name_format = "./den%04d.uni";
- const char *wavelets_name_format = "./densityXL_%04d.uni";
- char buff[100];
- if(smd->domain->manta_start_frame > scene->r.cfra)
- return;
- sprintf(buff, density_name_format, scene->r.cfra - smd->domain->manta_start_frame);
- bool read_density = smoke_mantaflow_read(smd->domain, buff, 0);
- bool read_wavelets = 1;
- if (smd->domain->flags & MOD_SMOKE_HIGHRES)
- {
- /*highdres*/
- sprintf(buff, wavelets_name_format, scene->r.cfra - smd->domain->manta_start_frame);
- read_wavelets = smoke_mantaflow_read(smd->domain, buff, 1);
- }
- smoke_calc_transparency(sds, scene);
- return;
- // if(read_density && read_wavelets)
-// {
-// BKE_ptcache_write(&pid, framenr);
-// }
- }
-
/* try to read from cache */
if (BKE_ptcache_read(&pid, (float)framenr) == PTCACHE_READ_EXACT) {
BKE_ptcache_validate(cache, framenr);
@@ -2798,10 +2774,10 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
return;
}
- if (smd->domain->flags & MOD_SMOKE_USE_MANTA)/*manta should go no further that this poin*/
- {
- return;
- }
+// if (smd->domain->flags & MOD_SMOKE_USE_MANTA)/*manta should go no further that this poin*/
+// {
+// return;
+// }
/* only calculate something when we advanced a single frame */
if (framenr != (int)smd->time + 1)
@@ -2825,25 +2801,48 @@ static void smokeModifier_process(SmokeModifierData *smd, Scene *scene, Object *
// simulate the actual smoke (c++ code in intern/smoke)
// DG: interesting commenting this line + deactivating loading of noise files
- if (framenr != startframe)
+ if(smd->domain->flags & MOD_SMOKE_USE_MANTA) /*load manta sim data into fluid object*/
{
- if (sds->flags & MOD_SMOKE_DISSOLVE) {
- /* low res dissolve */
- smoke_dissolve(sds->fluid, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
- /* high res dissolve */
- if (sds->wt) {
- smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
- }
-
+ const char *density_name_format = "./den%04d.uni";
+ const char *wavelets_name_format = "./densityXL_%04d.uni";
+ char buff[100];
+ if(smd->domain->manta_start_frame > scene->r.cfra)
+ return;
+ sprintf(buff, density_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+ bool read_density = smoke_mantaflow_read(smd->domain, buff, 0);
+ bool read_wavelets = 1;
+ if (smd->domain->flags & MOD_SMOKE_HIGHRES)
+ {
+ /*highdres*/
+ sprintf(buff, wavelets_name_format, scene->r.cfra - smd->domain->manta_start_frame);
+ read_wavelets = smoke_mantaflow_read(smd->domain, buff, 1);
}
+// smoke_calc_transparency(sds, scene);
+// return;
+ // if(read_density && read_wavelets)
+ // {
+ // BKE_ptcache_write(&pid, framenr);
+ // }
+ }
+ else{
+ if (framenr != startframe)
+ {
+ if (sds->flags & MOD_SMOKE_DISSOLVE) {
+ /* low res dissolve */
+ smoke_dissolve(sds->fluid, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ /* high res dissolve */
+ if (sds->wt) {
+ smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ }
+ }
step(scene, ob, smd, dm, scene->r.frs_sec / scene->r.frs_sec_base, for_render);
+ }
}
-
// create shadows before writing cache so they get stored
smoke_calc_transparency(sds, scene);
- if (sds->wt)
+ if (sds->wt&& !(smd->domain->flags & MOD_SMOKE_USE_MANTA))
{
smoke_turbulence_step(sds->wt, sds->fluid);
}
diff --git a/source/blender/python/manta_pp/plugin/initplugins.cpp b/source/blender/python/manta_pp/plugin/initplugins.cpp
index 8128967..db779dd 100644
--- a/source/blender/python/manta_pp/plugin/initplugins.cpp
+++ b/source/blender/python/manta_pp/plugin/initplugins.cpp
@@ -33,86 +33,100 @@ using namespace std;
namespace Manta {
-//! Apply noise to grid
-
-
- struct KnApplyNoise : public KernelBase { KnApplyNoise(FlagGrid& flags, Grid<Real>& density, WaveletNoiseField& noise, Grid<Real>& sdf, Real scale, Real sigma) : KernelBase(&flags,0) ,flags(flags),density(density),noise(noise),sdf(sdf),scale(scale),sigma(sigma) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, Grid<Real>& density, WaveletNoiseField& noise, Grid<Real>& sdf, Real scale, Real sigma ) {
- if (!flags.isFluid(i,j,k) || sdf(i,j,k) > sigma) return;
- Real factor = clamp(1.0-0.5/sigma * (sdf(i,j,k)+sigma), 0.0, 1.0);
-
- Real target = noise.evaluate(Vec3(i,j,k)) * scale * factor;
- if (density(i,j,k) < target)
- density(i,j,k) = target;
-} inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline Grid<Real>& getArg1() { return density; } typedef Grid<Real> type1;inline WaveletNoiseField& getArg2() { return noise; } typedef WaveletNoiseField type2;inline Grid<Real>& getArg3() { return sdf; } typedef Grid<Real> type3;inline Real& getArg4() { return scale; } typedef Real type4;inline Real& getArg5() { return sigma; } typedef Real type5; void run() { const int _maxX = maxX; const int _maxY = maxY; for (in [...]
-
-//! Init noise-modulated density inside shape
-
-void densityInflow(FlagGrid& flags, Grid<Real>& density, WaveletNoiseField& noise, Shape* shape, Real scale=1.0, Real sigma=0) {
- Grid<Real> sdf = shape->computeLevelset();
- KnApplyNoise(flags, density, noise, sdf, scale, sigma);
-} static PyObject* _W_0 (PyObject* _self, PyObject* _linargs, PyObject* _kwds) { try { PbArgs _args(_linargs, _kwds); FluidSolver *parent = _args.obtainParent(); pbPreparePlugin(parent, "densityInflow" ); PyObject *_retval = 0; { ArgLocker _lock; FlagGrid& flags = *_args.getPtr<FlagGrid >("flags",0,&_lock); Grid<Real>& density = *_args.getPtr<Grid<Real> >("density",1,&_lock); WaveletNoiseField& noise = *_args.getPtr<WaveletNoiseField >("noise",2,&_lock); Shape* shape = _args.getPtr<Shape [...]
-
+ //! Apply noise to grid
+
+
+ struct KnApplyNoise : public KernelBase { KnApplyNoise(FlagGrid& flags, Grid<Real>& density, WaveletNoiseField& noise, Grid<Real>& sdf, Real scale, Real sigma) : KernelBase(&flags,0) ,flags(flags),density(density),noise(noise),sdf(sdf),scale(scale),sigma(sigma) { run(); } inline void op(int i, int j, int k, FlagGrid& flags, Grid<Real>& density, WaveletNoiseField& noise, Grid<Real>& sdf, Real scale, Real sigma ) {
+ if (!flags.isFluid(i,j,k) || sdf(i,j,k) > sigma) return;
+ Real factor = clamp(1.0-0.5/sigma * (sdf(i,j,k)+sigma), 0.0, 1.0);
+
+ Real target = noise.evaluate(Vec3(i,j,k)) * scale * factor;
+ if (density(i,j,k) < target)
+ density(i,j,k) = target;
+ } inline FlagGrid& getArg0() { return flags; } typedef FlagGrid type0;inline Grid<Real>& getArg1() { return density; } typedef Grid<Real> type1;inline WaveletNoiseField& getArg2() { return noise; } typedef WaveletNoiseField type2;inline Grid<Real>& getArg3() { return sdf; } typedef Grid<Real> type3;inline Real& getArg4() { return scale; } typedef Real type4;inline Real& getArg5() { return sigma; } typedef Real type5; void run() { const int _maxX = maxX; const int _maxY = maxY; for (i [...]
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list