27
25
/* external parser functions from cfgparser.cxx */
28
27
/* parse given file as config file */
29
28
void parseFile(string filename);
30
29
/* set pointers for parsing */
31
30
void setPointers( ntlRenderGlobals *setglob);
31
#endif // ELBEEM_PLUGIN
34
34
/******************************************************************************
36
36
*****************************************************************************/
38
ntlWorld::ntlWorld() {
37
42
ntlWorld::ntlWorld(string filename, bool commandlineMode)
40
mpLightList(NULL), mpPropList(NULL), mpSims(NULL),
41
mpOpenGLRenderer(NULL),
42
mStopRenderVisualization( false ),
43
mThreadRunning( false ),
44
mSimulationTime(0.0), mFirstSim(-1),
45
mSingleStepDebug( false ),
49
/* create scene storage */
50
mpGlob = new ntlRenderGlobals();
51
mpLightList = new vector<ntlLightObject*>;
52
mpPropList = new vector<ntlMaterial*>;
53
mpSims = new vector<SimulationObject*>;
55
mpGlob->setLightList(mpLightList);
56
mpGlob->setMaterials(mpPropList);
57
mpGlob->setSims(mpSims);
59
/* init default material */
60
ntlMaterial *def = GET_GLOBAL_DEFAULT_MATERIAL;
61
mpPropList->push_back( def );
63
/* init the scene object */
65
scene = new ntlScene( mpGlob );
66
mpGlob->setScene( scene );
73
// setup opengl display, save first animation step for start time
74
if(!commandlineMode) {
75
mpOpenGLRenderer = new ntlOpenGLRenderer( mpGlob );
78
commandlineMode = true; // remove warning...
81
setPointers( getRenderGlobals() );
82
parseFile( filename.c_str() );
84
/*if(!SIMWORLD_OK()) return;
86
// init the scene for the first time
87
long sstartTime = getTime();
89
long sstopTime = getTime();
90
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"Scene build time: "<< getTimeString(sstopTime-sstartTime) <<" ", 10);
92
// TODO check simulations, run first steps
94
if(mpSims->size() > 0) {
96
// use values from first simulation as master time scale
97
long startTime = getTime();
99
// remember first active sim
100
for(size_t i=0;i<mpSims->size();i++) {
101
if(!(*mpSims)[i]->getVisible()) continue;
102
if((*mpSims)[i]->getPanic()) continue;
104
// check largest timestep
106
if( (*mpSims)[i]->getStepTime() > (*mpSims)[mFirstSim]->getStepTime() ) {
108
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"First Sim changed: "<<i ,10);
111
// check any valid sim
114
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"First Sim: "<<i ,10);
119
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"Anistart Time: "<<(*mpSims)[mFirstSim]->getStartTime() ,10);
120
while(mSimulationTime < (*mpSims)[mFirstSim]->getStartTime() ) {
121
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"Anistart Time: "<<(*mpSims)[mFirstSim]->getStartTime()<<" simtime:"<<mSimulationTime ,10);
124
long stopTime = getTime();
126
mSimulationTime += (*mpSims)[mFirstSim]->getStartTime();
127
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"Time for start simulations times "<<": "<< getTimeString(stopTime-startTime) <<"s ", 1);
129
guiResetSimulationTimeRange( mSimulationTime );
132
if(!mpGlob->getSingleFrameMode()) debMsgStd("ntlWorld::ntlWorld",DM_WARNING,"No active simulations!", 1);
48
commandlineMode = true; // remove warning...
52
setPointers( getRenderGlobals() );
53
parseFile( filename.c_str() );
55
// setup opengl display, save first animation step for start time
56
// init after parsing file...
57
if(!commandlineMode) {
58
mpOpenGLRenderer = new ntlOpenGLRenderer( mpGlob );
63
#else // ELBEEM_PLUGIN
64
errFatal("ntlWorld::init","Cfg file parsing not supported for API version!", SIMWORLD_INITERROR);
65
#endif // ELBEEM_PLUGIN
138
ntlWorld::ntlWorld(elbeemSimulationSettings *settings)
69
int globalDomainCounter = 1;
70
int ntlWorld::addDomain(elbeemSimulationSettings *settings)
141
// todo init settings
142
73
SimulationObject *sim = new SimulationObject();
75
snprintf(simname,100,"domain%04d",globalDomainCounter);
76
globalDomainCounter++;
77
sim->setName(string(simname));
143
78
mpGlob->getSims()->push_back( sim );
144
mpGlob->getScene()->addGeoClass( sim );
80
// important - add to both, only render scene objects are free'd
81
mpGlob->getRenderScene()->addGeoClass( sim );
82
mpGlob->getSimScene()->addGeoClass( sim );
145
83
sim->setGeoStart(ntlVec3Gfx(settings->geoStart[0],settings->geoStart[1],settings->geoStart[2]));
146
84
sim->setGeoEnd(ntlVec3Gfx(
147
85
settings->geoStart[0]+settings->geoSize[0],
148
86
settings->geoStart[1]+settings->geoSize[1],
149
87
settings->geoStart[2]+settings->geoSize[2] ));
150
sim->getSolver()->setSmoothing(1.0, 0.0);
151
sim->getSolver()->setPreviewSize(settings->previewresxyz);
152
sim->getSolver()->setRefinementDesired(settings->maxRefine);
88
// further init in postGeoConstrInit/initializeLbmSimulation of SimulationObject
89
sim->copyElbeemSettings(settings);
154
91
Parametrizer *param = sim->getParametrizer();
155
92
param->setSize( settings->resolutionxyz );
156
93
param->setDomainSize( settings->realsize );
157
param->setViscosity( settings->viscosity );
158
param->setGravity( ParamVec(settings->gravx, settings->gravy, settings->gravx) );
159
94
param->setAniStart( settings->animStart );
160
param->setAniFrameTime( settings->aniFrameTime );
161
95
param->setNormalizedGStar( settings->gstar );
163
// dont setup lights, camera, materials...?
165
ntlMaterial *fluidmat = new ntlMaterial( );
166
currentMaterial->setAmbientRefl( ntlColor(0.3, 0.5, 0.9) );
167
currentMaterial->setDiffuseRefl( ntlColor(0.3, 0.5, 0.9) );
168
currentMaterial->setSpecular( 0.2 );
169
currentMaterial->setSpecExponent( 10.0 );
170
mpGlob->getMaterials()->push_back( fluidmat );
97
// init domain channels
98
vector<ParamFloat> valf;
99
vector<ParamVec> valv;
102
#define INIT_CHANNEL_FLOAT(channel,size) \
103
valf.clear(); time.clear(); elbeemSimplifyChannelFloat(channel,&size); \
104
for(int i=0; i<size; i++) { valf.push_back( channel[2*i+0] ); time.push_back( channel[2*i+1] ); }
105
#define INIT_CHANNEL_VEC(channel,size) \
106
valv.clear(); time.clear(); elbeemSimplifyChannelVec3(channel,&size); \
107
for(int i=0; i<size; i++) { valv.push_back( ParamVec(channel[4*i+0],channel[4*i+1],channel[4*i+2]) ); time.push_back( channel[4*i+3] ); }
109
param->setViscosity( settings->viscosity );
110
if((settings->channelViscosity)&&(settings->channelSizeViscosity>0)) {
111
INIT_CHANNEL_FLOAT(settings->channelViscosity, settings->channelSizeViscosity);
112
param->initViscosityChannel(valf,time); }
114
param->setGravity( ParamVec(settings->gravity[0], settings->gravity[1], settings->gravity[2]) );
115
if((settings->channelGravity)&&(settings->channelSizeGravity>0)) {
116
INIT_CHANNEL_VEC(settings->channelGravity, settings->channelSizeGravity);
117
param->initGravityChannel(valv,time); }
119
param->setAniFrameTimeChannel( settings->aniFrameTime );
120
if((settings->channelFrameTime)&&(settings->channelSizeFrameTime>0)) {
121
INIT_CHANNEL_FLOAT(settings->channelFrameTime, settings->channelSizeFrameTime);
122
param->initAniFrameTimeChannel(valf,time); }
124
#undef INIT_CHANNEL_FLOAT
125
#undef INIT_CHANNEL_VEC
127
// might be set by previous domain
128
if(mpGlob->getAniFrames() < settings->noOfFrames) mpGlob->setAniFrames( settings->noOfFrames );
129
// set additionally to SimulationObject->mOutFilename
130
mpGlob->setOutFilename( settings->outputPath );
174
135
void ntlWorld::initDefaults()
196
157
mpPropList->push_back( def );
198
159
/* init the scene object */
199
ntlScene *newscene = new ntlScene( mpGlob );
200
mpGlob->setScene( newscene );
160
ntlScene *renderscene = new ntlScene( mpGlob, true );
161
mpGlob->setRenderScene( renderscene );
162
// sim scene shouldnt delete objs, may only contain subset
163
ntlScene *simscene = new ntlScene( mpGlob, false );
164
mpGlob->setSimScene( simscene );
203
167
void ntlWorld::finishWorldInit()
205
if(!SIMWORLD_OK()) return;
169
if(! isSimworldOk() ) return;
207
171
// init the scene for the first time
208
172
long sstartTime = getTime();
209
mpGlob->getScene()->buildScene();
174
// first init sim scene for geo setup
175
mpGlob->getSimScene()->buildScene(0.0, true);
176
if(! isSimworldOk() ) return;
177
mpGlob->getRenderScene()->buildScene(0.0, true);
178
if(! isSimworldOk() ) return;
210
179
long sstopTime = getTime();
211
180
debMsgStd("ntlWorld::ntlWorld",DM_MSG,"Scene build time: "<< getTimeString(sstopTime-sstartTime) <<" ", 10);
213
if(!SIMWORLD_OK()) return;
214
182
// TODO check simulations, run first steps
216
184
if(mpSims->size() > 0) {
417
402
bool done = false;
418
403
bool allPanic = true;
419
//debMsgStd("ntlWorld::advanceSims",DM_MSG,"Advancing sims to "<<targetTime, 10 ); // timedebug
405
// stop/quit, dont display/render
406
if(getElbeemState()==SIMWORLD_STOP) {
421
410
for(size_t i=0;i<mpSims->size();i++) { (*mpSims)[i]->setFrameNum(framenum); }
422
double targetTime = mSimulationTime + (*mpSims)[mFirstSim]->getFrameTime();
423
//FIXME check blender abort here...
424
//FIXME check no ipo export
411
double targetTime = mSimulationTime + (*mpSims)[mFirstSim]->getFrameTime(framenum);
426
413
// time stopped? nothing else to do...
427
if( (*mpSims)[mFirstSim]->getFrameTime() <= 0.0 ){
414
if( (*mpSims)[mFirstSim]->getFrameTime(framenum) <= 0.0 ){
428
415
done=true; allPanic=false;
431
#if ELBEEM_BLENDER==1
419
//#if ELBEEM_BLENDER==1
432
420
// same as solver_main check, but no mutex check here
433
if(getGlobalBakeState()<0) {
434
// this means abort... cause panic
435
allPanic = true; done = true;
437
#endif // ELBEEM_BLENDER==1
421
//gstate = getGlobalBakeState();
422
//if(gstate<0) { allPanic = true; done = true; } // this means abort... cause panic
423
//#endif // ELBEEM_BLENDER==1
439
425
// step all the sims, and check for panic
426
debMsgStd("ntlWorld::advanceSims",DM_MSG, " sims "<<mpSims->size()<<" t"<<targetTime<<" done:"<<done<<" panic:"<<allPanic<<" gstate:"<<gstate, 10); // debug // timedebug
441
double nextTargetTime = (*mpSims)[mFirstSim]->getCurrentTime() + (*mpSims)[mFirstSim]->getStepTime();
428
double nextTargetTime = (*mpSims)[mFirstSim]->getCurrentTime() + (*mpSims)[mFirstSim]->getTimestep();
442
429
singleStepSims(nextTargetTime);
444
431
// check target times
446
433
allPanic = false;
447
for(size_t i=0;i<mpSims->size();i++) {
448
if(!(*mpSims)[i]->getVisible()) continue;
449
if((*mpSims)[i]->getPanic()) allPanic = true; // do any panic now!?
450
//debMsgStd("ntlWorld::advanceSims",DM_MSG, " sim "<<i<<" c"<<(*mpSims)[i]->getCurrentTime()<<" p"<<(*mpSims)[i]->getPanic()<<" t"<<targetTime, 10); // debug // timedebug
435
if((*mpSims)[mFirstSim]->getTimestep() <1e-9 ) {
436
// safety check, avoid timesteps that are too small
437
errMsg("ntlWorld::advanceSims","Invalid time step, causing panic! curr:"<<(*mpSims)[mFirstSim]->getCurrentTime()<<" next:"<<nextTargetTime<<", stept:"<< (*mpSims)[mFirstSim]->getTimestep() );
440
for(size_t i=0;i<mpSims->size();i++) {
441
if(!(*mpSims)[i]->getVisible()) continue;
442
if((*mpSims)[i]->getPanic()) allPanic = true; // do any panic now!?
443
debMsgStd("ntlWorld::advanceSims",DM_MSG, "Sim "<<i<<", currt:"<<(*mpSims)[i]->getCurrentTime()<<", nt:"<<nextTargetTime<<", panic:"<<(*mpSims)[i]->getPanic()<<", targett:"<<targetTime, 10); // debug // timedebug
452
446
if( (targetTime - (*mpSims)[mFirstSim]->getCurrentTime()) > LBM_TIME_EPSILON) done=false;
453
447
if(allPanic) done = true;
858
851
delete [] finalPic;
859
glob->getScene()->cleanupScene();
852
glob->getRenderScene()->cleanupScene();
861
854
if(mpGlob->getSingleFrameMode() ) {
862
855
debMsgStd("ntlWorld::renderScene",DM_NOTIFY, "Single frame mode done...", 1 );
865
#endif // ELBEEM_BLENDER
858
#endif // ELBEEM_PLUGIN
863
/******************************************************************************
865
*****************************************************************************/
868
/*****************************************************************************/
869
/* Constructor with standard value init */
870
ntlRenderGlobals::ntlRenderGlobals() :
871
mpRenderScene(NULL), mpSimScene(NULL),
872
mpLightList( NULL ), mpMaterials( NULL ), mpSims( NULL ),
873
mResX(320), mResY(200), mAADepth(-1), mMaxColVal(255),
875
mvEye(0.0,0.0,5.0), mvLookat(0.0,0.0,0.0), mvUpvec(0.0,1.0,0.0),
876
mAspect(320.0/200.0),
877
mFovy(45), mcBackgr(0.0,0.0,0.0), mcAmbientLight(0.0,0.0,0.0),
879
mAniStart(0), mAniFrames( -1 ), mAniCount( 0 ),
881
mCounterRays( 0 ), mCounterShades( 0 ), mCounterSceneInter( 0 ),
882
mOutFilename( "pic" ),
883
mTreeMaxDepth( 30 ), mTreeMaxTriangles( 30 ),
886
mTestSphereEnabled( false ),
887
mDebugPixelX( -1 ), mDebugPixelY( -1 ), mTestMode(false),
888
mSingleFrameMode(false), mSingleFrameFilename("")
889
//,mpRndDirections( NULL ), mpRndRoulette( NULL )
891
// create internal attribute list for opengl renderer
892
mpOpenGlAttr = new AttributeList("__ntlOpenGLRenderer");
893
mpBlenderAttr = new AttributeList("__ntlBlenderAttr");
897
/*****************************************************************************/
899
ntlRenderGlobals::~ntlRenderGlobals() {
900
if(mpOpenGlAttr) delete mpOpenGlAttr;
901
if(mpBlenderAttr) delete mpBlenderAttr;
905
/*****************************************************************************/
906
//! get the next random photon direction
907
//ntlVec3Gfx ntlRenderGlobals::getRandomDirection( void ) {
909
//(mpRndDirections->getGfxReal()-0.5),
910
//(mpRndDirections->getGfxReal()-0.5),
911
//(mpRndDirections->getGfxReal()-0.5) );