[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