7 #include "imstkCDObjectFactory.h"     8 #include "imstkCollisionInteraction.h"     9 #include "imstkCollidingObject.h"    10 #include "imstkCollisionDetectionAlgorithm.h"    11 #include "imstkCollisionHandling.h"    12 #include "imstkTaskGraph.h"    16 CollisionInteraction::CollisionInteraction(
    18     std::shared_ptr<CollidingObject> objA,
    19     std::shared_ptr<CollidingObject> objB,
    20     std::string                      cdType = 
"") : SceneObject(objName),
    21     m_objA(objA), m_objB(objB)
    23     CHECK(objA != 
nullptr) << 
"CollisionInteraction requires a CollidingObject objA";
    24     CHECK(objB != 
nullptr) << 
"CollisionInteraction requires a CollidingObject objB";
    27         objA->getName() + 
"_vs_" + objB->getName() + 
"_CollisionDetection");
    28     m_taskGraph->addNode(m_collisionDetectionNode);
    31         objA->getName() + 
"_vs_" + objB->getName() + 
"_CollisionHandlingA", 
true);
    32     m_taskGraph->addNode(m_collisionHandleANode);
    35         objA->getName() + 
"_vs_" + objB->getName() + 
"_CollisionHandlingB", 
true);
    36     m_taskGraph->addNode(m_collisionHandleBNode);
    39     m_collisionGeometryUpdateNode = std::make_shared<TaskNode>([
this]() {
    40             if (m_didUpdateThisFrame)
    44             m_didUpdateThisFrame = 
true;
    45             updateCollisionGeometry();
    47         objA->getName() + 
"_vs_" + objB->getName() + 
"_CollisionGeometryUpdate", 
true);
    48     m_taskGraph->addNode(m_collisionGeometryUpdateNode);
    53         cdType = getCDType(*objA, *objB);
    58     m_colDetect->setInput(objA->getCollidingGeometry(), 0);
    59     m_colDetect->setInput(objB->getCollidingGeometry(), 1);
    60     setCollisionDetection(m_colDetect);
    64 CollisionInteraction::setCollisionDetection(std::shared_ptr<CollisionDetectionAlgorithm> colDetect)
    66     m_colDetect = colDetect;
    72     m_colHandlingA = colHandlingA;
    78     m_colHandlingB = colHandlingB;
    84     m_colHandlingA = m_colHandlingB = colHandlingAB;
    90     if (m_colDetect != 
nullptr)
    92         m_colDetect->update();
    95     auto dataVector = m_colDetect->getCollisionDataVector();
    96     for (
const auto& item : *dataVector)
    98         if (item->elementsA.empty() && item->elementsB.empty())
   102         m_objA->addCollision(m_objB, item);
   103         m_objB->addCollision(m_objA, item);
   110     if (m_colHandlingA != 
nullptr)
   112         m_colHandlingA->update();
   119     if (m_colHandlingB != 
nullptr)
   121         m_colHandlingB->update();
   126 CollisionInteraction::updateCollisionGeometry()
   131     if (
auto colObj1 = std::dynamic_pointer_cast<CollidingObject>(m_objA))
   133         colObj1->updateGeometries();
   135     if (
auto colObj2 = std::dynamic_pointer_cast<CollidingObject>(m_objB))
   137         colObj2->updateGeometries();
   144     m_collisionDetectionNode->setEnabled(enabled);
   146     if (m_colDetect != 
nullptr)
   148         for (
size_t i = 0; i < m_colDetect->getCollisionDataVectorSize(); ++i)
   150             if (
auto data = m_colDetect->getCollisionData())
   153                 data->elementsA.resize(0);
   154                 data->elementsB.resize(0);
   160         LOG(WARNING) << 
"Tried to enable/disable collision, but no CD method was provided";
   165 CollisionInteraction::getEnabled()
 const   167     return m_collisionDetectionNode->m_enabled;
   173     m_didUpdateThisFrame = 
false;
 void setCollisionHandlingAB(std::shared_ptr< CollisionHandling > colHandlingAB)
Set the two-way Collision Handling for both objects. 
 
void updateCHB()
Update handler B. 
 
void setCollisionHandlingB(std::shared_ptr< CollisionHandling > colHandlingB)
Set the Collision Handling for object B. 
 
void updateCD()
Update collision. 
 
void updateCHA()
Update handler A. 
 
static std::shared_ptr< CollisionDetectionAlgorithm > makeCollisionDetection(const std::string collisionTypeName)
attempts to create a new CD algorithm 
 
void visualUpdate() override
Update the visuals, called before render. 
 
void setCollisionHandlingA(std::shared_ptr< CollisionHandling > colHandlingA)
Set the Collision Handling for object A. 
 
virtual void setEnabled(const bool enabled)
Enable or disable the interaction, when disabled the interaction isn't executed and no response will ...