00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #pragma once
00013
00015 #include <list>
00016 #include <set>
00017
00018 #include "nvsgcommon.h"
00019
00020 #include "nvsg/nvsg.h"
00021 #include "nvsg/Face.h"
00022 #include "nvtraverser/Traverser.h"
00023
00024 namespace nvtraverser
00025 {
00026
00028
00030 class StrippingTraverser : public Traverser
00031 {
00032 public:
00034 NVSG_API StrippingTraverser(void);
00035
00037
00038 void getMinimalLengths( size_t &triStripLength, size_t &quadStripLength ) const;
00039
00041
00042 void setMinimalLengths( size_t triStripLength, size_t quadStripLength );
00043
00044 protected:
00046 NVSG_API virtual ~StrippingTraverser(void);
00047
00049 NVSG_API virtual void handleAnimatedQuads(
00050 const nvsg::AnimatedQuads *p
00051 );
00052
00054 NVSG_API virtual void handleAnimatedTriangles(
00055 const nvsg::AnimatedTriangles *p
00056 );
00057
00059 NVSG_API virtual void handleGeoNode(
00060 const nvsg::GeoNode *p
00061 );
00062
00064 NVSG_API virtual void handleQuads(
00065 const nvsg::Quads *p
00066 );
00067
00069 NVSG_API virtual void handleSkinnedTriangles(
00070 const nvsg::SkinnedTriangles *p
00071 );
00072
00074 NVSG_API virtual void handleTriangles(
00075 const nvsg::Triangles *p
00076 );
00077
00078 private:
00079 void addQuadStrip( const std::list<unsigned int> &vertexList );
00080 void addTriangle( const nvsg::IndexSet &strip, size_t i0, size_t i1, size_t i2 );
00081 void addTriStrip( const std::list<unsigned int> &vertexList );
00082 void clearFaceData( void );
00083 void connectFaces( const nvsg::Face3 *faces, size_t fi, size_t i0, size_t i1 );
00084 void connectFaces( const nvsg::Face4 *faces, size_t fi, size_t i0, size_t i1 );
00085 void copyVertexAttributeData( const nvsg::GeoSet *pFrom, nvsg::GeoSet *pTo );
00086 void cutConnections( const std::list<size_t> &list, size_t vpf );
00087 void determineList( const nvsg::Face3 *faces, size_t fi, size_t le, std::list<size_t> &faceList,
00088 std::list<unsigned int> &vertexList );
00089 void determineList( const nvsg::Face4 *faces, size_t fi, size_t le, std::list<size_t> &faceList,
00090 std::list<unsigned int> &vertexList );
00091
00092 private:
00093 std::vector<size_t> m_faceConnectionCounts;
00094 std::vector<size_t> m_faceConnections;
00095 std::set<size_t> m_faceSets[5];
00096 size_t m_minimalQuadStrip;
00097 size_t m_minimalTriStrip;
00098 std::vector<nvsg::Face4> m_quads;
00099 std::vector<nvsg::IndexSet> m_strips;
00100 std::vector<nvsg::Face3> m_triangles;
00101 std::vector<std::list<size_t> > m_verticesToFaceLists;
00102
00103 std::vector<std::pair<const nvsg::Quads*,std::pair<const nvsg::QuadStrips*,const nvsg::Quads*> > > m_quadReplaces;
00104 std::vector<std::pair<const nvsg::Triangles*,std::pair<const nvsg::TriStrips*,const nvsg::Triangles*> > > m_triReplaces;
00105 };
00106
00107 inline void StrippingTraverser::getMinimalLengths( size_t &triStripLength, size_t &quadStripLength ) const
00108 {
00109 triStripLength = m_minimalTriStrip;
00110 quadStripLength = m_minimalQuadStrip;
00111 }
00112
00113 inline void StrippingTraverser::setMinimalLengths( size_t triStripLength, size_t quadStripLength )
00114 {
00115 m_minimalTriStrip = triStripLength;
00116 m_minimalQuadStrip = quadStripLength;
00117 }
00118 }