32 #include <osg/io_utils>
34 #include "../common/datastructures/WUnionFind.h"
35 #include "WTriangleMesh.h"
54 m_countTriangles( 0 ),
56 m_neighborsCalculated( false )
58 m_verts = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( vertNum ) );
60 m_vertNormals = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( vertNum ) );
61 m_vertColors = osg::ref_ptr< osg::Vec4Array >(
new osg::Vec4Array( vertNum ) );
64 m_triangleNormals = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( triangleNum ) );
65 m_triangleColors = osg::ref_ptr< osg::Vec4Array >(
new osg::Vec4Array( triangleNum ) );
69 : m_countVerts( vertices->size() ),
70 m_countTriangles( triangles.size() / 3 ),
72 m_neighborsCalculated( false ),
74 m_textureCoordinates( new osg::Vec3Array( vertices->size() ) ),
75 m_vertNormals( new osg::Vec3Array( vertices->size() ) ),
76 m_vertColors( new osg::Vec4Array( vertices->size() ) ),
77 m_triangles( triangles ),
78 m_triangleNormals( new osg::Vec3Array( triangles.size() / 3 ) ),
79 m_triangleColors( new osg::Vec4Array( triangles.size() / 3 ) )
81 WAssert( triangles.size() % 3 == 0,
"Invalid triangle vector, having an invalid size (not divideable by 3)" );
95 addVertex( osg::Vec3( vert[0], vert[1], vert[2] ) );
120 WAssert( index <
m_countVerts,
"set vertex normal: index out of range" );
121 ( *m_vertNormals )[index] = normal;
126 WAssert( index <
m_countVerts,
"set vertex normal: index out of range" );
127 setVertexNormal( index, osg::Vec3( normal[0], normal[1], normal[2] ) );
132 WAssert( index <
m_countVerts,
"set vertex color: index out of range" );
133 ( *m_vertColors )[index] = color;
138 WAssert( index <
m_countTriangles,
"set triangle color: index out of range" );
139 ( *m_triangleColors )[index] = color;
193 WAssert( index <
m_countVerts,
"get vertex: index out of range" );
199 WAssert( index <
m_countVerts,
"get vertex color: index out of range" );
205 WAssert( index <
m_countVerts,
"get normal as position: index out of range" );
211 WAssert( index <
m_countVerts,
"remove vertex: index out of range" );
216 ( *m_verts ).erase( ( *m_verts ).begin() + index );
247 for(
size_t vertId = 0; vertId <
m_countVerts; ++vertId )
249 osg::Vec3 tempNormal( 0.0, 0.0, 0.0 );
256 tempNormal.normalize();
257 ( *m_vertNormals )[vertId] = tempNormal;
266 std::vector< size_t >v;
282 osg::Vec3 tempNormal( 0, 0, 0 );
284 tempNormal[0] = v1[1] * v2[2] - v1[2] * v2[1];
285 tempNormal[1] = v1[2] * v2[0] - v1[0] * v2[2];
286 tempNormal[2] = v1[0] * v2[1] - v1[1] * v2[0];
288 tempNormal.normalize();
295 osg::Vec3 v1( vert1 - vert0 );
296 osg::Vec3 v2( vert2 - vert0 );
298 osg::Vec3 tempNormal( 0, 0, 0 );
300 tempNormal[0] = v1[1] * v2[2] - v1[2] * v2[1];
301 tempNormal[1] = v1[2] * v2[0] - v1[0] * v2[2];
302 tempNormal[2] = v1[0] * v2[1] - v1[1] * v2[0];
304 tempNormal.normalize();
321 std::vector<size_t> v( 3, -1 );
342 for(
size_t i = 0; i < candidates.size(); ++i )
344 for(
size_t k = 0; k < compares.size(); ++k )
346 if( ( candidates[i] != triangleNum ) && ( candidates[i] == compares[k] ) )
348 return candidates[i];
365 osg::Vec3* newVertexPositions =
new osg::Vec3[
m_numTriVerts];
379 std::vector< size_t >v;
391 ( *m_verts )[i] = newVertexPositions[i];
394 delete[] newVertexPositions;
407 int starSize = starP.size();
412 double scale = 1.0 - (
static_cast<double>( starSize ) * alpha );
417 for(
int i = 0; i < starSize; i++ )
420 osg::Vec3 translate =
getVertex( edgeV );
425 return oldPos + newPos;
436 addTriangle( edgeVerts[0], edgeVerts[1], edgeVerts[2] );
442 size_t neighborVert = -1;
443 size_t neighborFaceNum = -1;
446 neighborFaceNum =
getNeighbor( edgeV1, edgeV2, triId );
448 if( neighborFaceNum == triId )
450 osg::Vec3 edgeVert = ( ( *m_verts )[edgeV1] + ( *m_verts )[edgeV2] ) / 2.0;
456 else if( neighborFaceNum > triId )
460 osg::Vec3 edgePart = ( *m_verts )[edgeV1] + ( *m_verts )[edgeV2];
461 osg::Vec3 neighborPart = ( *m_verts )[neighborVert] + ( *m_verts )[V3];
463 edgeVert = ( ( edgePart * ( 3.0 / 8.0 ) ) + ( neighborPart * ( 1.0 / 8.0 ) ) );
471 size_t neighborP = neighborFaceNum;
506 addTriangle( originalTri1, centerTri1, centerTri0 );
507 addTriangle( originalTri2, centerTri2, centerTri1 );
526 std::vector< size_t > temp;
540 double center = ( 0.375 + ( 0.25 * cos( ( 2.0 * 3.14159265358979 ) / static_cast<double>( n ) ) ) );
541 answer = ( 0.625 - ( center * center ) ) /
static_cast<double>( n );
580 ( *m_vertColors ).resize( oldVertSize + mesh->vertSize() );
581 for(
size_t i = 0; i < mesh->vertSize(); ++i )
583 osg::Vec3 v( mesh->getVertex( i ) );
590 for(
size_t i = 0; i < mesh->triangleSize(); ++i )
592 addTriangle( mesh->getTriVertId0( i ) + oldVertSize, mesh->getTriVertId1( i ) + oldVertSize, mesh->getTriVertId2( i ) + oldVertSize );
599 osg::Vec3 t( xOff, yOff, zOff );
600 for(
size_t i = 0; i < ( *m_verts ).size(); ++i )
602 ( *m_verts )[i] += t;
608 for(
size_t i = 0; i < ( *m_verts ).size(); ++i )
610 ( *m_verts )[i] *= zoom;
616 std::stringstream ss;
617 ss <<
"WTriangleMesh( #vertices=" << rhs.
vertSize() <<
" #triangles=" << rhs.
triangleSize() <<
" )" << std::endl;
618 using string_utils::operator<<;
621 const std::vector< size_t >& triangles = rhs.
getTriangles();
622 osg::ref_ptr< const osg::Vec3Array > vertices = rhs.
getVertexArray();
623 for(
size_t vID = 0 ; vID <= triangles.size() - 3; ++count )
625 std::stringstream prefix;
626 prefix <<
"triangle: " << count <<
"[ ";
627 std::string indent( prefix.str().size(),
' ' );
628 using osg::operator<<;
629 ss << prefix.str() << vertices->at( triangles[ vID++ ] ) << std::endl;
630 ss << indent << vertices->at( triangles[ vID++ ] ) << std::endl;
631 ss << indent << vertices->at( triangles[ vID++ ] ) << std::endl;
632 ss << std::string( indent.size() - 2,
' ' ) <<
"]" << std::endl;
634 return os << ss.str();
639 boost::shared_ptr< std::list< boost::shared_ptr< WTriangleMesh > > > result(
new std::list< boost::shared_ptr< WTriangleMesh > >() );
649 WAssert(
false,
"Not implemented the decomposition of a TriangleMesh without any triangles" );
659 const std::vector< size_t >& triangles = mesh.
getTriangles();
660 for(
size_t vID = 0; vID <= triangles.size() - 3; vID += 3)
662 uf.merge( triangles[ vID ], triangles[ vID + 1 ] );
663 uf.merge( triangles[ vID ], triangles[ vID + 2 ] );
671 typedef std::map< osg::Vec3, size_t > VertexType;
672 typedef std::vector< size_t > TriangleType;
673 typedef std::pair< VertexType, TriangleType > BucketType;
674 std::map< size_t, BucketType > buckets;
676 osg::ref_ptr< const osg::Vec3Array > vertices = mesh.
getVertexArray();
677 for(
size_t vID = 0; vID <= triangles.size() - 3; vID += 3 )
679 size_t component = uf.find( triangles[ vID ] );
680 if( buckets.find( component ) == buckets.end() )
682 buckets[ component ] = BucketType( VertexType(), TriangleType() );
686 VertexType& mapRef = buckets[ component ].first;
687 for(
int i = 0; i < 3; ++i )
690 const osg::Vec3& vertex = ( *vertices )[ triangles[ vID + i ] ];
691 if( mapRef.find( vertex ) == mapRef.end() )
694 mapRef[ vertex ] = id;
698 id = mapRef[ vertex ];
700 buckets[ component ].second.push_back(
id );
704 for( std::map< size_t, BucketType >::const_iterator cit = buckets.begin(); cit != buckets.end(); ++cit )
706 osg::ref_ptr< osg::Vec3Array > newVertices(
new osg::Vec3Array );
707 newVertices->resize( cit->second.first.size() );
708 for( VertexType::const_iterator vit = cit->second.first.begin(); vit != cit->second.first.end(); ++vit )
710 newVertices->at( vit->second ) = vit->first;
712 boost::shared_ptr< WTriangleMesh > newMesh(
new WTriangleMesh( newVertices, cit->second.second ) );
713 result->push_back( newMesh );