23
24
/******************************************************************************
25
26
*****************************************************************************/
27
ntlBlenderDumper::ntlBlenderDumper() : ntlWorld()
29
// same as normal constructor here
26
31
ntlBlenderDumper::ntlBlenderDumper(string filename, bool commandlineMode) :
27
ntlWorld(filename,commandlineMode),
30
ntlRenderGlobals *glob = mpGlob;
31
AttributeList *pAttrs = glob->getBlenderAttributes();
32
mpTrafo = new ntlMat4Gfx(0.0);
34
(*mpTrafo) = pAttrs->readMat4Gfx("transform" , (*mpTrafo), "ntlBlenderDumper","mpTrafo", false );
36
ntlBlenderDumper::ntlBlenderDumper(elbeemSimulationSettings *settings) :
37
ntlWorld(settings), mpTrafo(NULL)
39
// same as normal constructor here
40
ntlRenderGlobals *glob = mpGlob;
41
AttributeList *pAttrs = glob->getBlenderAttributes();
42
mpTrafo = new ntlMat4Gfx(0.0);
44
(*mpTrafo) = pAttrs->readMat4Gfx("transform" , (*mpTrafo), "ntlBlenderDumper","mpTrafo", false );
32
ntlWorld(filename,commandlineMode)
106
86
if(tid & GEOCLASSTID_SHADER) {
107
87
ntlGeometryShader *geoshad = (ntlGeometryShader*)(*iter); //dynamic_cast<ntlGeometryShader*>(*iter);
108
hideObjs.push_back( (*iter)->getName() );
88
string outname = geoshad->getOutFilename();
89
if(outname.length()<1) outname = mpGlob->getOutFilename();
90
geoshad->notifyShaderOfDump(DUMP_FULLGEOMETRY, glob->getAniCount(),nrStr,outname);
109
92
for (vector<ntlGeometryObject*>::iterator siter = geoshad->getObjectsBegin();
110
93
siter != geoshad->getObjectsEnd();
112
95
if(debugOut) debMsgStd("ntlBlenderDumper::BuildScene",DM_MSG,"added shader geometry "<<(*siter)->getName(), 8);
97
(*siter)->notifyOfDump(DUMP_FULLGEOMETRY, glob->getAniCount(),nrStr,outname, this->mSimulationTime);
99
bool isPreview = false;
100
// only dump final&preview surface meshes
101
if( (*siter)->getName().find( "final" ) != string::npos) {
103
} else if( (*siter)->getName().find( "preview" ) != string::npos) {
107
if(!doDump) continue;
114
109
// only dump geo shader objects
115
110
Triangles.clear();
116
111
Vertices.clear();
117
112
VertNormals.clear();
118
113
(*siter)->initialize( mpGlob );
119
(*siter)->getTriangles(&Triangles, &Vertices, &VertNormals, idCnt);
114
(*siter)->getTriangles(this->mSimulationTime, &Triangles, &Vertices, &VertNormals, idCnt);
122
118
// always dump mesh, even empty ones...
123
//if(Vertices.size() <= 0) continue;
124
//if(Triangles.size() <= 0) continue;
126
for(size_t i=0; i<Vertices.size(); i++) {
127
Vertices[i] = (*mpTrafo) * Vertices[i];
130
120
// dump to binary file
131
121
std::ostringstream boutfilename("");
132
//boutfilename << ecrpath.str() << glob->getOutFilename() <<"_"<< (*siter)->getName() <<"_" << nrStr << ".obj";
133
boutfilename << glob->getOutFilename() <<"_"<< (*siter)->getName() <<"_" << nrStr << ".bobj";
122
//boutfilename << ecrpath.str() << outname <<"_"<< (*siter)->getName() <<"_" << nrStr << ".obj";
123
boutfilename << outname <<"_"<< (*siter)->getName() <<"_" << nrStr;
134
124
if(debugOut) debMsgStd("ntlBlenderDumper::renderScene",DM_MSG,"B-Dumping: "<< (*siter)->getName()
135
125
<<", triangles:"<<Triangles.size()<<", vertices:"<<Vertices.size()<<
136
126
" to "<<boutfilename.str() , 7);
137
bool isPreview = false;
138
if( (*siter)->getName().find( "preview" ) != string::npos) {
141
boutfilename << ".gz";
143
// compress all bobj's except for preview ones...
146
gzf = gzopen(boutfilename.str().c_str(), "wb1");
148
gzf = gzopen(boutfilename.str().c_str(), "wb9");
129
// output velocities if desired
130
// WARNING - this is dirty, but simobjs are the only geoshaders right now
131
SimulationObject *sim = (SimulationObject *)geoshad;
132
LbmSolverInterface *lbm = sim->getSolver();
133
if((!isPreview) && (lbm->getDumpVelocities())) {
134
std::ostringstream bvelfilename;
135
bvelfilename << boutfilename.str();
136
bvelfilename << ".bvel.gz";
137
gzf = gzopen(bvelfilename.str().c_str(), "wb9");
140
if(sizeof(numVerts)!=4) { errMsg("ntlBlenderDumper::renderScene","Invalid int size"); return 1; }
141
numVerts = Vertices.size();
142
gzwrite(gzf, &numVerts, sizeof(numVerts));
143
for(size_t i=0; i<Vertices.size(); i++) {
144
// returns smoothed velocity, scaled by frame time
145
ntlVec3Gfx v = lbm->getVelocityAt( Vertices[i][0], Vertices[i][1], Vertices[i][2] );
146
// translation not necessary, test rotation & scaling?
147
for(int j=0; j<3; j++) {
149
//if(i<20) errMsg("ntlBlenderDumper","DUMP_VEL final "<<i<<" = "<<v);
150
gzwrite(gzf, &vertp, sizeof(vertp)); }
156
// compress all bobj's
157
boutfilename << ".bobj.gz";
158
//if(isPreview) { } else { }
159
gzf = gzopen(boutfilename.str().c_str(), "wb1"); // wb9 is slow for large meshes!
151
161
errMsg("ntlBlenderDumper::renderScene","Unable to open output '"<<boutfilename<<"' ");
156
if(sizeof(wri)!=4) { errMsg("ntlBlenderDumper::renderScene","Invalid int size"); return 1; }
157
wri = Vertices.size();
158
gzwrite(gzf, &wri, sizeof(wri));
164
//! current transform matrix
165
ntlMatrix4x4<gfxReal> *trafo;
166
trafo = lbm->getDomainTrafo();
168
//trafo->initArrayCheck(ettings->surfaceTrafo);
169
//errMsg("ntlBlenderDumper","mpTrafo : "<<(*mpTrafo) );
170
// transform into source space
171
for(size_t i=0; i<Vertices.size(); i++) {
172
Vertices[i] = (*trafo) * Vertices[i];
178
if(sizeof(numVerts)!=4) { errMsg("ntlBlenderDumper::renderScene","Invalid int size"); return 1; }
179
numVerts = Vertices.size();
180
gzwrite(gzf, &numVerts, sizeof(numVerts));
159
181
for(size_t i=0; i<Vertices.size(); i++) {
160
182
for(int j=0; j<3; j++) {
161
wrf = Vertices[i][j];
162
gzwrite(gzf, &wrf, sizeof(wrf)); }
183
float vertp = Vertices[i][j];
184
gzwrite(gzf, &vertp, sizeof(vertp)); }
165
187
// should be the same as Vertices.size
166
wri = VertNormals.size();
167
gzwrite(gzf, &wri, sizeof(wri));
188
if(VertNormals.size() != (size_t)numVerts) {
189
errMsg("ntlBlenderDumper::renderScene","Normals have to have same size as vertices!");
190
VertNormals.resize( Vertices.size() );
192
gzwrite(gzf, &numVerts, sizeof(numVerts));
168
193
for(size_t i=0; i<VertNormals.size(); i++) {
169
194
for(int j=0; j<3; j++) {
170
wrf = VertNormals[i][j];
171
gzwrite(gzf, &wrf, sizeof(wrf)); }
195
float normp = VertNormals[i][j];
196
gzwrite(gzf, &normp, sizeof(normp)); }
174
wri = Triangles.size();
175
gzwrite(gzf, &wri, sizeof(wri));
199
int numTris = Triangles.size();
200
gzwrite(gzf, &numTris, sizeof(numTris));
176
201
for(size_t i=0; i<Triangles.size(); i++) {
177
202
for(int j=0; j<3; j++) {
178
wri = Triangles[i].getPoints()[j];
179
gzwrite(gzf, &wri, sizeof(wri)); }
203
int triIndex = Triangles[i].getPoints()[j];
204
gzwrite(gzf, &triIndex, sizeof(triIndex)); }
182
debMsgDirect(" Wrote: '"<<boutfilename.str()<<"'. ");
207
debMsgStd("ntlBlenderDumper::renderScene",DM_NOTIFY," Wrote: '"<<boutfilename.str()<<"' ", 2);