]> git.mxchange.org Git - simgear.git/commitdiff
Avoid duplicate triangles.
authorfrohlich <frohlich>
Tue, 3 Mar 2009 08:25:19 +0000 (08:25 +0000)
committerTim Moore <timoore@redhat.com>
Thu, 5 Mar 2009 09:32:06 +0000 (10:32 +0100)
Modified Files:
simgear/scene/bvh/BVHStaticGeometryBuilder.hxx

simgear/scene/bvh/BVHStaticGeometryBuilder.hxx

index f754c54275fabd214b45ab7772f2fbf7c3476e2a..98968162e7bebbf872fbfae878c71efb69e1b969 100644 (file)
 #ifndef BVHStaticGeometryBuilder_hxx
 #define BVHStaticGeometryBuilder_hxx
 
+#include <algorithm>
+#include <map>
+#include <set>
+
 #include <simgear/structure/SGReferenced.hxx>
 #include <simgear/structure/SGSharedPtr.hxx>
 
@@ -71,6 +75,9 @@ public:
     typedef std::map<SGVec3f, unsigned> VertexMap;
     VertexMap _vertexMap;
 
+    typedef std::set<SGVec3<unsigned> > TriangleSet;
+    TriangleSet _triangleSet;
+
     void setCurrentMaterial(const SGMaterial* material)
     {
         _currentMaterial = material;
@@ -98,6 +105,11 @@ public:
     void addTriangle(const SGVec3f& v1, const SGVec3f& v2, const SGVec3f& v3)
     {
         unsigned indices[3] = { addVertex(v1), addVertex(v2), addVertex(v3) };
+        std::sort(indices, indices + 3);
+        SGVec3<unsigned> indexKey(indices);
+        if (_triangleSet.find(indexKey) != _triangleSet.end())
+            return;
+        _triangleSet.insert(indexKey);
         BVHStaticTriangle* staticTriangle;
         staticTriangle = new BVHStaticTriangle(_currentMaterialIndex, indices);
         _leafRefList.push_back(LeafRef(staticTriangle, *_staticData));