[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