Visual Computing Library  devel
Loading...
Searching...
No Matches
load.h
1/*****************************************************************************
2 * VCLib *
3 * Visual Computing Library *
4 * *
5 * Copyright(C) 2021-2026 *
6 * Visual Computing Lab *
7 * ISTI - Italian National Research Council *
8 * *
9 * All rights reserved. *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the Mozilla Public License Version 2.0 as published *
13 * by the Mozilla Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * Mozilla Public License Version 2.0 *
20 * (https://www.mozilla.org/en-US/MPL/2.0/) for more details. *
21 ****************************************************************************/
22
23#ifndef VCL_IO_MESH_PLY_LOAD_H
24#define VCL_IO_MESH_PLY_LOAD_H
25
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"
32
33#include <vclib/io/mesh/settings.h>
34
35#include <vclib/space/complex.h>
36
37namespace vcl {
38
39namespace detail {
40
41template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
42void loadPly(
43 MeshType& m,
44 std::istream& file,
45 const std::string& filename,
46 MeshInfo& loadedInfo,
47 const LoadSettings& settings = LoadSettings(),
48 LogType& log = nullLogger)
49{
50 PlyHeader header(file, filename);
51 if (header.errorWhileLoading())
52 throw MalformedFileException("Header not valid: " + filename);
53
54 m.clear();
55
56 loadedInfo = header.getInfo();
57
58 if (settings.enableOptionalComponents)
59 enableOptionalComponentsFromInfo(loadedInfo, m);
60
61 if constexpr (HasName<MeshType>) {
62 m.name() = FileInfo::fileNameWithoutExtension(filename);
63 }
64 if constexpr (HasMaterials<MeshType>) {
65 m.meshBasePath() = FileInfo::pathWithoutFileName(filename);
66 }
67
68 // for logging
69 std::vector<uint> eln;
70 uint sum = 0;
71 for (const PlyElement& el : header) {
72 eln.push_back(el.elementCount);
73 sum += el.elementCount;
74 }
75
76 try {
77 uint currElems = 0;
78 uint i = 0;
79 for (const PlyElement& el : header) {
80 double beginPerc = double(currElems) / sum * 100.0;
81 double endPerc = double(currElems + eln[i]) / sum * 100.0;
82
83 switch (el.type) {
84 case ply::VERTEX:
85 log.startNewTask(beginPerc, endPerc, "Reading vertices");
86 readPlyVertices(file, header, m, log);
87 log.endTask("Reading vertices");
88 break;
89 case ply::FACE:
90 log.startNewTask(beginPerc, endPerc, "Reading faces");
91 if constexpr (HasFaces<MeshType>)
92 readPlyFaces(file, header, m, loadedInfo, log);
93 else
94 readPlyUnknownElement(file, header, el, log);
95 log.endTask("Reading faces");
96 break;
97 case ply::TRISTRIP:
98 log.startNewTask(beginPerc, endPerc, "Reading tristrips");
99 if constexpr (HasFaces<MeshType>) {
100 loadedInfo.setTriangleMesh();
101 readPlyTriStrips(file, header, m, log);
102 }
103 else
104 readPlyUnknownElement(file, header, el, log);
105 log.endTask("Reading tristrips");
106 break;
107 case ply::EDGE:
108 log.startNewTask(beginPerc, endPerc, "Reading edges");
109 if constexpr (HasEdges<MeshType>)
110 readPlyEdges(file, header, m, log);
111 else
112 readPlyUnknownElement(file, header, el, log);
113 log.endTask("Reading edges");
114 break;
115 case ply::MATERIAL:
116 log.startNewTask(beginPerc, endPerc, "Reading materials");
117 if constexpr (HasMaterials<MeshType>)
118 readPlyMaterials(file, header, m, log);
119 else
120 readPlyUnknownElement(file, header, el, log);
121 log.endTask("Reading materials");
122 break;
123 default:
124 log.startNewTask(
125 beginPerc, endPerc, "Reading unknown elements");
126 readPlyUnknownElement(file, header, el, log);
127 log.endTask("Reading unknown elements");
128 break;
129 }
130 currElems += eln[i];
131 ++i;
132 }
133
134 if constexpr (HasMaterials<MeshType>) {
135 if (!header.hasMaterials()) {
136 addMaterialsFromHeaderTextures(header, m, log);
137 readPlyMaterialIndexPostProcessing(m, loadedInfo, settings);
138 }
139 if (settings.loadTextureImages) {
140 loadTextureImages(m, m.meshBasePath(), BitSet8::ALL(), log);
141 }
142 }
143 }
144 catch (const std::runtime_error& err) {
145 m.clear();
146 throw err;
147 }
148}
149
150} // namespace detail
151
176template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
178 MeshType& m,
179 std::istream& inputPlyStream,
181 const LoadSettings& settings = LoadSettings(),
182 LogType& log = nullLogger)
183{
184 detail::loadPly(m, inputPlyStream, "", loadedInfo, settings, log);
185}
186
210template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
212 MeshType& m,
213 const std::string& filename,
215 const LoadSettings& settings = LoadSettings(),
216 LogType& log = nullLogger)
217{
218 std::ifstream file = openInputFileStream(filename);
219
220 detail::loadPly(m, file, filename, loadedInfo, settings, log);
221}
222
223} // namespace vcl
224
225#endif // VCL_IO_MESH_PLY_LOAD_H
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