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 ...