16 #ifndef SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H 17 #define SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H 24 namespace DataStructures
27 template <
class VertexData,
class EdgeData,
class TriangleData>
32 template <
class VertexData,
class EdgeData,
class TriangleData>
37 m_edges(other.getEdges()),
38 m_triangles(other.getTriangles()),
39 m_freeTriangles(other.m_freeTriangles)
43 template <
class VertexData,
class EdgeData,
class TriangleData>
44 template <
class V,
class E,
class T>
49 m_edges.reserve(other.
getEdges().size());
60 if (!triangle.isValid)
62 m_freeTriangles.push_back(index);
68 template <
class VertexData,
class EdgeData,
class TriangleData>
73 template <
class VertexData,
class EdgeData,
class TriangleData>
80 template <
class VertexData,
class EdgeData,
class TriangleData>
83 m_edges.push_back(edge);
84 return m_edges.size() - 1;
87 template <
class VertexData,
class EdgeData,
class TriangleData>
94 if (m_freeTriangles.empty())
96 m_triangles.push_back(triangle);
97 result = m_triangles.size() - 1;
101 result = m_freeTriangles.back();
102 m_freeTriangles.pop_back();
103 m_triangles[result] = triangle;
109 template <
class VertexData,
class EdgeData,
class TriangleData>
112 return m_edges.size();
115 template <
class VertexData,
class EdgeData,
class TriangleData>
118 return m_triangles.size() - m_freeTriangles.size();
121 template <
class VertexData,
class EdgeData,
class TriangleData>
122 const std::vector<typename TriangleMesh<VertexData, EdgeData, TriangleData>::EdgeType>&
128 template <
class VertexData,
class EdgeData,
class TriangleData>
129 std::vector<typename TriangleMesh<VertexData, EdgeData, TriangleData>::EdgeType>&
135 template <
class VertexData,
class EdgeData,
class TriangleData>
136 const std::vector<typename TriangleMesh<VertexData, EdgeData, TriangleData>::TriangleType>&
142 template <
class VertexData,
class EdgeData,
class TriangleData>
143 std::vector<typename TriangleMesh<VertexData, EdgeData, TriangleData>::TriangleType>&
149 template <
class VertexData,
class EdgeData,
class TriangleData>
156 template <
class VertexData,
class EdgeData,
class TriangleData>
163 template <
class VertexData,
class EdgeData,
class TriangleData>
164 std::array<SurgSim::Math::Vector3d, 2>
167 auto& ids = getEdge(
id).verticesId;
168 std::array<SurgSim::Math::Vector3d, 2> result =
177 template <
class VertexData,
class EdgeData,
class TriangleData>
181 auto const& triangle = m_triangles[id];
183 <<
"Attempted to access invalid or deleted triangle " <<
id <<
" have " << getNumTriangles();
187 template <
class VertexData,
class EdgeData,
class TriangleData>
191 auto& triangle = m_triangles[id];
192 SURGSIM_ASSERT(triangle.isValid) <<
"Attempted to access invalid or deleted triangle.";
196 template <
class VertexData,
class EdgeData,
class TriangleData>
199 auto& triangle = m_triangles[id];
200 if (triangle.isValid)
203 m_freeTriangles.push_back(
id);
207 template <
class VertexData,
class EdgeData,
class TriangleData>
208 std::array<SurgSim::Math::Vector3d, 3>
211 auto& ids = getTriangle(
id).verticesId;
212 std::array<SurgSim::Math::Vector3d, 3> result =
222 template <
class VertexData,
class EdgeData,
class TriangleData>
231 for (
typename std::vector<EdgeType>::const_iterator it = m_edges.begin(); it != m_edges.end(); ++it)
233 for (
int vertexId = 0; vertexId < 2; vertexId++)
235 if (it->verticesId[vertexId] >= numVertices)
243 for (
typename std::vector<TriangleType>::const_iterator it = m_triangles.begin(); it != m_triangles.end(); ++it)
245 for (
int vertexId = 0; vertexId < 3; vertexId++)
247 if (it->verticesId[vertexId] >= numVertices)
258 template <
class VertexData,
class EdgeData,
class TriangleData>
264 template <
class VertexData,
class EdgeData,
class TriangleData>
268 m_freeTriangles.clear();
271 template <
class VertexData,
class EdgeData,
class TriangleData>
279 template <
class VertexData,
class EdgeData,
class TriangleData>
286 <<
"'" << fileName <<
"' is an invalid .ply file.";
291 auto delegate = std::make_shared<TriangleMeshPlyReaderDelegate<MeshType>>(this->shared_from_this());
295 <<
"The input file '" << fileName <<
"' does not have the property required by triangle mesh.";
302 template <
class VertexData,
class EdgeData,
class TriangleData>
310 template <
class VertexData,
class EdgeData,
class TriangleData>
316 std::swap(m_triangles, other.m_triangles);
317 std::swap(m_edges, other.m_edges);
318 std::swap(m_freeTriangles, other.m_freeTriangles);
321 template <
class VertexData,
class EdgeData,
class TriangleData>
326 m_triangles = other.m_triangles;
327 m_edges = other.m_edges;
328 m_freeTriangles = other.m_freeTriangles;
332 template <
class VertexData,
class EdgeData,
class TriangleData>
339 std::swap(m_triangles, other.m_triangles);
340 std::swap(m_edges, other.m_edges);
341 std::swap(m_freeTriangles, other.m_freeTriangles);
345 template <
class VertexData,
class EdgeData,
class TriangleData>
348 std::fstream out(fileName, std::ios::out);
352 out <<
"ply" << std::endl;
353 out <<
"format ascii 1.0" << std::endl;
354 out <<
"comment Created by OpenSurgSim, www.opensurgsim.org" << std::endl;
355 out <<
"element vertex " << getNumVertices() << std::endl;
356 out <<
"property float x\nproperty float y\nproperty float z" << std::endl;
357 out <<
"element face " << getNumTriangles() << std::endl;
358 out <<
"property list uchar uint vertex_indices" << std::endl;
359 out <<
"end_header" << std::endl;
361 for (
const auto& vertex : getVertices())
363 out << vertex.position[0] <<
" " << vertex.position[1] <<
" " << vertex.position[2] << std::endl;
366 for (
const auto& tri : getTriangles())
368 out <<
"3 " << tri.verticesId[0] <<
" " << tri.verticesId[1] <<
" " << tri.verticesId[2] << std::endl;
374 <<
"There was a problem writing " << fileName;
382 <<
"Could not open " << fileName <<
" for writing.";
392 #endif // SURGSIM_DATASTRUCTURES_TRIANGLEMESH_INL_H Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
#define SURGSIM_LOG_WARNING(logger)
Logs a message to the specified logger at the WARNING level.
Definition: LogMacros.h:96
Definition: MockObjects.h:47
bool isValid() const
Test if the TriangleMesh is valid (valid vertex Ids used in all MeshElements)
Definition: TriangleMesh-inl.h:223
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
The convenience header that provides the entirety of the logging API.
Wrapper for the C .ply file parser This class wraps the main functionality for the original C ...
Definition: PlyReader.h:85
const std::vector< TriangleType > & getTriangles() const
Retrieve all triangles.
Definition: TriangleMesh-inl.h:137
void save(const std::string &fileName)
Save the triangle mesh in the ply format.
Definition: TriangleMesh-inl.h:346
TriangleMesh()
Constructor. The mesh is initially empty (no vertices, no edges, no triangles).
Definition: TriangleMesh-inl.h:28
void clear()
Clear mesh to return to an empty state (no vertices).
Definition: Vertices-inl.h:80
Basic class for storing Triangle Meshes, handling basic vertex, edge, and triangle functionality...
Definition: TriangleMesh.h:62
Element structure for meshes.
Definition: MeshElement.h:44
bool isValid() const
Query if this object is valid.
Definition: PlyReader.cpp:92
static std::shared_ptr< Logger > getDefaultLogger()
Get default logger.
Definition: Logger.h:116
const std::vector< EdgeType > & getEdges() const
Retrieve all edges.
Definition: TriangleMesh-inl.h:123
bool parseWithDelegate(std::shared_ptr< PlyReaderDelegate > delegate)
Sets a delegate for parsing and then parse the file.
Definition: PlyReader.cpp:336
Base class for mesh structures, handling basic vertex functionality.
Definition: Vertices.h:51
#define SURGSIM_LOG_SEVERE(logger)
Logs a message to the specified logger at the SEVERE level.
Definition: LogMacros.h:106
bool isValid
Is this a valid element.
Definition: MeshElement.h:84