#include "graphics/meshloader.h" #define TINYOBJLOADER_IMPLEMENTATION #include "util/tiny_obj_loader.h" #include #include #include #include #include #include #include #include using namespace std; using namespace Eigen; MeshLoader::MeshLoader() {} bool MeshLoader::loadTriMesh(const string &filePath, vector &vertices, vector &faces) { tinyobj::attrib_t attrib; vector shapes; vector materials; QFileInfo info(QString(filePath.c_str())); string err; bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, info.absoluteFilePath().toStdString().c_str(), (info.absolutePath().toStdString() + "/").c_str(), true); if (!err.empty()) { cerr << err << endl; } if (!ret) { cerr << "Failed to load/parse .obj file" << endl; return false; } for (size_t s = 0; s < shapes.size(); s++) { size_t index_offset = 0; for (size_t f = 0; f < shapes[s].mesh.num_face_vertices.size(); f++) { unsigned int fv = shapes[s].mesh.num_face_vertices[f]; Vector3i face; for (size_t v = 0; v < fv; v++) { tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v]; face[v] = idx.vertex_index; } faces.push_back(face); index_offset += fv; } } for (size_t i = 0; i < attrib.vertices.size(); i += 3) { vertices.emplace_back(attrib.vertices[i], attrib.vertices[i + 1], attrib.vertices[i + 2]); } cout << "Loaded " << faces.size() << " faces and " << vertices.size() << " vertices" << endl; return true; }