23#ifndef VCL_IO_MESH_PLY_LOAD_H
24#define VCL_IO_MESH_PLY_LOAD_H
26#include "detail/edge.h"
27#include "detail/extra.h"
28#include "detail/face.h"
29#include "detail/tristrip.h"
30#include "detail/vertex.h"
32#include <vclib/io/mesh/settings.h>
34#include <vclib/space/complex.h>
40template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
44 const std::string& filename,
46 const LoadSettings& settings = LoadSettings(),
49 PlyHeader header(file, filename);
50 if (header.errorWhileLoading())
51 throw MalformedFileException(
"Header not valid: " + filename);
55 loadedInfo = header.getInfo();
57 if (settings.enableOptionalComponents)
58 enableOptionalComponentsFromInfo(loadedInfo, m);
60 if constexpr (HasName<MeshType>) {
63 if constexpr (HasTexturePaths<MeshType>) {
68 std::vector<uint> eln;
70 for (
const PlyElement& el : header) {
71 eln.push_back(el.numberElements);
72 sum += el.numberElements;
78 for (
const PlyElement& el : header) {
79 double beginPerc = double(currElems) / sum * 100.0;
80 double endPerc = double(currElems + eln[i]) / sum * 100.0;
84 log.startNewTask(beginPerc, endPerc,
"Reading vertices");
85 readPlyVertices(file, header, m, log);
86 log.endTask(
"Reading vertices");
89 log.startNewTask(beginPerc, endPerc,
"Reading faces");
90 if constexpr (HasFaces<MeshType>)
91 readPlyFaces(file, header, m, loadedInfo, log);
93 readPlyUnknownElement(file, header, el, log);
94 log.endTask(
"Reading faces");
97 log.startNewTask(beginPerc, endPerc,
"Reading tristrips");
98 if constexpr (HasFaces<MeshType>) {
99 loadedInfo.setTriangleMesh();
100 readPlyTriStrips(file, header, m, log);
103 readPlyUnknownElement(file, header, el, log);
104 log.endTask(
"Reading tristrips");
107 log.startNewTask(beginPerc, endPerc,
"Reading edges");
108 if constexpr (HasEdges<MeshType>)
109 readPlyEdges(file, header, m, log);
111 readPlyUnknownElement(file, header, el, log);
112 log.endTask(
"Reading edges");
116 beginPerc, endPerc,
"Reading unknown elements");
117 readPlyUnknownElement(file, header, el, log);
118 log.endTask(
"Reading unknown elements");
124 readPlyTextures(header, m, log, settings);
126 catch (
const std::runtime_error& err) {
158template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
192template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
A class representing a box in N-dimensional space.
Definition box.h:46
static std::string fileNameWithoutExtension(const std::string &fullpath)
Get the file name without extension of a file.
Definition file_info.h:220
static std::string pathWithoutFileName(const std::string &fullpath)
Get the path of a file.
Definition file_info.h:200
A simple class that allows to store which elements and their components have been imported/loaded or ...
Definition mesh_info.h:76
NullLogger nullLogger
The nullLogger object is an object of type NullLogger that is used as default argument in the functio...
Definition null_logger.h:123
void loadPly(MeshType &m, std::istream &inputPlyStream, MeshInfo &loadedInfo, const LoadSettings &settings=LoadSettings(), LogType &log=nullLogger)
Loads from the given input ply stream and puts the content into the mesh m.
Definition load.h:159
The LoadSettings structure contains the settings that can be used to load a mesh from a stream/file.
Definition settings.h:35