33 #include <osg/io_utils>
35 #include "../common/datastructures/WUnionFind.h"
36 #include "WTriangleMesh.h"
55 m_countTriangles( 0 ),
57 m_neighborsCalculated( false )
59 m_verts = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( vertNum ) );
61 m_vertNormals = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( vertNum ) );
62 m_vertColors = osg::ref_ptr< osg::Vec4Array >(
new osg::Vec4Array( vertNum ) );
65 m_triangleNormals = osg::ref_ptr< osg::Vec3Array >(
new osg::Vec3Array( triangleNum ) );
66 m_triangleColors = osg::ref_ptr< osg::Vec4Array >(
new osg::Vec4Array( triangleNum ) );
70 : m_countVerts( vertices->size() ),
71 m_countTriangles( triangles.size() / 3 ),
73 m_neighborsCalculated( false ),
75 m_textureCoordinates( new osg::Vec3Array( vertices->size() ) ),
76 m_vertNormals( new osg::Vec3Array( vertices->size() ) ),
77 m_vertColors( new osg::Vec4Array( vertices->size() ) ),
78 m_triangles( triangles ),
79 m_triangleNormals( new osg::Vec3Array( triangles.size() / 3 ) ),
80 m_triangleColors( new osg::Vec4Array( triangles.size() / 3 ) )
82 WAssert( triangles.size() % 3 == 0,
"Invalid triangle vector, having an invalid size (not divideable by 3)" );
96 addVertex( osg::Vec3( vert[0], vert[1], vert[2] ) );
121 WAssert( index <
m_countVerts,
"set vertex normal: index out of range" );
122 ( *m_vertNormals )[index] = normal;
127 WAssert( index <
m_countVerts,
"set vertex normal: index out of range" );
128 setVertexNormal( index, osg::Vec3( normal[0], normal[1], normal[2] ) );
133 WAssert( index <
m_countVerts,
"set vertex color: index out of range" );
134 ( *m_vertColors )[index] = color;
139 WAssert( index <
m_countTriangles,
"set triangle color: index out of range" );
140 ( *m_triangleColors )[index] = color;
194 WAssert( index <
m_countVerts,
"get vertex: index out of range" );
200 WAssert( index <
m_countVerts,
"get vertex color: index out of range" );
206 WAssert( index <
m_countVerts,
"get normal as position: index out of range" );
216 WAssert( index <
m_countVerts,
"remove vertex: index out of range" );
221 ( *m_verts ).erase( ( *m_verts ).begin() + index );
252 for(
size_t vertId = 0; vertId <
m_countVerts; ++vertId )
254 osg::Vec3 tempNormal( 0.0, 0.0, 0.0 );
261 tempNormal.normalize();
262 ( *m_vertNormals )[vertId] = tempNormal;
271 std::vector< size_t >v;
287 osg::Vec3 tempNormal( 0, 0, 0 );
289 tempNormal[0] = v1[1] * v2[2] - v1[2] * v2[1];
290 tempNormal[1] = v1[2] * v2[0] - v1[0] * v2[2];
291 tempNormal[2] = v1[0] * v2[1] - v1[1] * v2[0];
293 tempNormal.normalize();
300 osg::Vec3 v1( vert1 - vert0 );
301 osg::Vec3 v2( vert2 - vert0 );
303 osg::Vec3 tempNormal( 0, 0, 0 );
305 tempNormal[0] = v1[1] * v2[2] - v1[2] * v2[1];
306 tempNormal[1] = v1[2] * v2[0] - v1[0] * v2[2];
307 tempNormal[2] = v1[0] * v2[1] - v1[1] * v2[0];
309 tempNormal.normalize();
326 std::vector<size_t> v( 3, -1 );
347 for(
size_t i = 0; i < candidates.size(); ++i )
349 for(
size_t k = 0; k < compares.size(); ++k )
351 if( ( candidates[i] != triangleNum ) && ( candidates[i] == compares[k] ) )
353 return candidates[i];
370 osg::Vec3* newVertexPositions =
new osg::Vec3[
m_numTriVerts];
384 std::vector< size_t >v;
396 ( *m_verts )[i] = newVertexPositions[i];
399 delete[] newVertexPositions;
412 int starSize = starP.size();
417 double scale = 1.0 - (
static_cast<double>( starSize ) * alpha );
422 for(
int i = 0; i < starSize; i++ )
425 osg::Vec3 translate =
getVertex( edgeV );
430 return oldPos + newPos;
441 addTriangle( edgeVerts[0], edgeVerts[1], edgeVerts[2] );
447 size_t neighborVert = -1;
448 size_t neighborFaceNum = -1;
451 neighborFaceNum =
getNeighbor( edgeV1, edgeV2, triId );
453 if( neighborFaceNum == triId )
455 osg::Vec3 edgeVert = ( ( *m_verts )[edgeV1] + ( *m_verts )[edgeV2] ) / 2.0;
461 else if( neighborFaceNum > triId )
465 osg::Vec3 edgePart = ( *m_verts )[edgeV1] + ( *m_verts )[edgeV2];
466 osg::Vec3 neighborPart = ( *m_verts )[neighborVert] + ( *m_verts )[V3];
468 edgeVert = ( ( edgePart * ( 3.0 / 8.0 ) ) + ( neighborPart * ( 1.0 / 8.0 ) ) );
476 size_t neighborP = neighborFaceNum;
511 addTriangle( originalTri1, centerTri1, centerTri0 );
512 addTriangle( originalTri2, centerTri2, centerTri1 );
531 std::vector< size_t > temp;
545 double center = ( 0.375 + ( 0.25 * cos( ( 2.0 * 3.14159265358979 ) / static_cast<double>( n ) ) ) );
546 answer = ( 0.625 - ( center * center ) ) /
static_cast<double>( n );
585 ( *m_vertColors ).resize( oldVertSize + mesh->vertSize() );
586 for(
size_t i = 0; i < mesh->vertSize(); ++i )
588 osg::Vec3 v( mesh->getVertex( i ) );
595 for(
size_t i = 0; i < mesh->triangleSize(); ++i )
597 addTriangle( mesh->getTriVertId0( i ) + oldVertSize, mesh->getTriVertId1( i ) + oldVertSize, mesh->getTriVertId2( i ) + oldVertSize );
604 osg::Vec3 t( xOff, yOff, zOff );
605 for(
size_t i = 0; i < ( *m_verts ).size(); ++i )
607 ( *m_verts )[i] += t;
613 for(
size_t i = 0; i < ( *m_verts ).size(); ++i )
615 ( *m_verts )[i] *= zoom;
624 for(
size_t vertId = 0; vertId <
m_vertColors->size(); ++vertId )
628 maxR = ( *m_vertColors )[vertId][0];
632 maxG = ( *m_vertColors )[vertId][1];
636 maxB = ( *m_vertColors )[vertId][2];
639 for(
size_t vertId = 0; vertId <
m_vertColors->size(); ++vertId )
641 ( *m_vertColors )[vertId][0] /= maxR;
642 ( *m_vertColors )[vertId][1] /= maxG;
643 ( *m_vertColors )[vertId][2] /= maxB;
649 std::stringstream ss;
650 ss <<
"WTriangleMesh( #vertices=" << rhs.
vertSize() <<
" #triangles=" << rhs.
triangleSize() <<
" )" << std::endl;
651 using string_utils::operator<<;
654 const std::vector< size_t >& triangles = rhs.
getTriangles();
655 osg::ref_ptr< const osg::Vec3Array > vertices = rhs.
getVertexArray();
656 for(
size_t vID = 0 ; vID <= triangles.size() - 3; ++count )
658 std::stringstream prefix;
659 prefix <<
"triangle: " << count <<
"[ ";
660 std::string indent( prefix.str().size(),
' ' );
661 using osg::operator<<;
662 ss << prefix.str() << vertices->at( triangles[ vID++ ] ) << std::endl;
663 ss << indent << vertices->at( triangles[ vID++ ] ) << std::endl;
664 ss << indent << vertices->at( triangles[ vID++ ] ) << std::endl;
665 ss << std::string( indent.size() - 2,
' ' ) <<
"]" << std::endl;
667 return os << ss.str();
672 boost::shared_ptr< std::list< boost::shared_ptr< WTriangleMesh > > > result(
new std::list< boost::shared_ptr< WTriangleMesh > >() );
682 WAssert(
false,
"Not implemented the decomposition of a TriangleMesh without any triangles" );
692 const std::vector< size_t >& triangles = mesh.
getTriangles();
693 for(
size_t vID = 0; vID <= triangles.size() - 3; vID += 3)
695 uf.merge( triangles[ vID ], triangles[ vID + 1 ] );
696 uf.merge( triangles[ vID ], triangles[ vID + 2 ] );
704 typedef std::map< osg::Vec3, size_t > VertexType;
705 typedef std::vector< size_t > TriangleType;
706 typedef std::pair< VertexType, TriangleType > BucketType;
707 std::map< size_t, BucketType > buckets;
709 osg::ref_ptr< const osg::Vec3Array > vertices = mesh.
getVertexArray();
710 for(
size_t vID = 0; vID <= triangles.size() - 3; vID += 3 )
712 size_t component = uf.find( triangles[ vID ] );
713 if( buckets.find( component ) == buckets.end() )
715 buckets[ component ] = BucketType( VertexType(), TriangleType() );
719 VertexType& mapRef = buckets[ component ].first;
720 for(
int i = 0; i < 3; ++i )
723 const osg::Vec3& vertex = ( *vertices )[ triangles[ vID + i ] ];
724 if( mapRef.find( vertex ) == mapRef.end() )
727 mapRef[ vertex ] = id;
731 id = mapRef[ vertex ];
733 buckets[ component ].second.push_back(
id );
737 for( std::map< size_t, BucketType >::const_iterator cit = buckets.begin(); cit != buckets.end(); ++cit )
739 osg::ref_ptr< osg::Vec3Array > newVertices(
new osg::Vec3Array );
740 newVertices->resize( cit->second.first.size() );
741 for( VertexType::const_iterator vit = cit->second.first.begin(); vit != cit->second.first.end(); ++vit )
743 newVertices->at( vit->second ) = vit->first;
745 boost::shared_ptr< WTriangleMesh > newMesh(
new WTriangleMesh( newVertices, cit->second.second ) );
746 result->push_back( newMesh );