14#include <lagrange/io/load_mesh.h>
16#include <lagrange/Mesh.h>
17#include <lagrange/MeshTrait.h>
18#include <lagrange/combine_mesh_list.h>
19#include <lagrange/create_mesh.h>
20#include <lagrange/fs/file_utils.h>
21#include <lagrange/io/legacy/load_mesh_ext.h>
22#include <lagrange/io/legacy/load_mesh_ply.h>
23#include <lagrange/legacy/inline.h>
26#include <lagrange/utils/warnoff.h>
27#include <igl/read_triangle_mesh.h>
28#include <lagrange/utils/warnon.h>
31#include <tiny_obj_loader.h>
37template <
typename MeshType>
38std::unique_ptr<MeshType> load_mesh_basic(
const fs::path& filename)
40 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
41 typename MeshType::VertexArray vertices;
42 typename MeshType::FacetArray facets;
44 igl::read_triangle_mesh(filename.string(), vertices, facets);
48extern template std::unique_ptr<lagrange::TriangleMesh3D> load_mesh_basic(
const fs::path&);
49extern template std::unique_ptr<lagrange::TriangleMesh3Df> load_mesh_basic(
const fs::path&);
51template <
typename MeshType>
52std::vector<std::unique_ptr<MeshType>> load_obj_meshes(
const fs::path& filename)
54 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
56 if (!std::is_same<tinyobj::real_t, double>::value) {
57 logger().warn(
"Tinyobjloader compiled to use float, loss of precision may occur.");
60 return load_mesh_ext<MeshType>(filename).meshes;
62extern template std::vector<std::unique_ptr<lagrange::TriangleMesh3D>> load_obj_meshes(
const fs::path&);
63extern template std::vector<std::unique_ptr<lagrange::TriangleMesh3Df>> load_obj_meshes(
const fs::path&);
65template <
typename MeshType>
66std::unique_ptr<MeshType> load_obj_mesh(
const fs::path& filename)
68 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
70 auto res = load_obj_meshes<MeshType>(filename);
73 }
else if (res.size() == 1) {
74 return std::move(res[0]);
76 logger().debug(
"Combining {} meshes into one.", res.size());
77 return combine_mesh_list(res,
true);
80extern template std::unique_ptr<lagrange::TriangleMesh3D> load_obj_mesh(
const fs::path&);
81extern template std::unique_ptr<lagrange::TriangleMesh3Df> load_obj_mesh(
const fs::path&);
85 std::enable_if_t<lagrange::MeshTraitHelper::is_mesh<MeshType>::value>* >
86std::unique_ptr<MeshType>
load_mesh(
const fs::path& filename)
88 static_assert(MeshTrait<MeshType>::is_mesh(),
"Input type is not Mesh");
90 if (filename.extension() ==
".obj") {
91 return load_obj_mesh<MeshType>(filename);
92 }
else if (filename.extension() ==
".ply") {
93 return load_mesh_ply<MeshType>(filename);
95 return load_mesh_basic<MeshType>(filename);
98extern template std::unique_ptr<lagrange::TriangleMesh3D>
load_mesh(
const fs::path&);
99extern template std::unique_ptr<lagrange::TriangleMesh3Df>
load_mesh(
const fs::path&);
LA_CORE_API spdlog::logger & logger()
Retrieves the current logger.
Definition: Logger.cpp:40
Mesh input/output.
Definition: detect_file_format.h:18
MeshType load_mesh(std::istream &input_stream, const LoadOptions &options={})
Load a mesh from a stream.
Definition: load_mesh.cpp:37
auto create_mesh(const Eigen::MatrixBase< DerivedV > &vertices, const Eigen::MatrixBase< DerivedF > &facets)
This function create a new mesh given the vertex and facet arrays by copying data into the Mesh objec...
Definition: create_mesh.h:39