iMSTK
Interactive Medical Simulation Toolkit
imstkCollisionHandling.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 
11 namespace imstk
12 {
13 class CollidingObject;
14 class InteractionPair;
15 
23 {
24 protected:
25  CollisionHandling() = default;
26 
27 public:
28  virtual ~CollisionHandling() = default;
29 
30  virtual const std::string getTypeName() const = 0;
31 
35  void setInputObjectA(std::shared_ptr<CollidingObject> objectA) { m_inputObjectA = objectA; }
36  void setInputObjectB(std::shared_ptr<CollidingObject> objectB) { m_inputObjectB = objectB; }
37 
41  std::shared_ptr<CollidingObject> getInputObjectA() const { return m_inputObjectA; }
42  std::shared_ptr<CollidingObject> getInputObjectB() const { return m_inputObjectB; }
43 
48  virtual std::shared_ptr<Geometry> getHandlingGeometryA();
49  virtual std::shared_ptr<Geometry> getHandlingGeometryB();
50 
54  void setInputCollisionData(std::shared_ptr<CollisionData> collisionData);
55 
60  void setInputCollisionData(std::shared_ptr<std::vector<std::shared_ptr<CollisionData>>> collisionVectorData);
61 
62  std::shared_ptr<const CollisionData> getInputCollisionData() const { return m_colData; }
63 
67 
68  inline void update()
69  {
70  m_updateFunction();
71  }
72 
73 protected:
81  virtual void handle(
82  const std::vector<CollisionElement>& elementsA,
83  const std::vector<CollisionElement>& elementsB) = 0;
84 
85  std::shared_ptr<CollidingObject> m_inputObjectA;
86  std::shared_ptr<CollidingObject> m_inputObjectB;
87 
88  std::shared_ptr<const CollisionData> m_colData;
89 
91  std::shared_ptr<std::vector<std::shared_ptr<CollisionData>>> m_colVectorData;
92 
93 #ifndef SWIG
94  // This is the function that is executed in \sa update()
95  std::function<void()> m_updateFunction = []() {};
96 #endif // !SWIG
97 
98  // Checks the ordering of the elements and calls the virtual \sa handle() function
99  void updateCollisionData(std::shared_ptr<const CollisionData> data);
100 
101  // Used to enable multiple /sa handle calls, m_clearData is true on the first pass
102  // m_postConstraints is true on the last pass, if there is only one pass both will
103  // be true
104  bool m_clearData = true;
105  bool m_processConstraints = true;
106 };
107 } // namespace imstk
void setInputObjectA(std::shared_ptr< CollidingObject > objectA)
Set the input objects.
std::shared_ptr< const CollisionData > m_colData
Collision data.
std::shared_ptr< std::vector< std::shared_ptr< CollisionData > > > m_colVectorData
Expansion to allow collision detection to return multiple types of collision data.
void setInputCollisionData(std::shared_ptr< CollisionData > collisionData)
Set/Get the input collision data used for handling.
Compound Geometry.
virtual std::shared_ptr< Geometry > getHandlingGeometryA()
Get the geometry used for handling defaults to the collision geometry.
void update()
Handle the input collision data.
std::shared_ptr< CollidingObject > getInputObjectA() const
Get the input objects.
Base class for all collision handling classes.
virtual void handle(const std::vector< CollisionElement > &elementsA, const std::vector< CollisionElement > &elementsB)=0
Handle the input collision data. Elements will be flipped (if needed) such that elementsA corresponds...