diff --git a/Source/Scene/imstkPbdObjectCuttingPair.cpp b/Source/Scene/imstkPbdObjectCuttingPair.cpp index 62dd5f8431a536886bf3ca2c6a0f498c9f65d566..9475c1479c166294f4ca7ec91b46c56f37f0343a 100644 --- a/Source/Scene/imstkPbdObjectCuttingPair.cpp +++ b/Source/Scene/imstkPbdObjectCuttingPair.cpp @@ -30,6 +30,7 @@ limitations under the License. #include "imstkPbdSolver.h" #include "imstkSurfaceMesh.h" #include "imstkSurfaceMeshCut.h" +#include "imstkVecDataArray.h" namespace imstk { @@ -79,4 +80,109 @@ PbdObjectCuttingPair::apply() pbdModel->getSolver()->setInvMasses(pbdModel->getInvMasses()); pbdModel->getSolver()->setPositions(pbdModel->getCurrentState()->getPositions()); } + +void +PbdObjectCuttingPair::addVertices(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<VecDataArray<double, 3>> newVertices, + std::shared_ptr<VecDataArray<double, 3>> newInitialVertices) +{ + auto vertices = pbdMesh->getVertexPositions(); + auto initialVertices = pbdMesh->getInitialVertexPositions(); + + auto nVertices = vertices->size(); + auto nNewVertices = newVertices->size(); + if (nNewVertices != initialVertices->size()) + { + LOG(WARNING) << "Number of new vertices does not match number of new initial vertices"; + return; + } + + vertices->reserve(nVertices + nNewVertices); + initialVertices->reserve(nVertices + nNewVertices); + for (int i = 0; i < nNewVertices; ++i) + { + vertices->push_back((*newVertices)[i]); + initialVertices->push_back((*newInitialVertices)[i]); + } + pbdMesh->modified(); +} + +void +PbdObjectCuttingPair::modifyVertices(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<std::vector<size_t>> modifiedVertexIndices, + std::shared_ptr<VecDataArray<double, 3>> modifiedVertices, + std::shared_ptr<VecDataArray<double, 3>> modifiedInitialVertices) +{ + auto vertices = pbdMesh->getVertexPositions(); + auto initialVertices = pbdMesh->getInitialVertexPositions(); + + auto nVertices = vertices->size(); + auto nModifiedVertices = modifiedVertices->size(); + if (nVertices != initialVertices->size() + || nModifiedVertices != modifiedInitialVertices->size() + || nModifiedVertices != modifiedVertexIndices->size()) + { + LOG(WARNING) << "Numbers of vertices do not match."; + return; + } + + for (int i = 0; i < nModifiedVertices; ++i) + { + auto vertexIdx = modifiedVertexIndices->at(i); + (*vertices)[vertexIdx] = (*modifiedVertices)[i]; + (*initialVertices)[vertexIdx] = (*modifiedInitialVertices)[i]; + m_removeConstraintVertices->insert(vertexIdx); + m_addConstraintVertices->insert(vertexIdx); + } + pbdMesh->modified(); +} + +void +PbdObjectCuttingPair::addTriangles(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<VecDataArray<int, 3>> newTriangles) +{ + auto triangles = pbdMesh->getTriangleIndices(); + auto nTriangles = triangles->size(); + auto nNewTriangles = newTriangles->size(); + + triangles->reserve(nTriangles + nNewTriangles); + for (int i = 0; i < nNewTriangles; ++i) + { + auto& tri = (*newTriangles)[i]; + triangles->push_back(tri); + m_addConstraintVertices->insert(tri[0]); + m_addConstraintVertices->insert(tri[1]); + m_addConstraintVertices->insert(tri[2]); + } + pbdMesh->modified(); +} + +void +PbdObjectCuttingPair::modifyTriangles(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<std::vector<size_t>> modifiedTriangleIndices, + std::shared_ptr<VecDataArray<int, 3>> modifiedTriangles) +{ + auto triangles = pbdMesh->getTriangleIndices(); + auto nTriangles = triangles->size(); + auto nModifiedTriangles = modifiedTriangles->size(); + + if (nModifiedTriangles != modifiedTriangleIndices->size()) + { + LOG(WARNING) << "Numbers of vertices do not match."; + return; + } + + for (int i = 0; i < nModifiedTriangles; ++i) + { + auto& tri = (*modifiedTriangles)[i]; + (*triangles)[modifiedTriangleIndices->at(i)] = tri; + m_removeConstraintVertices->insert(tri[0]); + m_removeConstraintVertices->insert(tri[1]); + m_removeConstraintVertices->insert(tri[2]); + m_addConstraintVertices->insert(tri[0]); + m_addConstraintVertices->insert(tri[1]); + m_addConstraintVertices->insert(tri[2]); + } + pbdMesh->modified(); +} } \ No newline at end of file diff --git a/Source/Scene/imstkPbdObjectCuttingPair.h b/Source/Scene/imstkPbdObjectCuttingPair.h index 7fe35f62f394dad7f4e43ec88b0dfce744bed46f..6a58f2a2c4053cf9f9a00aabc339fb628679a6d2 100644 --- a/Source/Scene/imstkPbdObjectCuttingPair.h +++ b/Source/Scene/imstkPbdObjectCuttingPair.h @@ -22,11 +22,16 @@ limitations under the License. #pragma once #include "imstkObjectInteractionPair.h" +#include "imstkVecDataArray.h" + +#include <unordered_set> +#include <vector> namespace imstk { -class PbdObject; class CollidingObject; +class PbdObject; +class SurfaceMesh; /// /// \class PbdObjectCuttingPair @@ -42,5 +47,36 @@ public: void apply(); protected: + + /// + /// \brief Add new vertices to pbdObj + /// + void addVertices(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<VecDataArray<double, 3>> vertices, + std::shared_ptr<VecDataArray<double, 3>> initialVertices); + + /// + /// \brief Modify current vertices of pbdObj + /// + void modifyVertices(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<std::vector<size_t>> vertexIndices, + std::shared_ptr<VecDataArray<double, 3>> vertices, + std::shared_ptr<VecDataArray<double, 3>> initialVertices); + + /// + /// \brief Add new elements to pbdObj + /// + void addTriangles(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<VecDataArray<int, 3>> elements); + + /// + /// \brief Modify exsiting elements of pbdObj + /// + void modifyTriangles(std::shared_ptr<SurfaceMesh> pbdMesh, + std::shared_ptr<std::vector<size_t>> elementIndices, + std::shared_ptr<VecDataArray<int, 3>> elements); + + std::shared_ptr<std::unordered_set<size_t>> m_removeConstraintVertices = std::make_shared<std::unordered_set<size_t>>(); + std::shared_ptr<std::unordered_set<size_t>> m_addConstraintVertices = std::make_shared<std::unordered_set<size_t>>(); }; } \ No newline at end of file