7 #include "imstkCellMesh.h" 8 #include "imstkParallelUtils.h" 9 #include "imstkPbdConstraint.h" 10 #include "imstkPbdConstraintContainer.h" 11 #include "imstkPbdModel.h" 12 #include "imstkPbdObject.h" 13 #include "imstkPbdObjectCellRemoval.h" 14 #include "imstkPbdSolver.h" 15 #include "imstkTaskGraph.h" 16 #include "imstkTaskNode.h" 17 #include "imstkTearable.h" 21 Tearable::Tearable(
const std::string& name) :
SceneBehaviour(true, name)
23 m_tearableHandleNode = std::make_shared<TaskNode>([
this]()
34 CHECK(m_tearableObject !=
nullptr) <<
"Tearable requires a input PBD object," 35 "please add it on creation";
38 m_cellRemover = std::make_shared<PbdObjectCellRemoval>(m_tearableObject);
41 m_taskGraph->addNode(m_tearableHandleNode);
42 m_taskGraph->addNode(m_tearableObject->getPbdModel()->getUpdateVelocityNode());
43 m_taskGraph->addNode(m_tearableObject->getPbdModel()->getTaskGraph()->getSink());
50 if (m_tearableObject->getPbdBody()->cellConstraintMap.empty())
52 m_tearableObject->computeCellConstraintMap();
56 auto pbdBody = m_tearableObject->getPbdBody();
57 int bodyId = m_tearableObject->getPbdBody()->bodyHandle;
60 auto cellMesh = std::dynamic_pointer_cast<
AbstractCellMesh>(m_tearableObject->getPhysicsGeometry());
61 auto cellVerts = std::dynamic_pointer_cast<
DataArray<int>>(cellMesh->getAbstractCells());
66 ParallelUtils::parallelFor(cellMesh->getNumCells(),
69 std::vector<std::shared_ptr<PbdConstraint>> constraints = m_tearableObject->getCellConstraints(cellId);
72 for (
int constraintId = 0; constraintId < constraints.size(); constraintId++)
75 const std::vector<PbdParticleId>& cVertexIds = constraints[constraintId]->getParticles();
79 for (
int cVertId = 0; cVertId < cVertexIds.size(); cVertId++)
81 if (cVertexIds[cVertId].first != bodyId)
88 double constraintC = constraints[constraintId]->getConstraintC();
89 double constraintRef = constraints[constraintId]->getRestValue();
93 if (fabs(constraintRef) <= 1E-7)
99 strain = constraintC / constraintRef;
102 if (strain > m_maxStrain)
111 m_cellRemover->removeCellOnApply(cellId);
112 pbdBody->cellConstraintMap.erase(cellId);
115 }, cellMesh->getNumCells() > 50);
117 m_cellRemover->apply();
121 Tearable::initGraphEdges(std::shared_ptr<TaskNode> source, std::shared_ptr<TaskNode> sink)
124 m_taskGraph->addEdge(source, m_tearableObject->getPbdModel()->getUpdateVelocityNode());
125 m_taskGraph->addEdge(m_tearableObject->getPbdModel()->getUpdateVelocityNode(), m_tearableHandleNode);
126 m_taskGraph->addEdge(m_tearableHandleNode, m_tearableObject->getPbdModel()->getTaskGraph()->getSink());
127 m_taskGraph->addEdge(m_tearableObject->getPbdModel()->getTaskGraph()->getSink(), sink);
void unlock()
End a thread-safe region.
virtual int getNumberOfComponents() const override
Returns the number of components.
void init() override
Initialize the component, called at a later time after all component construction is complete...
std::weak_ptr< Entity > getEntity() const
Get parent entity.
void lock()
Start a thread-safe region, where only one thread can execute at a time until a call to the unlock fu...
Base class for scene objects that move and/or deform under position based dynamics formulation...
Simple dynamic array implementation that also supports event posting and viewing/facade.
Provides non templated base for cell based meshes.