23#ifndef VCL_LOAD_SAVE_PLY_SAVE_H
24#define VCL_LOAD_SAVE_PLY_SAVE_H
26#include "detail/edge.h"
27#include "detail/extra.h"
28#include "detail/face.h"
29#include "detail/vertex.h"
31#include <vclib/exceptions/io.h>
32#include <vclib/load_save/settings.h>
33#include <vclib/misc/logger.h>
37template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
42 const SaveSettings& settings = SaveSettings())
44 using namespace detail;
51 if (!settings.info.isEmpty())
52 meshInfo = settings.info.intersect(meshInfo);
55 settings.binary ? ply::BINARY_LITTLE_ENDIAN : ply::ASCII, meshInfo);
56 header.setNumberVertices(m.vertexNumber());
58 if constexpr (HasFaces<MeshType>) {
59 if (header.hasFaces()) {
60 header.setNumberFaces(m.faceNumber());
63 if constexpr (HasEdges<MeshType>) {
64 if (header.hasEdges()) {
65 header.setNumberEdges(m.edgeNumber());
68 writePlyTextures(header, m, log, settings);
71 if (!header.isValid())
72 throw std::runtime_error(
"Ply Header not valid.");
74 fp << header.toString();
76 writePlyVertices(fp, header, m);
78 if constexpr (HasFaces<MeshType>) {
79 if (header.hasFaces()) {
80 writePlyFaces(fp, header, m);
84 if constexpr (HasEdges<MeshType>) {
85 if (header.hasEdges()) {
86 writePlyEdges(fp, header, m);
91template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
95 const SaveSettings& settings,
98 savePly(m, fp, log, settings);
101template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
104 const std::string& filename,
106 const SaveSettings& settings = SaveSettings())
108 std::ofstream fp = openOutputFileStream(filename,
"ply");
110 savePly(m, fp, log, settings);
113template<MeshConcept MeshType, LoggerConcept LogType = NullLogger>
116 const std::string& filename,
117 const SaveSettings& settings,
120 savePly(m, filename, log, settings);
NullLogger nullLogger
The nullLogger object is an object of type NullLogger that is used as default argument in the functio...
Definition null_logger.h:125