23#ifndef VCL_IO_MESH_PLY_DETAIL_TRISTRIP_H
24#define VCL_IO_MESH_PLY_DETAIL_TRISTRIP_H
28#include <vclib/io/read.h>
32namespace vcl::detail {
34template<FaceMeshConcept MeshType>
35void facesFromPlyTriStrip(MeshType& m,
const std::vector<int>& tristrip)
37 using FaceType = MeshType::FaceType;
39 bool firstOddPos =
false;
40 for (uint k = 0; k < tristrip.size() - 2; ++k) {
41 if (tristrip[k + 2] < 0) {
49 uint fid = m.addFace();
50 FaceType& f = m.face(fid);
51 if constexpr (FaceType::VERTEX_NUMBER < 0) {
54 for (uint i = 0; i < f.vertexNumber(); ++i) {
55 f.setVertex(i, tristrip[k + i]);
58 if (k % 2 == 0 != firstOddPos) {
59 auto* tmp = f.vertex(0);
60 f.setVertex(0U, f.vertex(1));
67template<FaceMeshConcept MeshType, LoggerConcept LogType>
68void readPlyTriStripsTxt(
70 const PlyHeader& header,
74 log.startProgress(
"Reading Triangle Strips", header.numberTriStrips());
76 for (uint tid = 0; tid < header.numberTriStrips(); ++tid) {
77 Tokenizer spaceTokenizer = readAndTokenizeNextNonEmptyLine(file);
78 Tokenizer::iterator token = spaceTokenizer.begin();
79 for (
const PlyProperty& p : header.triStripsProperties()) {
80 if (token == spaceTokenizer.end()) {
81 throw MalformedFileException(
"Unexpected end of line.");
83 bool hasBeenRead =
false;
84 if (p.name == ply::vertex_indices) {
85 uint tSize = io::readPrimitiveType<uint>(token, p.listSizeType);
86 std::vector<int> tristrip(tSize);
87 for (uint i = 0; i < tSize; ++i) {
88 tristrip[i] = io::readPrimitiveType<size_t>(token, p.type);
91 facesFromPlyTriStrip(m, tristrip);
95 uint s = io::readPrimitiveType<int>(token, p.listSizeType);
96 for (uint i = 0; i < s; ++i) {
110template<FaceMeshConcept MeshType, LoggerConcept LogType>
111void readPlyTriStripsBin(
113 const PlyHeader& header,
118 log.startProgress(
"Reading Triangle Strips", header.numberTriStrips());
119 for (uint tid = 0; tid < header.numberTriStrips(); ++tid) {
120 for (
const PlyProperty& p : header.triStripsProperties()) {
121 bool hasBeenRead =
false;
122 if (p.name == ply::vertex_indices) {
124 io::readPrimitiveType<uint>(file, p.listSizeType, end);
125 std::vector<int> tristrip(tSize);
126 for (uint i = 0; i < tSize; ++i)
127 tristrip[i] = io::readPrimitiveType<int>(file, p.type, end);
129 facesFromPlyTriStrip(m, tristrip);
134 io::readPrimitiveType<int>(file, p.listSizeType, end);
135 for (uint i = 0; i < s; ++i)
136 io::readPrimitiveType<int>(file, p.type, end);
139 io::readPrimitiveType<int>(file, p.type, end);
148template<FaceMeshConcept MeshType, LoggerConcept LogType>
149void readPlyTriStrips(
151 const PlyHeader& header,
155 if (header.format() == ply::ASCII) {
156 detail::readPlyTriStripsTxt(file, header, mesh, log);
159 std::endian end = header.format() == ply::BINARY_BIG_ENDIAN ?
162 detail::readPlyTriStripsBin(file, header, mesh, end, log);