iMSTK
Interactive Medical Simulation Toolkit
imstkClosedSurfaceMeshToMeshCD.h
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #pragma once
8 
9 #include "imstkCollisionDetectionAlgorithm.h"
10 #include "imstkDataArray.h"
11 #include "imstkMacros.h"
12 
13 namespace imstk
14 {
15 class CollisionData;
16 class PointSet;
17 class SurfaceMesh;
18 
48 {
49 public:
51  ~ClosedSurfaceMeshToMeshCD() override = default;
52 
53  IMSTK_TYPE_NAME(ClosedSurfaceMeshToMeshCD)
54 
55 public:
60  void setGenerateEdgeEdgeContacts(bool genEdgeEdgeContacts) { m_generateEdgeEdgeContacts = genEdgeEdgeContacts; }
61 
66  void setGenerateVertexTriangleContacts(bool genVertexTriangleContacts) { m_generateVertexTriangleContacts = genVertexTriangleContacts; }
67 
71  void setPadding(const Vec3d& padding) { m_padding = padding; }
72  const Vec3d& getPadding() const { return m_padding; }
74 
79  void setProximity(const double proximity) { m_proximity = proximity; }
80  double getProximity() const { return m_proximity; }
82 
88  void setDoBroadPhase(const bool doBroadPhase) { m_doBroadPhase = doBroadPhase; }
89  bool getDoBroadPhase() const { return m_doBroadPhase; }
91 
92 protected:
97  std::shared_ptr<Geometry> geomA,
98  std::shared_ptr<Geometry> geomB,
99  std::vector<CollisionElement>& elementsA,
100  std::vector<CollisionElement>& elementsB) override;
101 
102  void vertexToTriangleTest(
103  std::shared_ptr<Geometry> geomA,
104  std::shared_ptr<Geometry> geomB,
105  std::vector<CollisionElement>& elementsA,
106  std::vector<CollisionElement>& elementsB);
107 
108  void lineMeshEdgeToTriangleTest(
109  std::shared_ptr<Geometry> geomA,
110  std::shared_ptr<Geometry> geomB,
111  std::vector<CollisionElement>& elementsA,
112  std::vector<CollisionElement>& elementsB);
113 
114  void surfMeshEdgeToTriangleTest(
115  std::shared_ptr<Geometry> geomA,
116  std::shared_ptr<Geometry> geomB,
117  std::vector<CollisionElement>& elementsA,
118  std::vector<CollisionElement>& elementsB);
119 
120 private:
125  bool doBroadPhaseCollisionCheck(
126  std::shared_ptr<Geometry> geomA,
127  std::shared_ptr<Geometry> geomB) const;
128 
129  bool m_generateEdgeEdgeContacts = false;
130  bool m_generateVertexTriangleContacts = true;
131  bool m_doBroadPhase = true;
132 
133  std::vector<bool> m_vertexInside;
134  DataArray<double> m_signedDistances;
135  Vec3d m_padding = Vec3d(0.001, 0.001, 0.001);
136  double m_proximity = -1.0; // Default off -1
137 };
138 } // namespace imstk
Base class for all collision detection classes. CollisionDetection classes produce CollisionData betw...
void setProximity(const double proximity)
Any edges with vertices not within this proximity will not have edges checked. This can be used to gr...
void setPadding(const Vec3d &padding)
Set padding to the broad phase (AABB tests)
Compound Geometry.
Closed mesh to mesh collision with brute force strategy. It can handle closed SurfaceMesh vs PointSet...
void setDoBroadPhase(const bool doBroadPhase)
Get/Set whether to do AABB broad phase. The volume bounded by the object could be larger than the vol...
void setGenerateVertexTriangleContacts(bool genVertexTriangleContacts)
If true, vertex to triangle contacts will be generated default true.
void setGenerateEdgeEdgeContacts(bool genEdgeEdgeContacts)
If true, edge to edge contacts will be generated default true.
void computeCollisionDataAB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA, std::vector< CollisionElement > &elementsB) override
Compute collision data for AB simultaneously.