28 throw std::invalid_argument(
"No filename given");
31 std::fstream input(filename.c_str());
37 bool parse_normals =
false;
45 else if (buffer !=
"OFF")
58 std::size_t num_vertices = 0;
59 std::size_t num_faces = 0;
60 std::size_t num_edges = 0;
63 input >> num_vertices >> num_faces >> num_edges;
65 vertices.reserve(num_vertices);
66 faces.reserve(num_faces * 3);
67 vertex_normals.reserve(num_vertices);
70 for (std::size_t i = 0; i < num_vertices; ++i)
85 for (std::size_t i = 0; i < num_faces; ++i)
87 std::size_t n_vertices;
94 bool indices_good =
true;
95 for (
int j = 0; j < 3; ++j)
98 if (vidx[j] >= num_vertices)
100 std::cout <<
"OFF Loader: Warning: Face " << i
101 <<
" has invalid vertex " << vidx[j]
102 <<
", skipping face." << std::endl;
103 indices_good =
false;
108 for (
int j = 0; j < 3; ++j)
109 faces.push_back(vidx[j]);
111 else if (n_vertices == 4)
114 unsigned int vidx[4];
115 bool indices_good =
true;
116 for (
int j = 0; j < 4; ++j)
119 if (vidx[j] >= num_vertices)
121 std::cout <<
"OFF Loader: Warning: Face " << i
122 <<
" has invalid vertex " << vidx[j]
123 <<
", skipping face." << std::endl;
124 indices_good =
false;
130 for (
int j = 0; j < 3; ++j)
131 faces.push_back(vidx[j]);
132 for (
int j = 0; j < 3; ++j)
133 faces.push_back(vidx[(j + 2) % 4]);
138 std::cout <<
"Warning: Line " << (2 + num_vertices + i)
139 <<
": Polygon with " << n_vertices <<
"vertices, "
140 <<
"Skipping face!" << std::endl;
142 for (std::size_t j = 0; j < n_vertices; ++j)
162 throw std::invalid_argument(
"Null mesh given");
163 if (filename.empty())
164 throw std::invalid_argument(
"No filename given");
167 std::ofstream out(filename.c_str(), std::ios::binary);
173 std::size_t num_verts = vertices.size();
174 std::size_t num_faces = faces.size() / 3;
177 out <<
"OFF" << std::endl;
180 out << num_verts <<
" " << num_faces <<
" 0" << std::endl;
183 out << std::fixed << std::setprecision(7);
186 for (std::size_t i = 0; i < num_verts; ++i)
188 out << vertices[i][0] <<
" " << vertices[i][1]
189 <<
" " << vertices[i][2] << std::endl;
193 for (std::size_t i = 0; i < num_faces * 3; i += 3)
195 out <<
"3 " << faces[i + 0] <<
" "
196 << faces[i + 1] <<
" " << faces[i + 2] << std::endl;