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/material.h"
30#include "detail/tristrip.h"
31#include "detail/vertex.h"
33#include <vclib/io/mesh/settings.h>
35#include <vclib/space/complex.h>
41template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
45 const std::string& filename,
47 const LoadSettings& settings = LoadSettings(),
50 PlyHeader header(file, filename);
51 if (header.errorWhileLoading())
52 throw MalformedFileException(
"Header not valid: " + filename);
56 loadedInfo = header.getInfo();
58 if (settings.enableOptionalComponents)
59 enableOptionalComponentsFromInfo(loadedInfo, m);
61 if constexpr (HasName<MeshType>) {
64 if constexpr (HasMaterials<MeshType>) {
69 std::vector<uint> eln;
71 for (
const PlyElement& el : header) {
72 eln.push_back(el.elementCount);
73 sum += el.elementCount;
79 for (
const PlyElement& el : header) {
80 double beginPerc = double(currElems) / sum * 100.0;
81 double endPerc = double(currElems + eln[i]) / sum * 100.0;
85 log.startNewTask(beginPerc, endPerc,
"Reading vertices");
86 readPlyVertices(file, header, m, log);
87 log.endTask(
"Reading vertices");
90 log.startNewTask(beginPerc, endPerc,
"Reading faces");
91 if constexpr (HasFaces<MeshType>)
92 readPlyFaces(file, header, m, loadedInfo, log);
94 readPlyUnknownElement(file, header, el, log);
95 log.endTask(
"Reading faces");
98 log.startNewTask(beginPerc, endPerc,
"Reading tristrips");
99 if constexpr (HasFaces<MeshType>) {
100 loadedInfo.setTriangleMesh();
101 readPlyTriStrips(file, header, m, log);
104 readPlyUnknownElement(file, header, el, log);
105 log.endTask(
"Reading tristrips");
108 log.startNewTask(beginPerc, endPerc,
"Reading edges");
109 if constexpr (HasEdges<MeshType>)
110 readPlyEdges(file, header, m, log);
112 readPlyUnknownElement(file, header, el, log);
113 log.endTask(
"Reading edges");
116 log.startNewTask(beginPerc, endPerc,
"Reading materials");
117 if constexpr (HasMaterials<MeshType>)
118 readPlyMaterials(file, header, m, log);
120 readPlyUnknownElement(file, header, el, log);
121 log.endTask(
"Reading materials");
125 beginPerc, endPerc,
"Reading unknown elements");
126 readPlyUnknownElement(file, header, el, log);
127 log.endTask(
"Reading unknown elements");
134 if constexpr (HasMaterials<MeshType>) {
135 if (!header.hasMaterials()) {
136 addMaterialsFromHeaderTextures(header, m, log);
137 readPlyMaterialIndexPostProcessing(m, loadedInfo, settings);
139 if (settings.loadTextureImages) {
140 loadTextureImages(m, m.meshBasePath(),
BitSet8::ALL(), log);
144 catch (
const std::runtime_error& err) {
176template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
210template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
static constexpr BitSet< T > ALL()
Returns a BitSet with all the bits set to true.
Definition bit_set.h:366
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
A class representing a line segment in n-dimensional space. The class is parameterized by a PointConc...
Definition segment.h:41
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:177
The LoadSettings structure contains the settings that can be used to load a mesh from a stream/file.
Definition settings.h:35