237
const char* c_file = m_meshFile->get().file_string().c_str();
238
std::ofstream dataFile( c_file, std::ios_base::binary );
242
WLogger::getLogger()->addLogMessage( "opening file", "Write Mesh", LL_DEBUG );
246
WLogger::getLogger()->addLogMessage( "open file failed" + m_meshFile->get().file_string() , "Write Mesh", LL_ERROR );
250
dataFile.precision( 7 );
252
WLogger::getLogger()->addLogMessage( "start writing file", "Write Mesh", LL_DEBUG );
255
dataFile << ( "{\n" );
256
dataFile << ( " \"vertices\" : [" );
258
for( size_t i = 0; i < m_triMesh->vertSize() - 1; ++i )
260
point = m_triMesh->getVertex( i );
261
if( !( myIsfinite( point[0] ) && myIsfinite( point[1] ) && myIsfinite( point[2] ) ) )
263
WLogger::getLogger()->addLogMessage( "Will not write file from data that contains NAN or INF.", "Write Mesh", LL_ERROR );
266
dataFile << point[0] << "," << point[1] << "," << point[2] << ",";
268
point = m_triMesh->getVertex( m_triMesh->vertSize() - 1 );
269
dataFile << point[0] << "," << point[1] << "," << point[2] << "],\n";
271
dataFile << ( " \"normals\" : [" );
273
for( size_t i = 0; i < m_triMesh->vertSize() - 1; ++i )
275
normal = m_triMesh->getNormal( i );
276
if( !( myIsfinite( normal[0] ) && myIsfinite( normal[1] ) && myIsfinite( normal[2] ) ) )
278
WLogger::getLogger()->addLogMessage( "Will not write file from data that contains NAN or INF.", "Write Mesh", LL_ERROR );
281
dataFile << normal[0] << "," << normal[1] << "," << normal[2] << ",";
283
normal = m_triMesh->getNormal( m_triMesh->vertSize() - 1 );
284
dataFile << normal[0] << "," << normal[1] << "," << normal[2] << "],\n";
286
dataFile << ( " \"indices\" : [" );
287
for( size_t i = 0; i < m_triMesh->triangleSize() - 1; ++i )
289
dataFile << m_triMesh->getTriVertId0( i ) << "," << m_triMesh->getTriVertId1( i ) << "," << m_triMesh->getTriVertId2( i ) << ",";
291
size_t i = m_triMesh->triangleSize() - 1;
292
dataFile << m_triMesh->getTriVertId0( i ) << "," << m_triMesh->getTriVertId1( i ) << "," << m_triMesh->getTriVertId2( i ) << "]";
295
if( m_writeColors->get() )
298
dataFile << ( " \"colors\" : [" );
299
for( size_t k = 0; k < m_triMesh->vertSize() - 1; ++k )
301
osg::Vec4 color = m_triMesh->getVertColor( k );
303
dataFile << color[0] << "," << color[1] << "," << color[2] << "," << color[3] << ",";
305
osg::Vec4 color = m_triMesh->getVertColor( m_triMesh->vertSize() - 1 );
306
dataFile << color[0] << "," << color[1] << "," << color[2] << "," << color[3] << "]";
241
std::vector< boost::shared_ptr< WTriangleMesh > >meshes;
242
meshes = splitMesh( m_triMesh, 65000 );
244
for( size_t k = 0; k < meshes.size(); ++k )
246
std::string fn = m_meshFile->get().string() + "_" + string_utils::toString( k );
247
const char* c_file = fn.c_str();
248
std::ofstream dataFile( c_file, std::ios_base::binary );
252
WLogger::getLogger()->addLogMessage( "opening file", "Write Mesh", LL_DEBUG );
256
WLogger::getLogger()->addLogMessage( "open file failed" + m_meshFile->get().string() , "Write Mesh", LL_ERROR );
260
dataFile.precision( 5 );
262
WLogger::getLogger()->addLogMessage( "start writing file", "Write Mesh", LL_DEBUG );
264
std::cout << meshes[k]->vertSize() << " vertices and " << meshes[k]->triangleSize() << " triangles" << std::endl;
265
dataFile << ( "{\n" );
266
dataFile << ( " \"vertices\" : [" );
268
for( size_t i = 0; i < meshes[k]->vertSize() - 1; ++i )
270
point = meshes[k]->getVertex( i );
271
if( !( !wlimits::isInf( point[0] ) && !wlimits::isInf( point[1] ) && !wlimits::isInf( point[2] ) ) )
273
WLogger::getLogger()->addLogMessage( "Will not write file from data that contains NAN or INF.", "Write Mesh", LL_ERROR );
276
dataFile << point[0] << "," << point[1] << "," << point[2] << ",";
278
point = meshes[k]->getVertex( meshes[k]->vertSize() - 1 );
279
dataFile << point[0] << "," << point[1] << "," << point[2] << "],\n";
281
dataFile << ( " \"normals\" : [" );
283
for( size_t i = 0; i < meshes[k]->vertSize() - 1; ++i )
285
normal = meshes[k]->getNormal( i );
286
if( !( !wlimits::isInf( normal[0] ) && !wlimits::isInf( normal[1] ) && !wlimits::isInf( normal[2] ) ) )
288
WLogger::getLogger()->addLogMessage( "Will not write file from data that contains NAN or INF.", "Write Mesh", LL_ERROR );
291
dataFile << normal[0] << "," << normal[1] << "," << normal[2] << ",";
293
normal = meshes[k]->getNormal( meshes[k]->vertSize() - 1 );
294
dataFile << normal[0] << "," << normal[1] << "," << normal[2] << "],\n";
296
dataFile << ( " \"indices\" : [" );
297
for( size_t i = 0; i < meshes[k]->triangleSize() - 1; ++i )
299
dataFile << meshes[k]->getTriVertId0( i ) << "," << meshes[k]->getTriVertId1( i ) << "," << meshes[k]->getTriVertId2( i ) << ",";
301
size_t i = meshes[k]->triangleSize() - 1;
302
dataFile << meshes[k]->getTriVertId0( i ) << "," << meshes[k]->getTriVertId1( i ) << "," << meshes[k]->getTriVertId2( i ) << "]";
305
if( m_writeColors->get() )
308
dataFile << ( " \"colors\" : [" );
309
for( size_t j = 0; j < meshes[k]->vertSize() - 1; ++j )
311
osg::Vec4 color = meshes[k]->getVertColor( j );
313
dataFile << color[0] << "," << color[1] << "," << color[2] << "," << color[3] << ",";
315
osg::Vec4 color = meshes[k]->getVertColor( meshes[k]->vertSize() - 1 );
316
dataFile << color[0] << "," << color[1] << "," << color[2] << "," << color[3] << "]";
311
322
WLogger::getLogger()->addLogMessage( "saving done", "Write Mesh", LL_DEBUG );
326
std::vector< boost::shared_ptr< WTriangleMesh > >WMWriteMesh::splitMesh( boost::shared_ptr< WTriangleMesh > triMesh, size_t targetSize )
328
std::vector< boost::shared_ptr< WTriangleMesh > >meshes;
329
if( triMesh->vertSize() <= targetSize )
331
meshes.push_back( triMesh );
334
size_t currentTri( 0 );
335
size_t id0, id1, id2;
337
while( currentTri < triMesh->triangleSize() )
339
boost::shared_ptr< WTriangleMesh > newMesh = boost::shared_ptr< WTriangleMesh >( new WTriangleMesh( 0, 0 ) );
340
std::vector<int>newIds( triMesh->vertSize(), -1 );
341
while( newMesh->vertSize() < targetSize )
343
id0 = triMesh->getTriVertId0( currentTri );
344
id1 = triMesh->getTriVertId1( currentTri );
345
id2 = triMesh->getTriVertId2( currentTri );
346
if( newIds[id0] == -1 )
348
newIds[id0] = newMesh->vertSize();
349
osg::Vec3 vert = triMesh->getTriVert( currentTri, 0 );
350
newMesh->addVertex( vert.x(), vert.y(), vert.z() );
351
newMesh->setVertexColor( newMesh->vertSize() - 1, triMesh->getVertColor( id0 ) );
353
if( newIds[id1] == -1 )
355
newIds[id1] = newMesh->vertSize();
356
osg::Vec3 vert = triMesh->getTriVert( currentTri, 1 );
357
newMesh->addVertex( vert.x(), vert.y(), vert.z() );
358
newMesh->setVertexColor( newMesh->vertSize() - 1, triMesh->getVertColor( id1 ) );
360
if( newIds[id2] == -1 )
362
newIds[id2] = newMesh->vertSize();
363
osg::Vec3 vert = triMesh->getTriVert( currentTri, 2 );
364
newMesh->addVertex( vert.x(), vert.y(), vert.z() );
365
newMesh->setVertexColor( newMesh->vertSize() - 1, triMesh->getVertColor( id2 ) );
367
newMesh->addTriangle( newIds[id0], newIds[id1], newIds[id2] );
369
if( currentTri == triMesh->triangleSize() )
375
meshes.push_back( newMesh );