| 38 | } |
| 39 | |
| 40 | void write_faces(std::ofstream& fout, |
| 41 | const VectorI& faces, |
| 42 | const size_t vertex_per_face, |
| 43 | const VectorI& uv_indices=VectorI::Zero(0)) { |
| 44 | if (vertex_per_face != 3 && vertex_per_face != 4) { |
| 45 | std::stringstream err_msg; |
| 46 | err_msg << "OBJ format does not support non-triangle non-quad face with " |
| 47 | << vertex_per_face << " vertices." << std::endl; |
| 48 | throw RuntimeError(err_msg.str()); |
| 49 | } |
| 50 | const size_t num_faces = faces.size() / vertex_per_face; |
| 51 | const size_t num_uvs = uv_indices.size() / 2; |
| 52 | if (num_uvs == 0) { |
| 53 | for (size_t i=0; i<num_faces; i++) { |
| 54 | const auto& f = faces.segment(i*vertex_per_face, vertex_per_face); |
| 55 | fout << "f"; |
| 56 | for (size_t j=0; j<vertex_per_face; j++) { |
| 57 | fout << " " << f[j] + 1; |
| 58 | } |
| 59 | fout << std::endl; |
| 60 | } |
| 61 | } else { |
| 62 | for (size_t i=0; i<num_faces; i++) { |
| 63 | const auto& f = faces.segment(i*vertex_per_face, vertex_per_face); |
| 64 | const auto& uv = uv_indices.segment(i*vertex_per_face, vertex_per_face); |
| 65 | fout << "f "; |
| 66 | for (size_t j=0; j<vertex_per_face; j++) { |
| 67 | fout << f[j] + 1 << "/" << uv[j] + 1 << " "; |
| 68 | } |
| 69 | fout << std::endl; |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | void OBJWriter::with_attribute(const std::string& attr_name) { |
no test coverage detected