25 #ifndef WTRIANGLEMESH_H
26 #define WTRIANGLEMESH_H
34 #include "../common/math/linearAlgebra/WLinearAlgebra.h"
35 #include "../common/WAssert.h"
36 #include "../common/WColor.h"
37 #include "../common/WTransferable.h"
38 #include "WExportWGE.h"
51 typedef boost::shared_ptr< WTriangleMesh >
SPtr;
56 typedef boost::shared_ptr< const WTriangleMesh >
ConstSPtr;
72 WTriangleMesh( osg::ref_ptr< osg::Vec3Array > vertices,
const std::vector< size_t >& triangles );
84 static boost::shared_ptr< WPrototyped > getPrototype();
91 virtual const std::string
getName()
const;
105 void addVertex( osg::Vec3 vert );
114 void addVertex(
float x,
float y,
float z );
128 void addTextureCoordinate( osg::Vec3 texCoord );
137 void addTextureCoordinate(
float x,
float y,
float z );
146 void addTriangle(
size_t vert0,
size_t vert1,
size_t vert2 );
155 void addTriangle( osg::Vec3 vert0, osg::Vec3 vert1, osg::Vec3 vert2 );
163 void setVertex(
size_t index, osg::Vec3 vert );
171 void setVertexNormal(
size_t index, osg::Vec3 normal );
179 void setVertexNormal(
size_t index,
WPosition normal );
187 void setVertexColor(
size_t index, osg::Vec4 color );
195 void setTriangleColor(
size_t index, osg::Vec4 color );
202 osg::ref_ptr< osg::Vec4Array > getTriangleColors()
const;
209 osg::ref_ptr< osg::Vec3Array > getVertexArray();
216 osg::ref_ptr< const osg::Vec3Array > getVertexArray()
const;
223 osg::ref_ptr< osg::Vec3Array > getTextureCoordinateArray();
230 osg::ref_ptr< const osg::Vec3Array > getTextureCoordinateArray()
const;
238 osg::ref_ptr< osg::Vec3Array > getVertexNormalArray(
bool forceRecalc =
false );
245 osg::ref_ptr< osg::Vec4Array > getVertexColorArray();
252 const std::vector< size_t >& getTriangles()
const;
260 osg::ref_ptr< osg::Vec3Array > getTriangleNormalArray(
bool forceRecalc =
false );
269 osg::Vec3 getVertex(
size_t index )
const;
277 osg::Vec4 getVertColor(
size_t index )
const;
286 osg::Vec3 getTriVert(
size_t triId,
size_t vertNum );
294 WVector3d getNormal(
size_t index )
const;
301 size_t vertSize()
const;
308 size_t triangleSize()
const;
321 size_t getTriVertId0(
size_t triId )
const;
329 size_t getTriVertId1(
size_t triId )
const;
337 size_t getTriVertId2(
size_t triId )
const;
348 void addMesh( boost::shared_ptr<WTriangleMesh> mesh,
float xOff = 0.,
float yOff = 0.,
float zOff = 0. );
357 void translateMesh(
float xOff,
float yOff,
float zOff );
364 void zoomMesh(
float zoom );
392 void removeVertex(
size_t index );
399 void removeTriangle(
size_t index );
404 void recalcVertNormals();
413 osg::Vec3 calcTriangleNormal(
size_t triangle );
424 osg::Vec3 calcNormal( osg::Vec3 vert0, osg::Vec3 vert1, osg::Vec3 vert2 );
429 void updateVertsInTriangles();
434 void calcNeighbors();
445 size_t getNeighbor(
const size_t coVert1,
const size_t coVert2,
const size_t triangleNum );
454 void setTriVert0(
size_t triId,
size_t vertId );
463 void setTriVert1(
size_t triId,
size_t vertId );
472 void setTriVert2(
size_t triId,
size_t vertId );
487 void loopSetTriangle(
size_t triId,
size_t vertId1,
size_t vertId2,
size_t vertId3 );
495 void loopEraseTriangleFromVertex(
size_t triId,
size_t vertId );
503 osg::Vec3 loopCalcNewPosition(
size_t vertId );
510 void loopInsertCenterTriangle(
size_t triId );
517 void loopInsertCornerTriangles(
size_t triId );
528 size_t loopCalcEdgeVert(
size_t triId,
size_t edgeV1,
size_t edgeV2,
size_t V3 );
535 double loopGetAlpha(
int n );
544 size_t loopGetNextVertex(
size_t triNum,
size_t vertNum );
554 size_t loopGetThirdVert(
size_t coVert1,
size_t coVert2,
size_t triangleNum );
647 return "WTriangleMesh";
652 return "Triangle mesh data structure allowing for convenient access of the elements.";
657 WAssert( triId <
m_countTriangles,
"set tri vert 0: triangle id out of range" );
658 WAssert( vertId <
m_countVerts,
"vertex id out of range" );
664 WAssert( triId <
m_countTriangles,
"set tri vert 1: triangle id out of range" );
665 WAssert( vertId <
m_countVerts,
"vertex id out of range" );
671 WAssert( triId <
m_countTriangles,
"set tri vert 2: triangle id out of range" );
672 WAssert( vertId <
m_countVerts,
"vertex id out of range" );
684 WAssert( triId <
m_countTriangles,
"get tri vert id 0: triangle id out of range" );
690 WAssert( triId <
m_countTriangles,
"get tri vert id 1: triangle id out of range" );
696 WAssert( triId <
m_countTriangles,
"get tri vert id 2: triangle id out of range" );
702 ( *m_verts )[index] = vert;
705 #endif // WTRIANGLEMESH_H