/** \file elbeem/intern/ntl_blenderdumper.cpp * \ingroup elbeem */ /****************************************************************************** * * El'Beem - Free Surface Fluid Simulation with the Lattice Boltzmann Method * Copyright 2003-2006 Nils Thuerey * * Replaces std. raytracer, and only dumps time dep. objects to disc * *****************************************************************************/ #include #include #include "utilities.h" #include "ntl_matrices.h" #include "ntl_blenderdumper.h" #include "ntl_world.h" #include "solver_interface.h" #include "globals.h" #include /****************************************************************************** * Constructor *****************************************************************************/ ntlBlenderDumper::ntlBlenderDumper() : ntlWorld() { // same as normal constructor here } ntlBlenderDumper::ntlBlenderDumper(string filename, bool commandlineMode) : ntlWorld(filename,commandlineMode) { // init world } /****************************************************************************** * Destructor *****************************************************************************/ ntlBlenderDumper::~ntlBlenderDumper() { debMsgStd("ntlBlenderDumper",DM_NOTIFY, "ntlBlenderDumper done", 10); } /****************************************************************************** * Only dump time dep. objects to file *****************************************************************************/ int ntlBlenderDumper::renderScene( void ) { char nrStr[5]; /* nr conversion */ ntlRenderGlobals *glob = mpGlob; ntlScene *scene = mpGlob->getSimScene(); bool debugOut = false; bool debugRender = false; #if ELBEEM_PLUGIN==1 debugOut = false; #endif // ELBEEM_PLUGIN==1 vector gmName; // gm names vector gmMat; // materials for gm int numGMs = 0; // no. of .obj models created if(debugOut) debMsgStd("ntlBlenderDumper::renderScene",DM_NOTIFY,"Dumping geometry data", 1); long startTime = getTime(); snprintf(nrStr, 5, "%04d", glob->getAniCount() ); // local scene vars vector Triangles; vector Vertices; vector VertNormals; // check geo objects int idCnt = 0; // give IDs to objects for (vector::iterator iter = scene->getGeoClasses()->begin(); iter != scene->getGeoClasses()->end(); iter++) { if(!(*iter)->getVisible()) continue; int tid = (*iter)->getTypeId(); if(tid & GEOCLASSTID_OBJECT) { // normal geom. objects -> ignore } if(tid & GEOCLASSTID_SHADER) { ntlGeometryShader *geoshad = (ntlGeometryShader*)(*iter); //dynamic_cast(*iter); string outname = geoshad->getOutFilename(); if(outname.length()<1) outname = mpGlob->getOutFilename(); geoshad->notifyShaderOfDump(DUMP_FULLGEOMETRY, glob->getAniCount(),nrStr,outname); for (vector::iterator siter = geoshad->getObjectsBegin(); siter != geoshad->getObjectsEnd(); siter++) { if(debugOut) debMsgStd("ntlBlenderDumper::BuildScene",DM_MSG,"added shader geometry "<<(*siter)->getName(), 8); (*siter)->notifyOfDump(DUMP_FULLGEOMETRY, glob->getAniCount(),nrStr,outname, this->mSimulationTime); bool doDump = false; bool isPreview = false; // only dump final&preview surface meshes if( (*siter)->getName().find( "final" ) != string::npos) { doDump = true; } else if( (*siter)->getName().find( "preview" ) != string::npos) { doDump = true; isPreview = true; } if(!doDump) continue; // dont quit, some objects need notifyOfDump call if((glob_mpactive) && (glob_mpindex>0)) { continue; //return 0; } // only dump geo shader objects Triangles.clear(); Vertices.clear(); VertNormals.clear(); (*siter)->initialize( mpGlob ); (*siter)->getTriangles(this->mSimulationTime, &Triangles, &Vertices, &VertNormals, idCnt); idCnt ++; // WARNING - this is dirty, but simobjs are the only geoshaders right now SimulationObject *sim = (SimulationObject *)geoshad; LbmSolverInterface *lbm = sim->getSolver(); // always dump mesh, even empty ones... // dump to binary file std::ostringstream boutfilename(""); //boutfilename << ecrpath.str() << outname <<"_"<< (*siter)->getName() <<"_" << nrStr << ".obj"; boutfilename << outname <<"_"<< (*siter)->getName() <<"_" << nrStr; if(debugOut) debMsgStd("ntlBlenderDumper::renderScene",DM_MSG,"B-Dumping: "<< (*siter)->getName() <<", triangles:"<getDumpVelocities())) { std::ostringstream bvelfilename; bvelfilename << boutfilename.str(); bvelfilename << ".bvel.gz"; gzf = gzopen(bvelfilename.str().c_str(), "wb9"); if(gzf) { int numVerts; if(sizeof(numVerts)!=4) { errMsg("ntlBlenderDumper::renderScene","Invalid int size"); return 1; } numVerts = Vertices.size(); gzwrite(gzf, &numVerts, sizeof(numVerts)); for(size_t i=0; igetVelocityAt( Vertices[i][0], Vertices[i][1], Vertices[i][2] ); // translation not necessary, test rotation & scaling? for(int j=0; j<3; j++) { float vertp = v[j]; //if(i<20) errMsg("ntlBlenderDumper","DUMP_VEL final "< *trafo; trafo = lbm->getDomainTrafo(); if(trafo) { // transform into source space for(size_t i=0; i rottrafo; rottrafo.initId(); if(lbm->getDomainTrafo()) { // dont modifiy original! rottrafo = *lbm->getDomainTrafo(); ntlVec3Gfx rTrans,rScale,rRot,rShear; rottrafo.decompose(rTrans,rScale,rRot,rShear); rottrafo.initRotationXYZ(rRot[0],rRot[1],rRot[2]); // only rotate here... for(size_t i=0; i0) { if(debugOut) debMsgStd("ntlBlenderDumper::renderScene",DM_MSG,"Objects dumped: "<0)) { // ok, nothing to do anyway... } else { errFatal("ntlBlenderDumper::renderScene","No objects to dump! Aborting...",SIMWORLD_INITERROR); return 1; } } // debug timing long stopTime = getTime(); debMsgStd("ntlBlenderDumper::renderScene",DM_MSG,"Scene #"<setAniCount( glob->getAniCount() +1 ); } return 0; }