198 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; missing left bracket at "
200 __FILE__, __FUNCTION__, __LINE__,
201 static_cast<int>( aFile.tellg() ) );
209 while(
']' != schar && aFile.good() )
211 name.push_back( schar );
217 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; could not find right "
219 __FILE__, __FUNCTION__, __LINE__ );
225 size_t upos =
name.find(
'_' );
227 if( std::string::npos == upos )
229 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; no underscore in name '%s'" ),
230 __FILE__, __FUNCTION__, __LINE__,
255 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; no node type matching '%s'" ),
256 __FILE__, __FUNCTION__, __LINE__,
310 dx = pts[1].x - pts[0].x;
311 dy = pts[1].y - pts[0].y;
312 dz = pts[1].z - pts[0].z;
314 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
317 dx = pts[2].x - pts[0].x;
318 dy = pts[2].y - pts[0].y;
319 dz = pts[2].z - pts[0].z;
321 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
324 dx = pts[2].x - pts[1].x;
325 dy = pts[2].y - pts[1].y;
326 dz = pts[2].z - pts[1].z;
328 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
350 std::vector< SGVECTOR >& norms )
352 size_t vsize = coords.size();
356 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] invalid vertex set (fewer than 3 "
358 __FILE__, __FUNCTION__, __LINE__ );
363 size_t isize =
index.size();
365 if( 0 != isize % 3 ||
index.empty() )
367 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] invalid index set (not multiple of 3)" ),
368 __FILE__, __FUNCTION__, __LINE__ );
375 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] normals set is not empty" ),
376 __FILE__, __FUNCTION__, __LINE__ );
381 std::map< int, std::list< glm::dvec3 > >vmap;
386 for(
size_t i = 0; i < isize; )
392 if( p1 < 0 || p1 >= (
int)vsize || p2 < 0 || p2 >= (
int)vsize || p3 < 0 || p3 >= (
int)vsize )
395 std::ostringstream ostr;
396 ostr << __FILE__ <<
": " << __FUNCTION__ <<
": " << __LINE__ <<
"\n";
397 ostr <<
" * [INFO] invalid index set; index out of bounds";
398 wxLogTrace( MASK_3D_SG, wxT(
"%s\n" ), ostr.str().c_str() );
406 trip[0] = glm::dvec3( coords[p1].x, coords[p1].y, coords[p1].z );
407 trip[1] = glm::dvec3( coords[p2].x, coords[p2].y, coords[p2].z );
408 trip[2] = glm::dvec3( coords[p3].x, coords[p3].y, coords[p3].z );
411 std::map< int, std::list< glm::dvec3 > >::iterator ip = vmap.find( p1 );
413 if( ip != vmap.end() )
415 ip->second.push_back( tri );
419 vmap.emplace( p1, std::list < glm::dvec3 >( 1, tri ) );
422 ip = vmap.find( p2 );
424 if( ip != vmap.end() )
426 ip->second.push_back( tri );
430 vmap.emplace( p2, std::list < glm::dvec3 >( 1, tri ) );
433 ip = vmap.find( p3 );
435 if( ip != vmap.end() )
437 ip->second.push_back( tri );
441 vmap.emplace( p3, std::list < glm::dvec3 >( 1, tri ) );
445 std::map< int, std::list< glm::dvec3 > >::iterator sM = vmap.begin();
446 std::map< int, std::list< glm::dvec3 > >::iterator eM = vmap.end();
451 size_t item = sM->first;
456 norms.emplace_back( 0, 0, 1 );
460 std::list< glm::dvec3 >::iterator sT = sM->second.begin();
461 std::list< glm::dvec3 >::iterator eT = sM->second.end();
462 glm::dvec3 norm( 0.0, 0.0, 0.0 );
470 norms.emplace_back( norm.x, norm.y, norm.z );
476 if( norms.size() != coords.size() )
478 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [BUG] number of normals does not equal number "
480 __FILE__, __FUNCTION__, __LINE__ );
wxString result
Test unit parsing edge cases and error handling.