aboutsummaryrefslogtreecommitdiff
path: root/src/load_obj.cc
diff options
context:
space:
mode:
authorccolin2020-12-28 17:36:45 +0100
committerccolin2020-12-28 17:36:45 +0100
commitf3a34665978729ef65010ac2a4a9408e27d5bf3e (patch)
treee8f4d6f2402c9b7113e33684f64b82a98d990313 /src/load_obj.cc
parentef37119f4e94c83a6357ebc0b94a39e4e53b20d7 (diff)
skybox
Diffstat (limited to 'src/load_obj.cc')
-rw-r--r--src/load_obj.cc68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/load_obj.cc b/src/load_obj.cc
new file mode 100644
index 0000000..2e079f0
--- /dev/null
+++ b/src/load_obj.cc
@@ -0,0 +1,68 @@
+#include "load_obj.hh"
+
+#define TINYOBJLOADER_IMPLEMENTATION
+#include "tiny_obj_loader.h"
+#include <QFile>
+#include <QDebug>
+
+
+QVector<GLfloat> load_obj(const char *path, int flags) {
+ QFile obj_file(path);
+ obj_file.open(QIODevice::ReadOnly | QIODevice::Text);
+ std::string obj = obj_file.readAll().toStdString();
+ tinyobj::ObjReaderConfig cfg;
+ cfg.triangulate = true;
+ cfg.vertex_color = false;
+ tinyobj::ObjReader reader;
+ if (!reader.ParseFromString(obj, "", cfg)) {
+ if (!reader.Error().empty()) {
+ qWarning() << "Erreur lors de la lecture de du modèle";
+ }
+ exit(1);
+ }
+ // if (!reader.Warning().empty()) {
+ // qWarning() << "TinyObjReader: " << reader.Warning();
+ // }
+ auto& attrib = reader.GetAttrib();
+ auto& shapes = reader.GetShapes();
+
+ QVector<GLfloat> verts;
+
+ for (size_t s = 0; s < shapes.size(); s++) {
+ // Loop over faces(polygon)
+ size_t index_offset = 0;
+ for (size_t f = 0; f < shapes[s].mesh.num_face_vertices.size(); f++) {
+ size_t fv = shapes[s].mesh.num_face_vertices[f];
+
+ // Loop over vertices in the face.
+ for (size_t v = 0; v < fv; v++) {
+ tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v];
+ tinyobj::real_t vx = attrib.vertices[3*idx.vertex_index+0];
+ tinyobj::real_t vy = attrib.vertices[3*idx.vertex_index+1];
+ tinyobj::real_t vz = attrib.vertices[3*idx.vertex_index+2];
+ verts.append(vx);
+ verts.append(vy);
+ verts.append(vz);
+
+ if (flags & LOAD_OBJ_NORMALS) {
+ tinyobj::real_t nx = attrib.normals[3*idx.normal_index+0];
+ tinyobj::real_t ny = attrib.normals[3*idx.normal_index+1];
+ tinyobj::real_t nz = attrib.normals[3*idx.normal_index+2];
+ verts.append(nx);
+ verts.append(ny);
+ verts.append(nz);
+ }
+
+ if (flags & LOAD_OBJ_UVS) {
+ tinyobj::real_t ts = attrib.texcoords[2*idx.texcoord_index+0];
+ tinyobj::real_t tt = attrib.texcoords[2*idx.texcoord_index+1];
+ verts.append(ts);
+ verts.append(tt);
+ }
+ // qDebug() << "vert" << vx << vy << vz << "tex" << ts << tt;
+ }
+ index_offset += fv;
+ }
+ }
+ return verts;
+}