iMSTK
Interactive Medical Simulation Toolkit
|
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indices. More...
#include <imstkSurfaceMesh.h>
Public Member Functions | |
void | initialize (std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< int, 3 >> triangleIndices, const bool computeDerivedData=false) |
Initializes the rest of the data structures given vertex positions and triangle connectivity. | |
void | initialize (std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< int, 3 >> triangleIndices, std::shared_ptr< VecDataArray< double, 3 >> normals, const bool computeDerivedData=false) |
Initializes the rest of the data structures given vertex positions, triangle connectivity, and normals. | |
void | computeTrianglesNormals () |
Compute the normals of all the triangles. | |
void | computeTriangleTangents () |
Compute the tangents of all the triangles based off. | |
void | computeVertexNormals () |
Computes the normals of all the vertices. | |
void | computeVertexTangents () |
Comptues the tangents of all the vertices. | |
Vec3d | computeBarycentricWeights (const int tetId, const Vec3d &pos) const override |
compute the barycentric weights of a given point in 3D space for a given the triangle | |
void | optimizeForDataLocality () |
Rewire the node order and triangle connectivity to optimize for memory layout The intended use is for large meshes that doesn't fit into CPU/GPU memory. More... | |
void | flipNormals () |
Flip the normals for the whole mesh by reversing the winding order. | |
void | correctWindingOrder () |
Enforces consistency in the winding order of the triangles. | |
void | computeUVSeamVertexGroups () |
Finds vertices along vertex seams that share geometric properties. | |
double | getVolume () override |
Get the volume enclosed by the surface mesh. | |
int | getNumTriangles () const |
void | setTriangleIndices (std::shared_ptr< VecDataArray< int, 3 >> indices) |
std::shared_ptr< VecDataArray< int, 3 > > | getTriangleIndices () const |
std::unique_ptr< SurfaceMesh > | clone () |
Polymorphic clone, hides the declaration in superclass return own type. | |
![]() | |
void | initialize (std::shared_ptr< VecDataArray< double, 3 >> vertices, std::shared_ptr< VecDataArray< int, N >> indices) |
Initializes the rest of the data structures given vertex positions and connectivity. | |
int | getCellVertexCount () const override |
Number of verticies associated with the cell type. | |
void | clear () override |
Clears all the mesh data. | |
void | computeVertexToCellMap () override |
Computes neighboring cells for all vertices. | |
void | computeVertexNeighbors () override |
Computes neighboring vertices for all vertices. | |
virtual Eigen::Vector< double, N > | computeBarycentricWeights (const int imstkNotUsed(cellId), const Vec3d &imstkNotUsed(pos)) const |
compute the barycentric weights of a given point in 3D space for a given the cell | |
Vec3d | computeWorldPosition (const int cellId, const Eigen::Matrix< double, N, 1 > &bary) const |
compute the world position of a point in 3D given the cellId and a set of barycentric coordinates | |
std::shared_ptr< AbstractDataArray > | getAbstractCells () const override |
Get cells as abstract array. Overridden by derived classes to return cells as point indices. | |
int | getNumCells () const override |
Returns the number of cells. | |
std::unique_ptr< CellMesh< N > > | clone () |
Polymorphic clone, hides the declaration in superclass return own type. | |
void | setCells (std::shared_ptr< VecDataArray< int, N >> indices) |
Get/Set cell connectivity. | |
std::shared_ptr< VecDataArray< int, N > > | getCells () const |
![]() | |
bool | isMesh () const override |
Returns true if the geometry is a mesh, else returns false. | |
void | print () const override |
Print the surface mesh. | |
const std::vector< std::unordered_set< int > > & | getVertexToCellMap () const |
Returns map of vertices to cells that contain the vertex (reverse linkage) | |
const std::vector< int > | getCellsForVertex (const int vertexId) |
Returns cells that contain the vertex, will calculate vertex cells if necessary. More... | |
const std::vector< std::unordered_set< int > > & | getVertexNeighbors () const |
Returns map of vertices to neighboring vertices. | |
const std::unordered_map< std::string, std::shared_ptr< AbstractDataArray > > & | getCellAttributes () const |
Get the cell attributes map. | |
void | setCellAttribute (const std::string &arrayName, std::shared_ptr< AbstractDataArray > arr) |
std::shared_ptr< AbstractDataArray > | getCellAttribute (const std::string &name) const |
bool | hasCellAttribute (const std::string &arrayName) const |
Check if a specific data array exists. | |
void | setCellAttributes (std::unordered_map< std::string, std::shared_ptr< AbstractDataArray >> attributes) |
Set the cell attributes map. | |
void | setCellScalars (const std::string &arrayName, std::shared_ptr< AbstractDataArray > scalars) |
Get/Set the active scalars. | |
void | setCellScalars (const std::string &arrayName) |
std::string | getActiveCellScalars () const |
std::shared_ptr< AbstractDataArray > | getCellScalars () const |
void | setCellNormals (const std::string &arrayName, std::shared_ptr< VecDataArray< double, 3 >> normals) |
Get/Set the active normals. | |
void | setCellNormals (const std::string &arrayName) |
std::string | getActiveCellNormals () const |
std::shared_ptr< VecDataArray< double, 3 > > | getCellNormals () const |
void | setCellTangents (const std::string &arrayName, std::shared_ptr< VecDataArray< double, 3 >> tangents) |
Get/Set the active tangents. | |
void | setCellTangents (const std::string &arrayName) |
std::string | getActiveCellTangents () const |
std::shared_ptr< VecDataArray< double, 3 > > | getCellTangents () const |
![]() | |
void | initialize (std::shared_ptr< VecDataArray< double, 3 >> positions) |
Initializes the data structure given vertex positions. | |
virtual void | computeBoundingBox (Vec3d &lowerCorner, Vec3d &upperCorner, const double paddingPercent=0.0) override |
Compute the bounding box for the entire mesh. | |
void | setInitialVertexPositions (std::shared_ptr< VecDataArray< double, 3 >> vertices) |
Sets initial positions from an array. | |
std::shared_ptr< VecDataArray< double, 3 > > | getInitialVertexPositions () const |
Returns the vector of initial positions of the mesh vertices. | |
Vec3d & | getInitialVertexPosition (const size_t vertNum) |
Returns the initial position of a vertex given its index. | |
void | setVertexPositions (std::shared_ptr< VecDataArray< double, 3 >> positions) |
Sets current vertex positions of the mesh. | |
std::shared_ptr< VecDataArray< double, 3 > > | getVertexPositions (DataType type=DataType::PostTransform) const |
Returns the vector of current positions of the mesh vertices. | |
void | setVertexPosition (const size_t vertNum, const Vec3d &pos) |
Set the current position of a vertex given its index to certain position (this is not a thread-safe method) | |
int | getNumVertices () const |
Returns the number of total vertices in the mesh. | |
void | setVertexAttribute (const std::string &arrayName, std::shared_ptr< AbstractDataArray > arr) |
Set a data array holding some per vertex data. | |
std::shared_ptr< AbstractDataArray > | getVertexAttribute (const std::string &arrayName) const |
Get a specific data array. If the array name cannot be found, nullptr is returned. | |
bool | hasVertexAttribute (const std::string &arrayName) const |
Check if a specific data array exists. | |
void | setVertexAttributes (std::unordered_map< std::string, std::shared_ptr< AbstractDataArray >> attributes) |
Set the vertex attributes map. | |
const std::unordered_map< std::string, std::shared_ptr< AbstractDataArray > > & | getVertexAttributes () const |
Get the vertex attributes map. | |
void | updatePostTransformData () const override |
Applies the geometries member transform to produce currPositions. | |
std::unique_ptr< PointSet > | clone () |
Polymorphic clone, hides the declaration in superclass return own type. | |
const Vec3d & | getVertexPosition (const size_t vertNum, DataType type=DataType::PostTransform) const |
Returns the position of a vertex given its index. | |
Vec3d & | getVertexPosition (const size_t vertNum, DataType type=DataType::PostTransform) |
void | setVertexScalars (const std::string &arrayName, std::shared_ptr< AbstractDataArray > scalars) |
Get/Set the active scalars. | |
void | setVertexScalars (const std::string &arrayName) |
std::string | getActiveVertexScalars () const |
std::shared_ptr< AbstractDataArray > | getVertexScalars () const |
void | setVertexNormals (const std::string &arrayName, std::shared_ptr< VecDataArray< double, 3 >> normals) |
Get/Set the active normals. | |
void | setVertexNormals (const std::string &arrayName) |
std::string | getActiveVertexNormals () const |
std::shared_ptr< VecDataArray< double, 3 > > | getVertexNormals () const |
void | setVertexTangents (const std::string &arrayName, std::shared_ptr< VecDataArray< float, 3 >> tangents) |
Get/Set the active tangents. | |
void | setVertexTangents (const std::string &arrayName) |
std::string | getActiveVertexTangents () const |
std::shared_ptr< VecDataArray< float, 3 > > | getVertexTangents () const |
void | setVertexTCoords (const std::string &arrayName, std::shared_ptr< VecDataArray< float, 2 >> tcoords) |
Get/Set the active tcoords. | |
void | setVertexTCoords (const std::string &arrayName) |
std::string | getActiveVertexTCoords () const |
std::shared_ptr< VecDataArray< float, 2 > > | getVertexTCoords () const |
![]() | |
Geometry (const Geometry &other) | |
void | operator= (const Geometry &other) |
virtual const std::string | getTypeName () const =0 |
Returns the string representing the type name of the geometry. More... | |
SIGNAL (Geometry, modified) | |
virtual Vec3d | getCenter () |
Returns the bounding box center. | |
void | transform (const Mat4d &T, TransformType type=TransformType::ConcatenateToTransform) |
Applies a rigid transform to the geometry. | |
std::unique_ptr< Geometry > | clone () |
polymorphic clone function, utilize this to get a copy of the geometry without casting to the expected geometry type | |
const std::string & | getName () const |
Get the name of the geometry. | |
void | setName (const std::string &name) |
size_t | getGlobalId () const |
Get the global (unique) index of the geometry. | |
void | postModified () |
Post modified event. | |
void | translate (const Vec3d &t, TransformType type=TransformType::ConcatenateToTransform) |
Translate the geometry in Cartesian space. | |
void | translate (double x, double y, double z, TransformType type=TransformType::ConcatenateToTransform) |
void | rotate (const Quatd &q, TransformType type=TransformType::ConcatenateToTransform) |
Rotate the geometry in Cartesian space. | |
void | rotate (const Mat3d &m, TransformType type=TransformType::ConcatenateToTransform) |
void | rotate (const Vec3d &axis, double radians, TransformType type=TransformType::ConcatenateToTransform) |
void | scale (const Vec3d &scaling, TransformType type=TransformType::ConcatenateToTransform) |
Scale in Cartesian directions. | |
void | scale (const double scaling, TransformType type=TransformType::ConcatenateToTransform) |
Vec3d | getTranslation () const |
Get/Set translation. | |
void | setTranslation (const Vec3d &t) |
void | setTranslation (const double x, const double y, const double z) |
Mat3d | getRotation () const |
Get/Set rotation. | |
void | setRotation (const Mat3d &m) |
void | setRotation (const Quatd &q) |
void | setRotation (const Vec3d &axis, const double angle) |
Vec3d | getScaling () const |
Get/Set scaling. | |
void | setScaling (const Vec3d &s) |
void | setScaling (const double s) |
const Mat4d & | getTransform () const |
Get/Set the transform. | |
void | setTransform (const Mat4d &m) |
![]() | |
template<typename T > | |
void | postEvent (const T &e) |
Emits the event Direct observers will be immediately called, in sync Queued observers will receive the Command in their queue for later execution, reciever must implement doEvent. | |
template<typename T > | |
void | queueEvent (const T &e) |
Queues event directly to this. | |
void | doEvent () |
Do an event, if none exists return. | |
void | doAllEvents () |
Do all the events in the event queue. | |
void | foreachEvent (std::function< void(Command cmd)> func) |
Thread safe loop over all event commands, one can implement a custom handler. | |
void | rforeachEvent (std::function< void(Command cmd)> func) |
thread safe reverse loop over all event commands, one can implement a custom handler | |
void | clearEvents () |
Removes all events from queue cleans up copies of the event. | |
Protected Attributes | |
std::map< NormalGroup, std::shared_ptr< std::vector< size_t > > > | m_UVSeamVertexGroups |
![]() | |
std::shared_ptr< VecDataArray< int, N > > | m_indices |
![]() | |
std::vector< std::unordered_set< int > > | m_vertexToCells |
Map of vertices to neighbor cells. | |
std::vector< std::unordered_set< int > > | m_vertexToNeighborVertex |
Map of vertices to neighbor vertices. More... | |
std::unordered_map< std::string, std::shared_ptr< AbstractDataArray > > | m_cellAttributes |
std::string | m_activeCellNormals = "" |
std::string | m_activeCellTangents = "" |
std::string | m_activeCellScalars = "" |
![]() | |
std::shared_ptr< VecDataArray< double, 3 > > | m_initialVertexPositions |
std::shared_ptr< VecDataArray< double, 3 > > | m_vertexPositions |
std::unordered_map< std::string, std::shared_ptr< AbstractDataArray > > | m_vertexAttributes |
std::string | m_activeVertexNormals = "" |
std::string | m_activeVertexScalars = "" |
std::string | m_activeVertexTangents = "" |
std::string | m_activeVertexTCoords = "" |
Vec3d | m_lowerCorner |
Vec3d | m_upperCorner |
![]() | |
bool | m_transformApplied = true |
bool | m_boundsDirty = true |
Mat4d | m_transform = Mat4d::Identity() |
Transformation matrix. | |
size_t | m_globalId |
Unique ID assigned to each geometry upon construction. | |
std::string | m_name = "unnamed" |
![]() | |
ParallelUtils::SpinLock | eventQueueLock |
std::deque< Command > | eventQueue |
std::vector< std::pair< std::string, std::vector< Observer > > > | queuedObservers |
std::vector< std::pair< std::string, std::vector< Observer > > > | directObservers |
Additional Inherited Members | |
![]() | |
using | VertexDataType = VecDataArray< double, 3 > |
using | CellIndexType = VecDataArray< int, N > |
using | CellType = Eigen::Matrix< int, N, 1 > |
![]() | |
enum | TransformType { ApplyToData, ConcatenateToTransform } |
Enumeration for the transformation to apply ApplyToTransform to apply the transformation to the data ConcatenateToTransform to apply the transformation to the transform matrix. | |
enum | DataType { PreTransform, PostTransform } |
Enumeration for the data to retrieve PreTransform for data where transform matrix is not applied PostTransform for data where transform matrix is applied. | |
![]() | |
using | Observer = std::tuple< bool, std::weak_ptr< EventObject >, std::function< void(Event *)> > |
![]() | |
static size_t | getNumGlobalIds () |
Get number of ids/geometries. | |
![]() | |
static constexpr int | CellVertexCount |
![]() | |
void | setCellActiveAttribute (std::string &activeAttributeName, std::string attributeName, const int expectedNumComponents, const ScalarTypeId expectedScalarType) |
![]() | |
void | applyTransform (const Mat4d &m) override |
Applies transformation m directly the initial and post transform data. | |
void | setActiveVertexAttribute (std::string &activeAttributeName, const std::string attributeName, const int expectedNumComponents, const ScalarTypeId expectedScalarType) |
Sets the active vertex attribute name as long as the # components is satisfied. Throws message and casts if incorrect scalar type is provided. | |
![]() | |
static size_t | getUniqueId () |
Get a unique ID for the new generated geometry object. | |
![]() | |
static std::atomic< size_t > | s_numGlobalIds = { 0 } |
Total number of geometries that have been created in this program. | |
Represents a set of triangles & vertices via an array of Vec3d double vertices & Vec3i integer indices.
Definition at line 124 of file imstkSurfaceMesh.h.
void imstk::SurfaceMesh::optimizeForDataLocality | ( | ) |
Rewire the node order and triangle connectivity to optimize for memory layout The intended use is for large meshes that doesn't fit into CPU/GPU memory.
Definition at line 283 of file imstkSurfaceMesh.cpp.