From 91a9a87dd44078ebb582cdcbee9316056c9527b1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 21 Nov 2006 16:16:56 +0000 Subject: [PATCH] Added removeDuplicates function --- include/osgShadow/OccluderGeometry | 11 +- src/osgShadow/OccluderGeometry.cpp | 195 ++++++++++++++++++++--------- 2 files changed, 144 insertions(+), 62 deletions(-) diff --git a/include/osgShadow/OccluderGeometry b/include/osgShadow/OccluderGeometry index a58b07f6e..3bc022d6d 100644 --- a/include/osgShadow/OccluderGeometry +++ b/include/osgShadow/OccluderGeometry @@ -37,7 +37,7 @@ class OSGSHADOW_EXPORT OccluderGeometry : public osg::Drawable virtual Object* cloneType() const { return new OccluderGeometry(); } virtual Object* clone(const osg::CopyOp& copyop) const { return new OccluderGeometry(*this,copyop); } virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast(obj)!=NULL; } - virtual const char* libraryName() const { return "osg"; } + virtual const char* libraryName() const { return "osgShadow"; } virtual const char* className() const { return "OccluderGeometry"; } @@ -66,7 +66,6 @@ class OSGSHADOW_EXPORT OccluderGeometry : public osg::Drawable typedef std::vector UIntList; typedef std::vector EdgeList; - /** Compute an occluder geometry containing all the geometry in specified subgraph.*/ void computeOccluderGeometry(osg::Node* subgraph, osg::Matrix* matrix=0, float sampleRatio=1.0f); @@ -79,6 +78,10 @@ class OSGSHADOW_EXPORT OccluderGeometry : public osg::Drawable /** Compute the bounding box around occluder geometry.*/ virtual osg::BoundingBox computeBound() const; + public: + + void processGeometry(osg::Drawable* drawable, osg::Matrix* matrix=0, float sampleRatio=1.0f); + protected : virtual ~OccluderGeometry() {} @@ -89,8 +92,10 @@ class OSGSHADOW_EXPORT OccluderGeometry : public osg::Drawable return ( delta * _triangleNormals[edge._t1] ) * ( delta * _triangleNormals[edge._t2] ); } - + + void removeDuplicates(); + Vec3List _vertices; Vec3List _triangleNormals; UIntList _triangleIndices; diff --git a/src/osgShadow/OccluderGeometry.cpp b/src/osgShadow/OccluderGeometry.cpp index 734c9c005..2f2ea21b3 100644 --- a/src/osgShadow/OccluderGeometry.cpp +++ b/src/osgShadow/OccluderGeometry.cpp @@ -130,12 +130,10 @@ public: return; } - _oc->computeOccluderGeometry(drawable, (_matrixStack.empty() ? 0 : &_matrixStack.back()), _ratio); + _oc->processGeometry(drawable, (_matrixStack.empty() ? 0 : &_matrixStack.back()), _ratio); } - - protected: OccluderGeometry* _oc; @@ -157,12 +155,25 @@ void OccluderGeometry::computeOccluderGeometry(osg::Node* subgraph, osg::Matrix* CollectOccludersVisitor cov(this, matrix, sampleRatio); subgraph->accept(cov); + + removeDuplicates(); + + dirtyDisplayList(); osg::Timer_t endTick = osg::Timer::instance()->tick(); osg::notify(osg::NOTICE)<<"done in "<delta_m(startTick, endTick)<<" ms"< VertexPointers; VertexPointers _vertexPointers; - struct IndexVec3PtrPair - { - IndexVec3PtrPair(): - vec(0), - index(0) {} - - IndexVec3PtrPair(const osg::Vec3* v, unsigned int i): - vec(v), - index(i) {} - - inline bool operator < (const IndexVec3PtrPair& rhs) const - { - return *vec < *rhs.vec; - } - - inline bool operator == (const IndexVec3PtrPair& rhs) const - { - return *vec == *rhs.vec; - } - - const osg::Vec3* vec; - unsigned int index; - }; - - OccluderGeometry::Vec3List _tempoaryTriangleVertices; TriangleCollector():_matrix(0) { } @@ -218,6 +204,7 @@ struct TriangleCollector _tempoaryTriangleVertices.push_back(v1); _tempoaryTriangleVertices.push_back(v2); _tempoaryTriangleVertices.push_back(v3); + } else { @@ -263,32 +250,6 @@ struct TriangleCollector _triangleIndices->push_back(index); } - osg::notify(osg::NOTICE)<<"temp = "<<_tempoaryTriangleVertices.size()< IndexVec3PtrPairs; - IndexVec3PtrPairs indexVec3PtrPairs; - - unsigned int i = 0; - for(OccluderGeometry::Vec3List::iterator vitr = _tempoaryTriangleVertices.begin(); - vitr != _tempoaryTriangleVertices.end(); - ++vitr, ++i) - { - indexVec3PtrPairs.push_back(IndexVec3PtrPair(&(*vitr),i)); - } - std::sort(indexVec3PtrPairs.begin(),indexVec3PtrPairs.end());; - - IndexVec3PtrPairs::iterator prev = indexVec3PtrPairs.begin(); - IndexVec3PtrPairs::iterator curr = ++prev; - unsigned int numDuplicates = 0; - for(; curr != indexVec3PtrPairs.end(); ++curr) - { - if (*prev==*curr) ++numDuplicates; - else prev = curr; - } - osg::notify(osg::NOTICE)<<"Num diplicates = "< TriangleCollectorFunctor; -void OccluderGeometry::computeOccluderGeometry(osg::Drawable* drawable, osg::Matrix* matrix, float sampleRatio) +void OccluderGeometry::processGeometry(osg::Drawable* drawable, osg::Matrix* matrix, float sampleRatio) { // osg::notify(osg::NOTICE)<<"computeOccluderGeometry(osg::Node* subgraph, float sampleRatio)"<