/****************************************************************************** * render a whole animation (visualization mode) * this function is run in another thread, and communicates * with the parent thread via a mutex *****************************************************************************/ int ntlWorld::renderVisualization( bool multiThreaded ) { #ifndef NOGUI if(getElbeemState() != SIMWORLD_INITED) { return 0; } if(multiThreaded) mThreadRunning = true; // TODO, check global state? while(!getStopRenderVisualization()) { if(mpSims->size() <= 0) { debMsgStd("ntlWorld::renderVisualization",DM_NOTIFY,"No simulations found, stopping...",1); stopSimulationThread(); break; } // determine stepsize if(!mSingleStepDebug) { long startTime = getTime(); advanceSims(mFrameCnt); mFrameCnt++; long stopTime = getTime(); debMsgStd("ntlWorld::renderVisualization",DM_MSG,"Time for t="<<mSimulationTime<<": "<< getTimeString(stopTime-startTime) <<" ", 10); } else { double targetTime = mSimulationTime + (*mpSims)[mFirstSim]->getTimestep(); singleStepSims(targetTime); // check paniced sims (normally done by advanceSims bool allPanic = true; for(size_t i=0;i<mpSims->size();i++) { if(!(*mpSims)[i]->getPanic()) allPanic = false; } if(allPanic) { warnMsg("ntlWorld::advanceSims","All sims panicked... stopping thread" ); setStopRenderVisualization( true ); } if(! isSimworldOk() ) { warnMsg("ntlWorld::advanceSims","World state error... stopping" ); setStopRenderVisualization( true ); } } // save frame if(mpOpenGLRenderer) mpOpenGLRenderer->saveAnimationFrame( mSimulationTime ); // for non-threaded check events if(!multiThreaded) { Fl::check(); gpElbeemFrame->SceneDisplay->doOnlyForcedRedraw(); } } mThreadRunning = false; stopSimulationRestoreGui(); #else multiThreaded = false; // remove warning #endif return 0; }
void QLoggingSettingsParser::parseNextLine(QStringRef line) { // Remove whitespace at start and end of line: line = line.trimmed(); // comment if (line.startsWith(QLatin1Char(';'))) return; if (line.startsWith(QLatin1Char('[')) && line.endsWith(QLatin1Char(']'))) { // new section auto sectionName = line.mid(1, line.size() - 2).trimmed(); m_inRulesSection = sectionName.compare(QLatin1String("rules"), Qt::CaseInsensitive) == 0; return; } if (m_inRulesSection) { int equalPos = line.indexOf(QLatin1Char('=')); if (equalPos != -1) { if (line.lastIndexOf(QLatin1Char('=')) == equalPos) { const auto pattern = line.left(equalPos).trimmed(); const auto valueStr = line.mid(equalPos + 1).trimmed(); int value = -1; if (valueStr == QLatin1String("true")) value = 1; else if (valueStr == QLatin1String("false")) value = 0; QLoggingRule rule(pattern, (value == 1)); if (rule.flags != 0 && (value != -1)) _rules.append(rule); else warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData()); } else { warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData()); } } } }
//__________________________________________________________________________________ _PMathObj _Constant::InvChi2 (_PMathObj n) // chi^2 n d.f. probability up to x { if (!chi2) { _String fla ("IGamma(_n_,_x_)"); chi2 = new _Formula (fla, nil); fla = "_x_^(_n_-1)/Gamma(_n_)/Exp(_x_)"; derchi2 = new _Formula (fla,nil); } _Constant halfn (((_Constant*)n)->theValue*.5); if ((theValue<0)||(halfn.theValue<0)||(theValue>1.0)) { _String warnMsg ("InvChi2(x,n) only makes sense for n positive, and x in [0,1]"); ReportWarning (warnMsg); return new _Constant (0.0); } LocateVar(dummyVariable2)->SetValue (&halfn); halfn.SetValue(chi2->Newton(*derchi2,theValue,1e-25,1.e100,LocateVar(dummyVariable1))*2); return (_PMathObj)halfn.makeDynamic(); }
void ShowFoto::slotDeleteCurrentItem() { QUrl urlCurrent(d->thumbBar->currentUrl()); QString warnMsg(i18n("About to delete file \"%1\"\nAre you sure?", urlCurrent.fileName())); if (QMessageBox::warning(this, qApp->applicationName(), warnMsg, QMessageBox::Apply | QMessageBox::Abort) != QMessageBox::Apply) { return; } else { bool ret = QFile::remove(urlCurrent.toLocalFile()); if (!ret) { QMessageBox::critical(this, qApp->applicationName(), i18n("Cannot delete \"%1\"", urlCurrent.fileName())); return; } // No error, remove item in thumbbar. d->model->removeIndex(d->thumbBar->currentIndex()); // Disable menu actions and SideBar if no current image. d->itemsNb = d->thumbBar->showfotoItemInfos().size(); if (d->itemsNb == 0) { slotUpdateItemInfo(); toggleActions(false); m_canvas->load(QString(), m_IOFileSettings); } else { // If there is an image after the deleted one, make that selected. slotOpenUrl(d->thumbBar->currentInfo()); } } }
/****************************************************************************** * advance simulations by time t *****************************************************************************/ int ntlWorld::advanceSims(int framenum) { bool done = false; bool allPanic = true; // stop/quit, dont display/render if(getElbeemState()==SIMWORLD_STOP) { return 1; } for(size_t i=0;i<mpSims->size();i++) { (*mpSims)[i]->setFrameNum(framenum); } double targetTime = mSimulationTime + (*mpSims)[mFirstSim]->getFrameTime(framenum); // time stopped? nothing else to do... if( (*mpSims)[mFirstSim]->getFrameTime(framenum) <= 0.0 ){ done=true; allPanic=false; } int gstate = 0; myTime_t advsstart = getTime(); // step all the sims, and check for panic debMsgStd("ntlWorld::advanceSims",DM_MSG, " sims "<<mpSims->size()<<" t"<<targetTime<<" done:"<<done<<" panic:"<<allPanic<<" gstate:"<<gstate, 10); // debug // timedebug while(!done) { double nextTargetTime = (*mpSims)[mFirstSim]->getCurrentTime() + (*mpSims)[mFirstSim]->getTimestep(); singleStepSims(nextTargetTime); // check target times done = true; allPanic = false; if((*mpSims)[mFirstSim]->getTimestep() <1e-9 ) { // safety check, avoid timesteps that are too small errMsg("ntlWorld::advanceSims","Invalid time step, causing panic! curr:"<<(*mpSims)[mFirstSim]->getCurrentTime()<<" next:"<<nextTargetTime<<", stept:"<< (*mpSims)[mFirstSim]->getTimestep() ); allPanic = true; } else { for(size_t i=0;i<mpSims->size();i++) { if(!(*mpSims)[i]->getVisible()) continue; if((*mpSims)[i]->getPanic()) allPanic = true; // do any panic now!? debMsgStd("ntlWorld::advanceSims",DM_MSG, "Sim "<<i<<", currt:"<<(*mpSims)[i]->getCurrentTime()<<", nt:"<<nextTargetTime<<", panic:"<<(*mpSims)[i]->getPanic()<<", targett:"<<targetTime, 10); // debug // timedebug } } if( (targetTime - (*mpSims)[mFirstSim]->getCurrentTime()) > LBM_TIME_EPSILON) done=false; if(allPanic) done = true; } if(allPanic) { warnMsg("ntlWorld::advanceSims","All sims panicked... stopping thread" ); setStopRenderVisualization( true ); return 1; } myTime_t advsend = getTime(); debMsgStd("ntlWorld::advanceSims",DM_MSG,"Overall steps so far took:"<< getTimeString(advsend-advsstart)<<" for sim time "<<targetTime, 4); // finish step for(size_t i=0;i<mpSims->size();i++) { SimulationObject *sim = (*mpSims)[i]; if(!sim->getVisible()) continue; if(sim->getPanic()) continue; sim->prepareVisualization(); } return 0; }
//ntlTree::ntlTree(int depth, int objnum, vector<ntlVec3Gfx> *vertices, vector<ntlVec3Gfx> *normals, vector<ntlTriangle> *trilist) : ntlTree::ntlTree(int depth, int objnum, ntlScene *scene, int triFlagMask) : mStart(0.0), mEnd(0.0), mMaxDepth( depth ), mMaxListLength( objnum ), mpRoot( NULL) , mpNodeStack( NULL), mpTBB( NULL ), mTriangleMask( 0xFFFF ), mCurrentDepth(0), mCurrentNodes(0), mTriDoubles(0) { // init scene data pointers mpVertices = scene->getVertexPointer(); mpVertNormals = scene->getVertexNormalPointer(); mpTriangles = scene->getTrianglePointer(); mTriangleMask = triFlagMask; if(mpTriangles == NULL) { errFatal( "ntlTree Cons","no triangle list!\n",SIMWORLD_INITERROR); return; } if(mpTriangles->size() == 0) { warnMsg( "ntlTree::ntlTree","No triangles ("<< mpTriangles->size() <<")!\n"); mStart = mEnd = ntlVec3Gfx(0,0,0); return; } if(depth>=BSP_STACK_SIZE) { errFatal( "ntlTree::ntlTree","Depth to high ("<< mMaxDepth <<")!\n", SIMWORLD_INITERROR ); return; } /* check triangles (a bit inefficient, but we dont know which vertices belong to this tree), and generate bounding boxes */ mppTriangles = new vector<ntlTriangle *>; int noOfTriangles = mpTriangles->size(); mpTBB = new TriangleBBox[ noOfTriangles ]; int bbCount = 0; mStart = mEnd = (*mpVertices)[ mpTriangles->front().getPoints()[0] ]; //errMsg("TreeDebug","Start"); for (vector<ntlTriangle>::iterator iter = mpTriangles->begin(); iter != mpTriangles->end(); iter++ ) { //errorOut(" d "<< convertFlags2String((int)(*iter).getFlags()) <<" "<< convertFlags2String( (int)mTriangleMask)<<" add? "<<( ((int)(*iter).getFlags() & (int)mTriangleMask) != 0 ) ); // discard triangles that dont match mask if( ((int)(*iter).getFlags() & (int)mTriangleMask) == 0 ) { continue; } // test? TODO ntlVec3Gfx tnormal = (*mpVertNormals)[ (*iter).getPoints()[0] ]+ (*mpVertNormals)[ (*iter).getPoints()[1] ]+ (*mpVertNormals)[ (*iter).getPoints()[2] ]; ntlVec3Gfx triangleNormal = (*iter).getNormal(); if( equal(triangleNormal, ntlVec3Gfx(0.0)) ) continue; if( equal( tnormal, ntlVec3Gfx(0.0)) ) continue; // */ ntlVec3Gfx bbs, bbe; //errMsg("TreeDebug","Triangle"); for(int i=0;i<3;i++) { int index = (*iter).getPoints()[i]; ntlVec3Gfx tp = (*mpVertices)[ index ]; //errMsg("TreeDebug"," Point "<<i<<" = "<<tp<<" "); if(tp[0] < mStart[0]) mStart[0]= tp[0]; if(tp[0] > mEnd[0]) mEnd[0]= tp[0]; if(tp[1] < mStart[1]) mStart[1]= tp[1]; if(tp[1] > mEnd[1]) mEnd[1]= tp[1]; if(tp[2] < mStart[2]) mStart[2]= tp[2]; if(tp[2] > mEnd[2]) mEnd[2]= tp[2]; if(i==0) { bbs = bbe = tp; } else { if( tp[0] < bbs[0] ) bbs[0] = tp[0]; if( tp[0] > bbe[0] ) bbe[0] = tp[0]; if( tp[1] < bbs[1] ) bbs[1] = tp[1]; if( tp[1] > bbe[1] ) bbe[1] = tp[1]; if( tp[2] < bbs[2] ) bbs[2] = tp[2]; if( tp[2] > bbe[2] ) bbe[2] = tp[2]; } } mppTriangles->push_back( &(*iter) ); //errMsg("TreeDebug","Triangle "<<(*mpVertices)[(*iter).getPoints()[0]]<<" "<<(*mpVertices)[(*iter).getPoints()[1]]<<" "<<(*mpVertices)[(*iter).getPoints()[2]]<<" "); // add BB mpTBB[ bbCount ].start = bbs; mpTBB[ bbCount ].end = bbe; (*iter).setBBoxId( bbCount ); bbCount++; } /* slighlty enlarge bounding tolerance for tree to avoid problems with triangles paralell to slabs */ mStart -= ntlVec3Gfx( getVecEpsilon() ); mEnd += ntlVec3Gfx( getVecEpsilon() ); /* init root node and stack */ mpNodeStack = new BSPStack; mpRoot = new BSPNode; mpRoot->min = mStart; mpRoot->max = mEnd; mpRoot->axis = AXIS_X; mpRoot->members = mppTriangles; mpRoot->child[0] = mpRoot->child[1] = NULL; mpRoot->cloneVec = 0; globalSortingPoints = mpVertices; mpTriDist = new char[ mppTriangles->size() ]; mNumNodes = 1; mAbortSubdiv = 0; /* create tree */ debugOutInter( "Generating BSP Tree... (Nodes "<< mCurrentNodes << ", Depth "<<mCurrentDepth<< ") ", 2, 2000 ); subdivide(mpRoot, 0, AXIS_X); debMsgStd("ntlTree::ntlTree",DM_MSG,"Generated Tree: Nodes "<< mCurrentNodes << ", Depth "<<mCurrentDepth<< " with "<<noOfTriangles<<" triangles", 2 ); delete [] mpTriDist; delete [] mpTBB; mpTriDist = NULL; mpTBB = NULL; /* calculate some stats about tree */ int noLeafs = 0; gfxReal avgDepth = 0.0; gfxReal triPerLeaf = 0.0; int totalTris = 0; calcStats(mpRoot,0, noLeafs, avgDepth, triPerLeaf, totalTris); avgDepth /= (gfxReal)noLeafs; triPerLeaf /= (gfxReal)noLeafs; debMsgStd("ntlTree::ntlTree",DM_MSG,"Tree ("<<doSort<<","<<chooseAxis<<") Stats: Leafs:"<<noLeafs<<", avgDepth:"<<avgDepth<< ", triPerLeaf:"<<triPerLeaf<<", triDoubles:"<<mTriDoubles<<", totalTris:"<<totalTris <<" nodes:"<<mNumNodes //<<" T"<< (totalTris%3) // 0=ich, 1=f, 2=a , 2 ); if(mAbortSubdiv) { errMsg("ntlTree::ntlTree","Aborted... "<<mNumNodes); deleteNode(mpRoot); mpRoot = NULL; } }
/****************************************************************************** * advance simulations by time t *****************************************************************************/ int ntlWorld::advanceSims(int framenum) { bool done = false; bool allPanic = true; // stop/quit (abort), dont display/render if(!isSimworldOk()) { return 1; } for(size_t i=0;i<mpSims->size();i++) { (*mpSims)[i]->setFrameNum(framenum); } // time stopped? nothing else to do... if( (*mpSims)[mFirstSim]->getFrameTime(framenum) <= 0.0 ){ done=true; allPanic=false; /* DG: Need to check for user cancel here (fix for [#30298]) */ (*mpSims)[mFirstSim]->checkCallerStatus(FLUIDSIM_CBSTATUS_STEP, 0); } // Prevent bug [#29186] Object contribute to fluid sim animation start earlier than keyframe // Was: double targetTime = mSimulationTime + (*mpSims)[mFirstSim]->getFrameTime(framenum); - DG double totalTime = 0.0, targetTime = 0.0; for(size_t i = 0; i < mSimFrameCnt; i++) { /* We need an intermediate array "mSimFrameValue" because otherwise if we don't start with starttime = 0, the sim gets out of sync - DG */ totalTime += (*mpSims)[mFirstSim]->getFrameTime(mSimFrameValue[i]); } targetTime = totalTime + (*mpSims)[mFirstSim]->getFrameTime(framenum); int gstate = 0; myTime_t advsstart = getTime(); // step all the sims, and check for panic debMsgStd("ntlWorld::advanceSims",DM_MSG, " sims "<<mpSims->size()<<" t"<<targetTime<<" done:"<<done<<" panic:"<<allPanic<<" gstate:"<<gstate, 10); // debug // timedebug while(!done) { double nextTargetTime = (*mpSims)[mFirstSim]->getCurrentTime() + (*mpSims)[mFirstSim]->getTimestep(); singleStepSims(nextTargetTime); // check target times done = true; allPanic = false; if((*mpSims)[mFirstSim]->getTimestep() <1e-9 ) { // safety check, avoid timesteps that are too small errMsg("ntlWorld::advanceSims","Invalid time step, causing panic! curr:"<<(*mpSims)[mFirstSim]->getCurrentTime()<<" next:"<<nextTargetTime<<", stept:"<< (*mpSims)[mFirstSim]->getTimestep() ); allPanic = true; } else { for(size_t i=0;i<mpSims->size();i++) { if(!(*mpSims)[i]->getVisible()) continue; if((*mpSims)[i]->getPanic()) allPanic = true; // do any panic now!? debMsgStd("ntlWorld::advanceSims",DM_MSG, "Sim "<<i<<", currt:"<<(*mpSims)[i]->getCurrentTime()<<", nt:"<<nextTargetTime<<", panic:"<<(*mpSims)[i]->getPanic()<<", targett:"<<targetTime, 10); // debug // timedebug } } if( (targetTime - (*mpSims)[mFirstSim]->getCurrentTime()) > LBM_TIME_EPSILON) done=false; if(allPanic) done = true; } if(allPanic) { warnMsg("ntlWorld::advanceSims","All sims panicked... stopping thread" ); setStopRenderVisualization( true ); return 1; } myTime_t advsend = getTime(); debMsgStd("ntlWorld::advanceSims",DM_MSG,"Overall steps so far took:"<< getTimeString(advsend-advsstart)<<" for sim time "<<targetTime, 4); // finish step for(size_t i=0;i<mpSims->size();i++) { SimulationObject *sim = (*mpSims)[i]; if(!sim->getVisible()) continue; if(sim->getPanic()) continue; sim->prepareVisualization(); } mSimFrameValue.push_back(framenum); mSimFrameCnt++; return 0; }