7 #include "imstkCollisionDetectionAlgorithm.h" 8 #include "imstkAnalyticalGeometry.h" 9 #include "imstkCollisionData.h" 10 #include "imstkSurfaceMesh.h" 14 CollisionDetectionAlgorithm::CollisionDetectionAlgorithm() : GeometryAlgorithm(),
15 m_collisionDataVector(
std::make_shared<
std::vector<
std::shared_ptr<CollisionData>>>())
17 m_collisionDataVector->push_back(std::make_shared<CollisionData>());
25 if (m_requiredTypeChecks.size() == 0)
30 if (getInput(0) ==
nullptr)
32 LOG(WARNING) <<
"CollisionDetectionAlgorithm missing input A/input 0";
35 if (getInput(1) ==
nullptr)
37 LOG(WARNING) <<
"CollisionDetectionAlgorithm missing input B/input 1";
42 GeometryCheck req1 = m_requiredTypeChecks.at(0);
43 GeometryCheck req2 = m_requiredTypeChecks.at(1);
45 if ((req1(getInput(0).
get()) && req2(getInput(1).
get()))
46 || (req2(getInput(0).
get()) && req1(getInput(1).
get())))
52 LOG(WARNING) <<
"CollisionDetectionAlgorithm invalid input types. Received: (" 53 << getInput(0)->getTypeName() <<
", " << getInput(1)->getTypeName() <<
")";
62 GeometryCheck req1 = m_requiredTypeChecks.at(0);
63 GeometryCheck req2 = m_requiredTypeChecks.at(1);
64 if ((req1(getInput(0).
get()) && req2(getInput(1).
get()))
65 || (req2(getInput(0).
get()) && req1(getInput(1).
get())))
68 if ((req1(getInput(0).
get()) && req2(getInput(1).
get())))
72 else if ((req2(getInput(0).
get()) && req1(getInput(1).
get())))
78 std::shared_ptr<Geometry> geomA = (*m_collisionDataVector)[0]->geomA = getInput(0);
79 std::shared_ptr<Geometry> geomB = (*m_collisionDataVector)[0]->geomB = getInput(1);
81 std::vector<CollisionElement>* a = &(*m_collisionDataVector)[0]->elementsA;
82 std::vector<CollisionElement>* b = &(*m_collisionDataVector)[0]->elementsB;
87 bool genA = m_generateCD_A;
88 bool genB = m_generateCD_B;
99 std::swap(geomA, geomB);
100 std::swap(genA, genB);
107 computeCollisionDataAB(geomA, geomB, *a, *b);
114 computeCollisionDataA(geomA, geomB, *a);
118 computeCollisionDataB(geomA, geomB, *b);
122 if ((genA && !m_computeColDataAImplemented)
123 || (genB && !m_computeColDataBImplemented))
125 computeCollisionDataAB(geomA, geomB, *a, *b);
virtual bool areInputsValid() override
Check inputs are correct (always works reversibly)
virtual void requestUpdate() override
Compute the collision data.