From 4bd1aa4d9a2d5e40954f5d0b8e3e8a9f19c32add Mon Sep 17 00:00:00 2001 From: root Date: Sun, 23 May 2021 00:14:20 -0500 Subject: [PATCH] add checking watertight feature --- meshing/TriMesh.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ meshing/TriMesh.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/meshing/TriMesh.cpp b/meshing/TriMesh.cpp index 3df2f66e..38caa318 100644 --- a/meshing/TriMesh.cpp +++ b/meshing/TriMesh.cpp @@ -3,12 +3,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include namespace Meshing { @@ -98,6 +100,44 @@ bool TriMesh::IsValid() const return res; } +bool TriMesh::IsWatertight() const +{ + size_t numedges = tris.size()*3; + std::map edgegroup = {}; + for(size_t i=0;iv2) { + std::swap(v1,v2); + } + IntPair edge(v1,v2); + + std::map::iterator it; + it = edgegroup.find(edge); + if(it==edgegroup.end()) { + edgegroup.insert(std::make_pair(edge,1)); + } else { + it->second++; + } + } + } + + size_t numsharededges = 0; + std::map::iterator it; + for(it=edgegroup.begin();it!=edgegroup.end();it++) { + if(it->second==2) { + numsharededges++; + } + } + + if(numsharededges*2==numedges) { + return true; + } else { + return false; + } +} + void TriMesh::GetAABB(Vector3& bmin, Vector3& bmax) const { bmin.set(Inf); diff --git a/meshing/TriMesh.h b/meshing/TriMesh.h index a1474314..c9b7fd9a 100644 --- a/meshing/TriMesh.h +++ b/meshing/TriMesh.h @@ -65,6 +65,8 @@ struct TriMesh ///@name Calculations //@{ bool IsValid() const; + //returns true if every edge of a triangle is shared by two triangles + bool IsWatertight() const; void GetAABB(Vector3& bmin, Vector3& bmax) const; //returns the closest/collided triangle int ClosestPoint(const Vector3& pt,Vector3& cp) const;