202 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; missing left bracket at "
204 __FILE__, __FUNCTION__, __LINE__,
205 static_cast<int>( aFile.tellg() ) );
213 while(
']' != schar && aFile.good() )
215 name.push_back( schar );
221 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; could not find right "
223 __FILE__, __FUNCTION__, __LINE__ );
229 size_t upos =
name.find(
'_' );
231 if( std::string::npos == upos )
233 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; no underscore in name '%s'" ),
234 __FILE__, __FUNCTION__, __LINE__,
259 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] corrupt data; no node type matching '%s'" ),
260 __FILE__, __FUNCTION__, __LINE__,
314 dx = pts[1].x - pts[0].x;
315 dy = pts[1].y - pts[0].y;
316 dz = pts[1].z - pts[0].z;
318 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
321 dx = pts[2].x - pts[0].x;
322 dy = pts[2].y - pts[0].y;
323 dz = pts[2].z - pts[0].z;
325 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
328 dx = pts[2].x - pts[1].x;
329 dy = pts[2].y - pts[1].y;
330 dz = pts[2].z - pts[1].z;
332 if( ( dx*dx + dy*dy + dz*dz ) < 1e-15 )
354 std::vector< SGVECTOR >& norms )
356 size_t vsize = coords.size();
360 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] invalid vertex set (fewer than 3 "
362 __FILE__, __FUNCTION__, __LINE__ );
367 size_t isize = index.size();
369 if( 0 != isize % 3 || index.empty() )
371 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] invalid index set (not multiple of 3)" ),
372 __FILE__, __FUNCTION__, __LINE__ );
379 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [INFO] normals set is not empty" ),
380 __FILE__, __FUNCTION__, __LINE__ );
385 std::map< int, std::list< glm::dvec3 > >vmap;
390 for(
size_t i = 0; i < isize; )
396 if( p1 < 0 || p1 >= (
int)vsize || p2 < 0 || p2 >= (
int)vsize || p3 < 0 || p3 >= (
int)vsize )
399 std::ostringstream ostr;
400 ostr << __FILE__ <<
": " << __FUNCTION__ <<
": " << __LINE__ <<
"\n";
401 ostr <<
" * [INFO] invalid index set; index out of bounds";
402 wxLogTrace( MASK_3D_SG, wxT(
"%s\n" ), ostr.str().c_str() );
410 trip[0] = glm::dvec3( coords[p1].x, coords[p1].y, coords[p1].z );
411 trip[1] = glm::dvec3( coords[p2].x, coords[p2].y, coords[p2].z );
412 trip[2] = glm::dvec3( coords[p3].x, coords[p3].y, coords[p3].z );
415 std::map< int, std::list< glm::dvec3 > >::iterator ip = vmap.find( p1 );
417 if( ip != vmap.end() )
419 ip->second.push_back( tri );
423 vmap.emplace( p1, std::list < glm::dvec3 >( 1, tri ) );
426 ip = vmap.find( p2 );
428 if( ip != vmap.end() )
430 ip->second.push_back( tri );
434 vmap.emplace( p2, std::list < glm::dvec3 >( 1, tri ) );
437 ip = vmap.find( p3 );
439 if( ip != vmap.end() )
441 ip->second.push_back( tri );
445 vmap.emplace( p3, std::list < glm::dvec3 >( 1, tri ) );
449 std::map< int, std::list< glm::dvec3 > >::iterator sM = vmap.begin();
450 std::map< int, std::list< glm::dvec3 > >::iterator eM = vmap.end();
455 size_t item = sM->first;
460 norms.emplace_back( 0, 0, 1 );
464 std::list< glm::dvec3 >::iterator sT = sM->second.begin();
465 std::list< glm::dvec3 >::iterator eT = sM->second.end();
466 glm::dvec3 norm( 0.0, 0.0, 0.0 );
474 norms.emplace_back( norm.x, norm.y, norm.z );
480 if( norms.size() != coords.size() )
482 wxLogTrace( MASK_3D_SG, wxT(
"%s:%s:%d * [BUG] number of normals does not equal number "
484 __FILE__, __FUNCTION__, __LINE__ );
wxString result
Test unit parsing edge cases and error handling.