16 #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESHBASE_INL_H 17 #define SURGSIM_DATASTRUCTURES_TRIANGLEMESHBASE_INL_H 23 namespace DataStructures
26 template <
class VertexData,
class EdgeData,
class TriangleData>
31 template <
class VertexData,
class EdgeData,
class TriangleData>
32 template <
class VertexDataSource,
class EdgeDataSource,
class TriangleDataSource>
36 for (
size_t iVertex = 0; iVertex < mesh.
getNumVertices(); ++iVertex)
41 for (
size_t iEdge = 0; iEdge < mesh.
getNumEdges(); ++iEdge)
49 m_triangles.reserve(sourceTriangles.size());
50 for (
auto sourceTriangle : sourceTriangles)
53 addTriangle(triangleData);
54 if (!sourceTriangle.isValid)
56 m_freeTriangles.push_back(index);
62 template <
class VertexData,
class EdgeData,
class TriangleData>
67 template <
class VertexData,
class EdgeData,
class TriangleData>
70 m_edges.push_back(edge);
71 return m_edges.size() - 1;
74 template <
class VertexData,
class EdgeData,
class TriangleData>
81 if (m_freeTriangles.empty())
83 m_triangles.push_back(triangle);
84 result = m_triangles.size() - 1;
88 result = m_freeTriangles.back();
89 m_freeTriangles.pop_back();
90 m_triangles[result] = triangle;
96 template <
class VertexData,
class EdgeData,
class TriangleData>
99 return m_edges.size();
102 template <
class VertexData,
class EdgeData,
class TriangleData>
105 return m_triangles.size() - m_freeTriangles.size();
108 template <
class VertexData,
class EdgeData,
class TriangleData>
109 const std::vector<typename TriangleMeshBase<VertexData, EdgeData, TriangleData>::EdgeType>&
115 template <
class VertexData,
class EdgeData,
class TriangleData>
116 std::vector<typename TriangleMeshBase<VertexData, EdgeData, TriangleData>::EdgeType>&
122 template <
class VertexData,
class EdgeData,
class TriangleData>
123 const std::vector<typename TriangleMeshBase<VertexData, EdgeData, TriangleData>::TriangleType>&
129 template <
class VertexData,
class EdgeData,
class TriangleData>
130 std::vector<typename TriangleMeshBase<VertexData, EdgeData, TriangleData>::TriangleType>&
136 template <
class VertexData,
class EdgeData,
class TriangleData>
143 template <
class VertexData,
class EdgeData,
class TriangleData>
150 template <
class VertexData,
class EdgeData,
class TriangleData>
154 auto const& triangle = m_triangles[id];
155 SURGSIM_ASSERT(triangle.isValid ==
true) <<
"Attempted to access invalid or deleted triangle.";
159 template <
class VertexData,
class EdgeData,
class TriangleData>
163 auto& triangle = m_triangles[id];
164 SURGSIM_ASSERT(triangle.isValid ==
true) <<
"Attempted to access invalid or deleted triangle.";
168 template <
class VertexData,
class EdgeData,
class TriangleData>
171 auto& triangle = m_triangles[id];
172 SURGSIM_ASSERT(triangle.isValid) <<
"This triangle has already been removed.";
173 triangle.isValid =
false;
174 m_freeTriangles.push_back(
id);
177 template <
class VertexData,
class EdgeData,
class TriangleData>
178 std::array<SurgSim::Math::Vector3d, 3>
181 auto& ids = getTriangle(
id).verticesId;
182 std::array<SurgSim::Math::Vector3d, 3> result
193 template <
class VertexData,
class EdgeData,
class TriangleData>
202 for (
typename std::vector<EdgeType>::const_iterator it = m_edges.begin(); it != m_edges.end(); ++it)
204 for (
int vertexId = 0; vertexId < 2; vertexId++)
206 if (it->verticesId[vertexId] >= numVertices)
214 for (
typename std::vector<TriangleType>::const_iterator it = m_triangles.begin(); it != m_triangles.end(); ++it)
216 for (
int vertexId = 0; vertexId < 3; vertexId++)
218 if (it->verticesId[vertexId] >= numVertices)
229 template <
class VertexData,
class EdgeData,
class TriangleData>
235 template <
class VertexData,
class EdgeData,
class TriangleData>
239 m_freeTriangles.clear();
242 template <
class VertexData,
class EdgeData,
class TriangleData>
250 template <
class VertexData,
class EdgeData,
class TriangleData>
255 this->doClearVertices();
263 #endif // SURGSIM_DATASTRUCTURES_TRIANGLEMESHBASE_INL_H Definition: DriveElementFromInputBehavior.cpp:27
SurgSim::Math::Vector3d position
Position of the vertex.
Definition: Vertex.h:56
bool isValid() const
Test if the TriangleMeshBase is valid (valid vertex Ids used in all MeshElements) ...
Definition: TriangleMeshBase-inl.h:194
size_t addEdge(const EdgeType &edge)
Adds an edge to the mesh.
Definition: TriangleMeshBase-inl.h:68
void removeTriangle(size_t id)
Marks a triangle as invalid, the triangle cannot be accessed via getTriangle anymore.
Definition: TriangleMeshBase-inl.h:169
size_t getNumVertices() const
Returns the number of vertices in this mesh.
Definition: Vertices.h:91
double vertexData[]
Definition: TestCube.cpp:27
virtual void doClearEdges()
Remove all edges from the mesh.
Definition: TriangleMeshBase-inl.h:230
unsigned int triangleData[]
Definition: TestCube.cpp:118
const VertexType & getVertex(size_t id) const
Returns the specified vertex.
Definition: Vertices.h:97
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
virtual bool isEqual(const Vertices &mesh) const
Internal comparison of meshes of the same type: returns true if equal, false if not equal...
Definition: Vertices.h:178
const std::vector< TriangleType > & getTriangles() const
Retrieve all triangles.
Definition: TriangleMeshBase-inl.h:124
Vertex structure for meshes.
Definition: Vertex.h:44
virtual ~TriangleMeshBase()
Destructor.
Definition: TriangleMeshBase-inl.h:63
int numVertices
Definition: TestCube.cpp:25
size_t getNumEdges() const
Get the number of edges.
Definition: TriangleMeshBase-inl.h:97
TriangleMeshBase()
Constructor. The mesh is initially empty (no vertices, no edges, no triangles).
Definition: TriangleMeshBase-inl.h:27
virtual bool isEqual(const Vertices< VertexData > &mesh) const
Internal comparison of meshes of the same type: returns true if equal, false if not equal...
Definition: TriangleMeshBase-inl.h:243
std::array< SurgSim::Math::Vector3d, 3 > getTrianglePositions(size_t id) const
Returns an array of the triangle's vertices' positions.
Definition: TriangleMeshBase-inl.h:179
const EdgeType & getEdge(size_t id) const
Retrieve a specific edge.
Definition: TriangleMeshBase-inl.h:138
Basic class for storing Triangle Meshes, handling basic vertex, edge, and triangle functionality...
Definition: TriangleMeshBase.h:58
size_t getNumTriangles() const
Get the number of triangles.
Definition: TriangleMeshBase-inl.h:103
virtual void doClearTriangles()
Remove all triangles from the mesh.
Definition: TriangleMeshBase-inl.h:236
virtual void doClear()
Clear mesh to return to an empty state (no vertices, no edges, no triangles).
Definition: TriangleMeshBase-inl.h:251
size_t addTriangle(const TriangleType &triangle)
Adds a triangle to the mesh.
Definition: TriangleMeshBase-inl.h:75
Element structure for meshes.
Definition: MeshElement.h:44
const TriangleType & getTriangle(size_t id) const
Retrieve a specific triangle.
Definition: TriangleMeshBase-inl.h:152
const SurgSim::Math::Vector3d & getVertexPosition(size_t id) const
Returns the position of a vertex.
Definition: Vertices.h:128
Base class for mesh structures, handling basic vertex functionality.
Definition: Vertices.h:50
bool isValid
Is this a valid element.
Definition: MeshElement.h:73
const std::vector< EdgeType > & getEdges() const
Retrieve all edges.
Definition: TriangleMeshBase-inl.h:110