[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46248] branches/smoke2: Fix errors + crashes on several occasion.

Daniel Genrich daniel.genrich at gmx.net
Fri May 4 00:47:01 CEST 2012


Revision: 46248
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46248
Author:   genscher
Date:     2012-05-03 22:47:00 +0000 (Thu, 03 May 2012)
Log Message:
-----------
Fix errors + crashes on several occasion.

Known bug: _flags doesn't get used correctly in the init() of the "Smoke init B"

Modified Paths:
--------------
    branches/smoke2/intern/smoke/intern/smoke_API.cpp
    branches/smoke2/intern/smoke/intern/source/grid.h
    branches/smoke2/intern/smoke/intern/source/smoke.cpp
    branches/smoke2/intern/smoke/intern/util/randomstream.h
    branches/smoke2/intern/smoke/intern/util/waveletnoise.h
    branches/smoke2/source/blender/blenkernel/intern/smoke.c

Modified: branches/smoke2/intern/smoke/intern/smoke_API.cpp
===================================================================
--- branches/smoke2/intern/smoke/intern/smoke_API.cpp	2012-05-03 21:35:04 UTC (rev 46247)
+++ branches/smoke2/intern/smoke/intern/smoke_API.cpp	2012-05-03 22:47:00 UTC (rev 46248)
@@ -43,11 +43,6 @@
 extern "C" FLUID_3D *smoke_init(int *res, float *p0, float dtdef)
 {
 	printf("-------------------- SMOKE CREATE --------------------------\n");
-	/*
-	res[0] = 32;
-	res[1] = 32;
-	res[2] = 32;
-	*/
 	FLUID_3D *fluid = new FLUID_3D(res);
 	printf("-------------------- SMOKE INIT --------------------------\n");
 	if(!fluid->_init)
@@ -133,7 +128,10 @@
 
 extern "C" float *smoke_get_density(FLUID_3D *fluid)
 {
-	return fluid->_density->data();
+	if(fluid->_density)
+		return fluid->_density->data();
+	else
+		return NULL;
 }
 
 extern "C" float *smoke_get_heat(FLUID_3D *fluid)

Modified: branches/smoke2/intern/smoke/intern/source/grid.h
===================================================================
--- branches/smoke2/intern/smoke/intern/source/grid.h	2012-05-03 21:35:04 UTC (rev 46247)
+++ branches/smoke2/intern/smoke/intern/source/grid.h	2012-05-03 22:47:00 UTC (rev 46248)
@@ -316,7 +316,7 @@
 	mpData = new Scalar[numElems];
 	mDataSize = numElems;
 
-	for (int i=0; i<mSizeX*mSizeY*mSizeZ; i++) {
+	for (int i=0; i<numElems; i++) {
 		mpData[i] = zero;
 	} 
 	
@@ -361,6 +361,11 @@
 	size_t allocSize = (numElems * 1.5);
 	mpData = new Scalar[allocSize];
 	mDataSize = allocSize;
+	
+	for (int i=0; i<allocSize; i++) {
+		mpData[i] = zero;
+	} 
+
 	if (debugRealloc) debMsg("Grid::resizeGridMem","Data block re-allocated");
 }
 

Modified: branches/smoke2/intern/smoke/intern/source/smoke.cpp
===================================================================
--- branches/smoke2/intern/smoke/intern/source/smoke.cpp	2012-05-03 21:35:04 UTC (rev 46247)
+++ branches/smoke2/intern/smoke/intern/source/smoke.cpp	2012-05-03 22:47:00 UTC (rev 46248)
@@ -5,13 +5,12 @@
 
 void FLUID_3D::init()
 {
-	/*
 	printf("-------------------- SMOKE INIT A-------------------------\n");
 	{ // static scene
 		printf("init res %d, %d, %d\n", _res[0], _res[1], _res[2]);
-		SolverObject* solver = new SolverObject( "makescene", nVec3i ( _res[0], _res[1], _res[2] ) ); // 200, 80, 150
-		solver->createVec3Grid ( "normal" );
-		solver->createRealGrid ( "dist" );
+		SolverObject* solver = new SolverObject( "makescene", nVec3i ( _res[0], _res[1], _res[2] ), DDF_GRID_NO_FREE ); // 200, 80, 150
+		solver->createVec3Grid ( "normal", DDF_GRID_NO_FREE );
+		solver->createRealGrid ( "dist", DDF_GRID_NO_FREE );
 		solver->addInitPlugin ( "init-box-domain",  IntArg ( "flag-inside",FFLUID ) + IntArg ( "flag-border",FINFLOW ) + IntArg("flag-floor", FOBSTACLE) );
 		// obstacles
 		solver->addInitPlugin ( "init-sphere", VecArg("center",Vec3(0.25,0.6,0.35)) + RealArg("radius",0.1) + StringArg("norm","normal")+StringArg("dist","dist"));	
@@ -26,7 +25,8 @@
 
 		solver->addInitPlugin ( "dump-universal", StringArg ( "grid", "flags" ) + StringArg ( "override-name","scene/static-flags" )  + IntArg ( "single-dump", 1 ) );	
 		solver->addInitPlugin ( "dump-universal", StringArg ( "grid", "dist" ) + StringArg ( "override-name","scene/static-dist" )  + IntArg ( "single-dump", 1 ) );	
-		solver->addInitPlugin ( "dump-universal", StringArg ( "grid", "normal" ) + StringArg ( "override-name","scene/static-normal" )  + IntArg ( "single-dump", 1 ) );	
+		solver->addInitPlugin ( "dump-universal", StringArg ( "grid", "normal" ) + StringArg ( "override-name","scene/static-normal" )  + IntArg ( "single-dump", 1 ) );
+
 		_solvers.push_back(solver);
 	}
 
@@ -36,12 +36,12 @@
 
 	finalizeAllSolvers();
 
-	// _flags = _solvers[0]->getParams().getGridInt("flags");
-	// _normal = _solvers[0]->getParams().getGridVec3("normal");
-	// _dist = _solvers[0]->getParams().getGridReal("dist");
+	_flags = _solvers[0]->getParams().getGridInt("flags");
+	_normal = _solvers[0]->getParams().getGridVec3("normal");
+	_dist = _solvers[0]->getParams().getGridReal("dist");
 
 	freeAllSolvers();
-
+/*
 	{
 		Vec3 inflow (0.4, 0, 0);
 		const int nFrames = 50;
@@ -51,13 +51,13 @@
 	printf("-------------------- SMOKE INIT B-------------------------\n");
 	{
 		Vec3 inflow (0.4, 0, 0);
-		SolverObject* solver = new SolverObject( "run_static", "scene/static-flags.gz" );
+		SolverObject* solver = new SolverObject( "run_static", _flags);
 		solver->getParams().mU0 = inflow;
 		solver->getParams().mTimestepAnim = 0.005;
 			
 		// create grids
 		solver->createVec3Grid ( "mean-flow" );
-		solver->createRealGrid ( "dist" );
+		solver->createRealGrid ( "dist", _dist );
 		solver->createVec3Grid ( "vorticity", DDF_GRID_NO_FREE );
 		solver->createVec3Grid ( "ABL" );
 		solver->createVec3Grid ( "pre-ABL" );
@@ -65,18 +65,18 @@
 		solver->createRealGrid ( "pdf" );
 		solver->createRealGrid ( "density", DDF_GRID_NO_FREE );
 		solver->addStandardSolverGrids();
-		solver->createNoiseField("noise", Vec3(0.), Vec3(50,50,50), -0.4, 2.0, 0.002);
+		solver->createNoiseField("noise", Vec3(0.), Vec3(50,50,50), -0.4, 20.0 /* 2.0 */, 0.002);
 
 		// program solver initialization process
-		solver->addInitPlugin ( "load-universal", StringArg("grid","dist") + StringArg("file","scene/static-dist.gz"));
+		// solver->addInitPlugin ( "load-universal", StringArg("grid","dist") + StringArg("file","scene/static-dist.gz"));
 		solver->addInitPlugin ( "load-universal", StringArg("grid","mean-flow") + StringArg("file","scene/static-mean.gz"));
 		solver->addInitPlugin ( "load-universal", StringArg("grid","pre-ABL") + StringArg("file","scene/static-abl.gz"));
 		
 		// program solver main loop
 		solver->addPlugin ( "copy-grid", StringArg ( "src","mean-flow" ) + StringArg ( "dest","vel-curr") );
-		solver->addPlugin ("init-density-inflow", StringArg("density","density") + RealArg("target-value",0.7) + IntArg("flag", FDENSITYSOURCE) + StringArg("noise","noise")); 
+		solver->addPlugin ("init-density-inflow", StringArg("density","density") + RealArg("target-value",0.7) + IntArg("flag", FDENSITYSOURCE) + StringArg("noise","noise"));
 		solver->addPlugin ( "gen-vpart", StringArg ("source","pre-ABL") + StringArg ("flow","ABL") + StringArg("dist","dist") + StringArg("pdf","pdf") +
-							RealArg("thres-vort", 2e-2) + RealArg("thres-pdf",5e-5) + RealArg("mult-pdf",1) + RealArg("scale-flow",0.94) + RealArg("max-bl",0.15) +
+							RealArg("thres-vort", 2e-2) + RealArg("thres-pdf",5e-5) + RealArg("mult-pdf",1) + RealArg("scale-flow", 0.94) + RealArg("max-bl",0.15) +
 							RealArg("min-dist", 3) + RealArg("min-rad", 3) + RealArg("max-rad", 7) + RealArg("vortex-gain", 2.5) + RealArg("fade-in", 0));
 	 
 		solver->addPlugin ( "semi-lagr-advect-vec3", StringArg ( "vel-src","ABL" ) + IntArg ( "mac", 0) );
@@ -86,7 +86,7 @@
    							RealArg("dissipate-radius",1) + RealArg("radius-cascade",1.5) );
 		solver->addPlugin ("compute-vorticity", StringArg("vorticity","vort"));	
 		solver->addPlugin ("maccormack-advect-real", StringArg("real-src","density"));
-		solver->addPlugin( "dump-df3", IntArg("max-frames",200) + StringArg("gridname","density") + StringArg("prefix","sta") + RealArg("start-time",0) + IntArg("pbrt",1) + StringArg ( "override-name", "render/static" ));
+		// solver->addPlugin( "dump-df3", IntArg("max-frames",200) + StringArg("gridname","density") + StringArg("prefix","sta") + RealArg("start-time",0) + IntArg("pbrt",1) + StringArg ( "override-name", "render/static" ));
 
 		_solvers.push_back(solver);
 	}
@@ -104,7 +104,7 @@
 void FLUID_3D::precompute(const std::string& name, const Vec3& inflow, int frames, bool dynamic, const Vec3& rotAxis, Real rotSpeed)
 {
 	bool rotate = (rotSpeed != 0.);
-	SolverObject* solver = new SolverObject( "precompute", "scene/" + name + "-flags.gz" );
+	SolverObject* solver = new SolverObject( "precompute", _flags );
 
 	// create grids
 	solver->createVec3Grid ( "normal" );

Modified: branches/smoke2/intern/smoke/intern/util/randomstream.h
===================================================================
--- branches/smoke2/intern/smoke/intern/util/randomstream.h	2012-05-03 21:35:04 UTC (rev 46247)
+++ branches/smoke2/intern/smoke/intern/util/randomstream.h	2012-05-03 22:47:00 UTC (rev 46248)
@@ -81,12 +81,13 @@
 		uint32 hiBit( const uint32& u ) const { return u & 0x80000000UL; }
 		uint32 loBit( const uint32& u ) const { return u & 0x00000001UL; }
 		uint32 loBits( const uint32& u ) const { return u & 0x7fffffffUL; }
-		uint32 mixBits( const uint32& u, const uint32& v ) const { 
-			return hiBit(u) | loBits(v); 
+		uint32 mixBits( const uint32& u, const uint32& v ) const 
+		{ return hiBit(u) | loBits(v); }
+		uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const 
+		{ 
+			return m ^ (mixBits(s0,s1)>>1) ^ ((~loBit(s1) + 1) & 0x9908b0dfUL);
+			// return m ^ (mixBits(s0,s1)>>1) ^ (-((int)loBit(s1)) & 0x9908b0dfUL); 
 		}
-		uint32 twist( const uint32& m, const uint32& s0, const uint32& s1 ) const { 
-			return m ^ (mixBits(s0,s1)>>1) ^ (-loBit(s1) & 0x9908b0dfUL); 
-		}
 		static uint32 hash( time_t t, clock_t c );
 };
 
@@ -216,6 +217,10 @@
 
 inline void MTRand::seed()
 {
+  // seed deterministically to produce reproducible runs
+  seed(123456);
+  
+  /*
 	// Seed the generator with an array from /dev/urandom if available
 	// Otherwise use a hash of time() and clock() values
 	
@@ -235,6 +240,7 @@
 	
 	// Was not successful, so use time() and clock() instead
 	seed( hash( time(NULL), clock() ) );
+  */
 }
 
 

Modified: branches/smoke2/intern/smoke/intern/util/waveletnoise.h
===================================================================
--- branches/smoke2/intern/smoke/intern/util/waveletnoise.h	2012-05-03 21:35:04 UTC (rev 46247)
+++ branches/smoke2/intern/smoke/intern/util/waveletnoise.h	2012-05-03 22:47:00 UTC (rev 46248)
@@ -53,8 +53,8 @@
 	const float *a = &_aCoeffs[16];
 	for (int i = 0; i < n / 2; i++) {
 		to[i * stride] = 0;
-		for (int k = 2 * i - 16; k < 2 * i + 16; k++) // DG correcting for now
-			to[i * stride] += a[k - 2 * i] * from[modFast128(k) * stride]; // DG TODO: correct this? < <= need to test if this goes outside bounds, also with upsampling!
+		for (int k = 2 * i - 16; k < 2 * i + 16; k++)
+			to[i * stride] += a[k - 2 * i] * from[modFast128(k) * stride];
 	}
 }
 

Modified: branches/smoke2/source/blender/blenkernel/intern/smoke.c

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list