2020-11-27 11:47:21 +01:00
|
|
|
#ifndef VCGTRIMESH_HPP
|
|
|
|
#define VCGTRIMESH_HPP
|
|
|
|
#include <vcg/complex/complex.h>
|
2021-06-12 11:18:55 +02:00
|
|
|
#include <optional>
|
2022-09-14 13:04:05 +02:00
|
|
|
#include "mesh.hpp"
|
2020-11-27 11:47:21 +01:00
|
|
|
|
2021-04-30 12:13:58 +02:00
|
|
|
#ifdef POLYSCOPE_DEFINED
|
|
|
|
#include <polyscope/surface_mesh.h>
|
|
|
|
#endif
|
2020-11-27 11:47:21 +01:00
|
|
|
using VertexIndex = size_t;
|
|
|
|
class VCGTriMeshVertex;
|
|
|
|
class VCGTriMeshEdge;
|
|
|
|
class VCGTriMeshFace;
|
|
|
|
struct VCGTriMeshUsedTypes
|
|
|
|
: public vcg::UsedTypes<vcg::Use<VCGTriMeshVertex>::AsVertexType,
|
|
|
|
vcg::Use<VCGTriMeshEdge>::AsEdgeType,
|
|
|
|
vcg::Use<VCGTriMeshFace>::AsFaceType> {};
|
2021-04-08 20:03:23 +02:00
|
|
|
class VCGTriMeshVertex : public vcg::Vertex<VCGTriMeshUsedTypes,
|
|
|
|
vcg::vertex::Coord3d,
|
|
|
|
vcg::vertex::Normal3d,
|
|
|
|
vcg::vertex::BitFlags,
|
|
|
|
vcg::vertex::Color4b,
|
|
|
|
vcg::vertex::VFAdj,
|
2021-06-24 09:02:20 +02:00
|
|
|
vcg::vertex::Qualityd,
|
2022-09-14 13:04:05 +02:00
|
|
|
vcg::vertex::VEAdj> {};
|
|
|
|
class VCGTriMeshFace : public vcg::Face<VCGTriMeshUsedTypes,
|
|
|
|
vcg::face::FFAdj,
|
|
|
|
vcg::face::VFAdj,
|
|
|
|
vcg::face::VertexRef,
|
|
|
|
vcg::face::BitFlags,
|
|
|
|
vcg::face::Normal3d> {};
|
|
|
|
class VCGTriMeshEdge : public vcg::Edge<VCGTriMeshUsedTypes,
|
|
|
|
vcg::edge::VertexRef,
|
|
|
|
vcg::edge::VEAdj> {};
|
2020-11-27 11:47:21 +01:00
|
|
|
|
|
|
|
class VCGTriMesh : public vcg::tri::TriMesh<std::vector<VCGTriMeshVertex>,
|
|
|
|
std::vector<VCGTriMeshFace>,
|
2021-04-08 20:03:23 +02:00
|
|
|
std::vector<VCGTriMeshEdge>>,
|
2022-09-14 13:04:05 +02:00
|
|
|
public Mesh {
|
|
|
|
public:
|
2020-11-27 11:47:21 +01:00
|
|
|
VCGTriMesh();
|
2022-09-14 13:04:05 +02:00
|
|
|
VCGTriMesh(const std::string& filename);
|
|
|
|
bool load(const std::filesystem::path& meshFilePath) override;
|
|
|
|
bool load(std::istringstream& offInputStream);
|
2020-11-27 11:47:21 +01:00
|
|
|
Eigen::MatrixX3d getVertices() const;
|
|
|
|
Eigen::MatrixX3i getFaces() const;
|
2021-04-08 20:03:23 +02:00
|
|
|
bool save(const std::string plyFilename);
|
2022-09-14 13:04:05 +02:00
|
|
|
template <typename MeshElement>
|
|
|
|
size_t getIndex(const MeshElement& element) {
|
2020-11-27 11:47:21 +01:00
|
|
|
return vcg::tri::Index<VCGTriMesh>(*this, element);
|
|
|
|
}
|
2021-04-08 20:03:23 +02:00
|
|
|
|
|
|
|
#ifdef POLYSCOPE_DEFINED
|
2022-09-14 13:04:05 +02:00
|
|
|
polyscope::SurfaceMesh* registerForDrawing(
|
|
|
|
const std::optional<std::array<float, 3>>& desiredColor = std::nullopt,
|
|
|
|
const bool& shouldEnable = true) const;
|
2021-04-08 20:03:23 +02:00
|
|
|
#endif
|
|
|
|
Eigen::MatrixX2i getEdges() const;
|
2021-06-24 09:02:20 +02:00
|
|
|
void updateEigenEdgeAndVertices();
|
2021-11-15 10:08:39 +01:00
|
|
|
void moveToCenter();
|
2020-11-27 11:47:21 +01:00
|
|
|
};
|
|
|
|
|
2022-09-14 13:04:05 +02:00
|
|
|
#endif // VCGTRIMESH_HPP
|