blob: fc95f6fc31c97507d12bdb43d9900086ee7a16a3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include "graphics/meshloader.h"
#define TINYOBJLOADER_IMPLEMENTATION
#include "util/tiny_obj_loader.h"
#include <iostream>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QRegularExpression>
#include <QFileInfo>
#include <iostream>
#include <set>
using namespace std;
using namespace Eigen;
MeshLoader::MeshLoader() {}
bool MeshLoader::loadTriMesh(const string &filePath, vector<Vector3f> &vertices, vector<Vector3i> &faces)
{
tinyobj::attrib_t attrib;
vector<tinyobj::shape_t> shapes;
vector<tinyobj::material_t> 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;
}
|