gtsam_points
Loading...
Searching...
No Matches
ply_io.hpp
Go to the documentation of this file.
1#ifndef GLK_PLY_IO_HPP
2#define GLK_PLY_IO_HPP
3
4#include <memory>
5#include <vector>
6#include <Eigen/Core>
7
8namespace glk {
9
12
16template <typename T>
18
22
23 std::string format; // PLY format (ascii or binary_big_endian).
24 std::vector<std::string> comments; // Comments.
25
26 int num_vertices; // Number of vertices.
27 int num_faces; // Number of faces.
28 std::vector<std::pair<std::string, PLYPropertyType>> vertex_properties; // Property names and types.
29 std::vector<PLYPropertyType> face_properties; // Face property types
30};
31
34public:
35 using Ptr = std::shared_ptr<PLYGenericPropertyBuffer>;
36 using ConstPtr = std::shared_ptr<const PLYGenericPropertyBuffer>;
37
38 PLYGenericPropertyBuffer(const std::string& name) : name(name) {}
39 virtual ~PLYGenericPropertyBuffer() = default;
40
41 virtual std::shared_ptr<PLYGenericPropertyBuffer> clone() const = 0;
42
43 virtual PLYPropertyType type() const = 0;
44
46 virtual size_t size() const = 0;
47
49 virtual void* get() = 0;
50
51 template <typename T>
52 T* get() {
53 return static_cast<T*>(get());
54 }
55
56 virtual void read_from_buffer(char* buffer, int offset, size_t index) = 0;
57 virtual void read_from_stream(std::istream& is, int offset, size_t index) = 0;
58
59 virtual void write_to_buffer(char* buffer, int offset, size_t index) const = 0;
60 virtual void write_to_stream(std::ostream& os, int offset, size_t index) const = 0;
61
62public:
63 const std::string name;
64};
65
67template <typename T>
69public:
70 PLYPropertyBuffer(const std::string& name, size_t size) : PLYGenericPropertyBuffer(name), data(size) {}
71 PLYPropertyBuffer(const std::string& name, const T* data, size_t size) : PLYGenericPropertyBuffer(name), data(data, data + size) {}
72
73 std::shared_ptr<PLYGenericPropertyBuffer> clone() const override { return std::make_shared<PLYPropertyBuffer<T>>(name, data.data(), data.size()); }
74
75 PLYPropertyType type() const override { return ply_prop_type<T>(); }
76
77 size_t size() const override { return data.size(); }
78
79 void* get() override { return data.data(); }
80
81 void read_from_buffer(char* buffer, int offset, size_t index) override { data[index] = *reinterpret_cast<T*>(buffer + offset); }
82
83 void read_from_stream(std::istream& is, int offset, size_t index) override {
84 if constexpr (std::is_integral_v<T>) {
85 int value;
86 is >> value;
87 data[index] = value;
88 } else {
89 is >> data[index];
90 }
91 }
92
93 void write_to_buffer(char* buffer, int offset, size_t index) const override { *reinterpret_cast<T*>(buffer + offset) = data[index]; }
94
95 void write_to_stream(std::ostream& os, int offset, size_t index) const override {
96 if (offset) {
97 os << " ";
98 }
99 if constexpr (std::is_integral_v<T>) {
101 } else {
102 os << data[index];
103 }
104 }
105
106public:
107 std::vector<T> data;
108}; // namespace
109
114struct PLYData {
115public:
116 template <typename T>
117 void add_prop(const std::string& name, const T* data, size_t size) {
118 properties.emplace_back(std::make_shared<PLYPropertyBuffer<T>>(name, data, size));
119 }
120
121public:
122 std::vector<Eigen::Vector3f> vertices; // Vertex positions (saved as "x", "y", "z" properties).
123 std::vector<Eigen::Vector3f> normals; // Vertex normals (saved as "nx", "ny", "nz" properties).
124 std::vector<float> intensities; // Intensity values (saved as "intensity" property).
125 std::vector<Eigen::Vector4f> colors; // RGBA colors (saved as "r", "g", "b", "a" properties).
126 std::vector<int> indices;
127
128 std::vector<std::string> comments;
129 std::vector<PLYGenericPropertyBuffer::Ptr> properties;
130};
131
135std::shared_ptr<PLYData> load_ply(const std::string& filename);
136
142bool save_ply(const std::string& filename, const PLYData& ply, bool binary = true);
143bool save_ply_ascii(const std::string& filename, const PLYData& ply);
144bool save_ply_binary(const std::string& filename, const PLYData& ply);
145
146template <typename T, int D>
147bool save_ply_binary(const std::string& filename, const Eigen::Matrix<T, D, 1>* points, int num_points);
148
149} // namespace glk
150
151#endif
Definition async_buffer_copy.hpp:6
bool save_ply_binary(const std::string &filename, const PLYData &ply)
bool save_ply_ascii(const std::string &filename, const PLYData &ply)
bool save_ply(const std::string &filename, const PLYData &ply, bool binary=true)
Save a PLY file.
std::enable_if_t< needs_aligned_allocator< T >::value, std::shared_ptr< T > > make_shared(Args &&... args)
Definition make_shared.hpp:20
std::shared_ptr< PLYData > load_ply(const std::string &filename)
Load a PLY file.
PLYPropertyType
PLY property type.
Definition ply_io.hpp:11
PLYPropertyType ply_prop_type()
Get the PLY property type for a specific type.
PLY data.
Definition ply_io.hpp:114
std::vector< Eigen::Vector4f > colors
Definition ply_io.hpp:125
std::vector< int > indices
Definition ply_io.hpp:126
std::vector< Eigen::Vector3f > vertices
Definition ply_io.hpp:122
std::vector< Eigen::Vector3f > normals
Definition ply_io.hpp:123
std::vector< PLYGenericPropertyBuffer::Ptr > properties
Definition ply_io.hpp:129
std::vector< float > intensities
Definition ply_io.hpp:124
void add_prop(const std::string &name, const T *data, size_t size)
Definition ply_io.hpp:117
std::vector< std::string > comments
Definition ply_io.hpp:128
PLY property buffer.
Definition ply_io.hpp:33
virtual void write_to_stream(std::ostream &os, int offset, size_t index) const =0
PLYGenericPropertyBuffer(const std::string &name)
Definition ply_io.hpp:38
const std::string name
Definition ply_io.hpp:63
virtual void read_from_stream(std::istream &is, int offset, size_t index)=0
T * get()
Definition ply_io.hpp:52
virtual std::shared_ptr< PLYGenericPropertyBuffer > clone() const =0
virtual void read_from_buffer(char *buffer, int offset, size_t index)=0
std::shared_ptr< PLYGenericPropertyBuffer > Ptr
Definition ply_io.hpp:35
virtual PLYPropertyType type() const =0
virtual ~PLYGenericPropertyBuffer()=default
virtual void * get()=0
Get the raw pointer to the data.
virtual void write_to_buffer(char *buffer, int offset, size_t index) const =0
std::shared_ptr< const PLYGenericPropertyBuffer > ConstPtr
Definition ply_io.hpp:36
virtual size_t size() const =0
Get the number of elements.
PLY file metadata.
Definition ply_io.hpp:20
int num_faces
Definition ply_io.hpp:27
int num_vertices
Definition ply_io.hpp:26
std::vector< std::string > comments
Definition ply_io.hpp:24
std::string format
Definition ply_io.hpp:23
std::vector< PLYPropertyType > face_properties
Definition ply_io.hpp:29
std::vector< std::pair< std::string, PLYPropertyType > > vertex_properties
Definition ply_io.hpp:28
PLYMetaData()
Definition ply_io.hpp:21
PLY property buffer for a specific type.
Definition ply_io.hpp:68
void read_from_stream(std::istream &is, int offset, size_t index) override
Definition ply_io.hpp:83
PLYPropertyType type() const override
Definition ply_io.hpp:75
PLYPropertyBuffer(const std::string &name, size_t size)
Definition ply_io.hpp:70
void write_to_stream(std::ostream &os, int offset, size_t index) const override
Definition ply_io.hpp:95
std::shared_ptr< PLYGenericPropertyBuffer > clone() const override
Definition ply_io.hpp:73
void write_to_buffer(char *buffer, int offset, size_t index) const override
Definition ply_io.hpp:93
void read_from_buffer(char *buffer, int offset, size_t index) override
Definition ply_io.hpp:81
PLYPropertyBuffer(const std::string &name, const T *data, size_t size)
Definition ply_io.hpp:71
void * get() override
Get the raw pointer to the data.
Definition ply_io.hpp:79
size_t size() const override
Get the number of elements.
Definition ply_io.hpp:77
std::vector< T > data
Definition ply_io.hpp:107