From 0e70eae22bdfbe635e89a84307cda4aae8d1c905 Mon Sep 17 00:00:00 2001 From: Ye Han <ye.han@kitware.com> Date: Wed, 17 Mar 2021 19:29:46 -0400 Subject: [PATCH] ENH: Add functions for topo vert/tri change --- Source/Scene/imstkPbdObjectCuttingPair.cpp | 106 +++++++++++++++++++++ Source/Scene/imstkPbdObjectCuttingPair.h | 38 +++++++- 2 files changed, 143 insertions(+), 1 deletion(-) diff --git a/Source/Scene/imstkPbdObjectCuttingPair.cpp b/Source/Scene/imstkPbdObjectCuttingPair.cpp index 62dd5f843..9475c1479 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 7fe35f62f..6a58f2a2c 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 -- GitLab