iMSTK
Interactive Medical Simulation Toolkit
imstkCollisionDetectionAlgorithm.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 "imstkCollisionData.h"
10 #include "imstkGeometryAlgorithm.h"
11 
12 namespace imstk
13 {
14 class Geometry;
15 
34 {
35 protected:
37 
38 public:
39  virtual ~CollisionDetectionAlgorithm() = default;
40 
44  virtual const std::string getTypeName() const = 0;
45 
49  inline const std::shared_ptr<CollisionData> getCollisionData() const { return (*m_collisionDataVector)[0]; }
50 
51  inline const std::shared_ptr<CollisionData> getCollisionData(int i) const
52  {
53  return m_collisionDataVector->size() > i ? m_collisionDataVector->at(i) : nullptr;
54  }
55 
56  inline const std::shared_ptr<std::vector<std::shared_ptr<CollisionData>>>& getCollisionDataVector() const { return m_collisionDataVector; }
57 
58  inline size_t getCollisionDataVectorSize() const
59  {
60  return m_collisionDataVector->size();
61  }
62 
67  void setGenerateCD(const bool generateA, const bool generateB)
68  {
69  m_generateCD_A = generateA;
70  m_generateCD_B = generateB;
71  }
72 
73  void setInputGeometryA(std::shared_ptr<Geometry> geometryA) { setInput(geometryA, 0); }
74 
75  void setInputGeometryB(std::shared_ptr<Geometry> geometryB) { setInput(geometryB, 1); }
76 
77 protected:
82  virtual bool areInputsValid() override;
83 
87  virtual void requestUpdate() override;
88 
93  virtual void computeCollisionDataAB(
94  std::shared_ptr<Geometry> geomA,
95  std::shared_ptr<Geometry> geomB,
96  std::vector<CollisionElement>& elementsA,
97  std::vector<CollisionElement>& elementsB)
98  {
99  computeCollisionDataA(geomA, geomB, elementsA);
100  computeCollisionDataB(geomA, geomB, elementsB);
101  }
102 
106  virtual void computeCollisionDataA(
107  std::shared_ptr<Geometry> imstkNotUsed(geomA),
108  std::shared_ptr<Geometry> imstkNotUsed(geomB),
109  std::vector<CollisionElement>& imstkNotUsed(elementsA)) { m_computeColDataAImplemented = false; }
110 
114  virtual void computeCollisionDataB(
115  std::shared_ptr<Geometry> imstkNotUsed(geomA),
116  std::shared_ptr<Geometry> imstkNotUsed(geomB),
117  std::vector<CollisionElement>& imstkNotUsed(elementsB)) { m_computeColDataBImplemented = false; }
118 
119  std::shared_ptr<std::vector<std::shared_ptr<CollisionData>>> m_collisionDataVector;
120 
121  bool m_flipOutput = false;
122  bool m_generateCD_A = true;
123  bool m_generateCD_B = true;
124 
125  bool m_computeColDataAImplemented = true;
126  bool m_computeColDataBImplemented = true;
127 };
128 } // namespace imstk
Base class for all collision detection classes. CollisionDetection classes produce CollisionData betw...
void setGenerateCD(const bool generateA, const bool generateB)
If generateA is false, CD data will not be generated for input0,A Similarly, if generateB is false...
virtual void computeCollisionDataA(std::shared_ptr< Geometry > imstkNotUsed(geomA), std::shared_ptr< Geometry > imstkNotUsed(geomB), std::vector< CollisionElement > &imstkNotUsed(elementsA))
Compute collision data for side A (implement as if flip=true)
virtual bool areInputsValid() override
Check inputs are correct (always works reversibly)
Compound Geometry.
virtual const std::string getTypeName() const =0
Returns collision detection type string name.
const std::shared_ptr< CollisionData > getCollisionData() const
Returns output collision data.
virtual void computeCollisionDataB(std::shared_ptr< Geometry > imstkNotUsed(geomA), std::shared_ptr< Geometry > imstkNotUsed(geomB), std::vector< CollisionElement > &imstkNotUsed(elementsB))
Compute collision data for side B (implement as if flip=true)
virtual void computeCollisionDataAB(std::shared_ptr< Geometry > geomA, std::shared_ptr< Geometry > geomB, std::vector< CollisionElement > &elementsA, std::vector< CollisionElement > &elementsB)
Compute collision data for both sides at once, default implementation just calls computeCollisionData...
void setInput(std::shared_ptr< Geometry > inputGeometry, size_t port=0)
Set the input at the port.
virtual void requestUpdate() override
Compute the collision data.
Abstract base class for geometry algorithms. GeometryAlgorithms take N input geometries and produce N...