1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // * Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // 14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of 15 // its contributors may be used to endorse or promote products derived 16 // from this software without specific prior written permission. 17 // 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 // POSSIBILITY OF SUCH DAMAGE. 29 // 30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de) 31 32 #ifndef COLMAP_SRC_UTIL_PLY_H_ 33 #define COLMAP_SRC_UTIL_PLY_H_ 34 35 #include <string> 36 #include <vector> 37 38 #include "types.h" 39 40 namespace colmap { 41 42 struct PlyPoint { 43 float x = 0.0f; 44 float y = 0.0f; 45 float z = 0.0f; 46 float nx = 0.0f; 47 float ny = 0.0f; 48 float nz = 0.0f; 49 uint8_t r = 0; 50 uint8_t g = 0; 51 uint8_t b = 0; 52 }; 53 54 struct PlyMeshVertex { PlyMeshVertexPlyMeshVertex55 PlyMeshVertex() : x(0), y(0), z(0) {} PlyMeshVertexPlyMeshVertex56 PlyMeshVertex(const float x, const float y, const float z) 57 : x(x), y(y), z(z) {} 58 59 float x = 0.0f; 60 float y = 0.0f; 61 float z = 0.0f; 62 }; 63 64 struct PlyMeshFace { PlyMeshFacePlyMeshFace65 PlyMeshFace() : vertex_idx1(0), vertex_idx2(0), vertex_idx3(0) {} PlyMeshFacePlyMeshFace66 PlyMeshFace(const size_t vertex_idx1, const size_t vertex_idx2, 67 const size_t vertex_idx3) 68 : vertex_idx1(vertex_idx1), 69 vertex_idx2(vertex_idx2), 70 vertex_idx3(vertex_idx3) {} 71 72 size_t vertex_idx1 = 0; 73 size_t vertex_idx2 = 0; 74 size_t vertex_idx3 = 0; 75 }; 76 77 struct PlyMesh { 78 std::vector<PlyMeshVertex> vertices; 79 std::vector<PlyMeshFace> faces; 80 }; 81 82 // Read PLY point cloud from text or binary file. 83 std::vector<PlyPoint> ReadPly(const std::string& path); 84 85 // Write PLY point cloud to text or binary file. 86 void WriteTextPlyPoints(const std::string& path, 87 const std::vector<PlyPoint>& points, 88 const bool write_normal = true, 89 const bool write_rgb = true); 90 void WriteBinaryPlyPoints(const std::string& path, 91 const std::vector<PlyPoint>& points, 92 const bool write_normal = true, 93 const bool write_rgb = true); 94 95 // Write PLY mesh to text or binary file. 96 void WriteTextPlyMesh(const std::string& path, const PlyMesh& mesh); 97 void WriteBinaryPlyMesh(const std::string& path, const PlyMesh& mesh); 98 99 } // namespace colmap 100 101 #endif // COLMAP_SRC_UTIL_PLY_H_ 102