1
1
#include " GL/glew.h"
2
2
#include " mesh.h"
3
- #include < QFile>
4
- #include < QTextStream>
5
- #include < QRegExp>
6
- #include < QStringList>
3
+
7
4
8
5
Mesh::Mesh ()
9
6
{
@@ -17,79 +14,6 @@ Mesh::~Mesh()
17
14
glDeleteBuffers (1 , &indexBufferObject_);
18
15
}
19
16
20
- void Mesh::load (string filename)
21
- {
22
- vector<SimpleVertex> vertexBuffer;
23
- IndexBuffer indexBuffer;
24
-
25
- vector<vec3> normals;
26
- vector<vec2> uvs;
27
-
28
- QFile file (filename.c_str ());
29
- if (!file.open (QFile::ReadOnly | QFile::Text)) {
30
- assert (false );
31
- return ;
32
- }
33
-
34
- QTextStream f (&file);
35
- QString line;
36
-
37
- QRegExp spaces (" \\ s+" );
38
- do {
39
- line = f.readLine ().trimmed ();
40
- QStringList parts = line.split (spaces);
41
- if (parts.isEmpty ()) continue ;
42
- if (parts[0 ] == " v" && parts.count () >= 4 ) {
43
- float x = parts[1 ].toFloat ();
44
- float y = parts[2 ].toFloat ();
45
- float z = parts[3 ].toFloat ();
46
- SimpleVertex v;
47
- v.position = {x, y, z};
48
- vertexBuffer.push_back (v);
49
- }
50
- else if (parts[0 ] == " vn" && parts.count () >= 4 ) {
51
- float x = parts[1 ].toFloat ();
52
- float y = parts[2 ].toFloat ();
53
- float z = parts[3 ].toFloat ();
54
- normals.push_back ({x, y, z});
55
- }
56
- else if (parts[0 ] == " vt" && parts.count () >= 3 ) {
57
- float u = parts[1 ].toFloat ();
58
- float v = parts[2 ].toFloat ();
59
- uvs.push_back ({u, v});
60
- }
61
- else if (parts[0 ] == " f" && parts.count () >= 4 ) {
62
- for (int i = 1 ; i <= 3 ; i++) {
63
- QStringList subparts = parts[i].split (' /' );
64
- int vertex = subparts.count () > 0 ? subparts[0 ].toInt () - 1 : -1 ;
65
- int uv = subparts.count () > 1 ? subparts[1 ].toInt () - 1 : -1 ;
66
- int normal = subparts.count () > 2 ? subparts[2 ].toInt () - 1 : -1 ;
67
- indexBuffer.push_back (vertex);
68
- SimpleVertex& v = vertexBuffer[vertex];
69
- if (normal != -1 ) {
70
- v.normal += normals[normal ];
71
- }
72
- if (uv != -1 ) {
73
- v.uv = uvs[uv];
74
- }
75
- }
76
- }
77
- } while (!line.isNull ());
78
-
79
- for (SimpleVertex& v : vertexBuffer) {
80
- v.normal .normalize ();
81
- }
82
-
83
- VertexBufferDesc desc;
84
- desc.bufferData = vertexBuffer.data ();
85
- desc.bufferSize = vertexBuffer.size () * sizeof (SimpleVertex);
86
- desc.vertexElementSizes = {3 , 3 , 2 };
87
- desc.stride = sizeof (SimpleVertex);
88
-
89
- setVertexBuffer (desc, PrimitiveType::Triangles);
90
- setIndexBuffer (indexBuffer);
91
- }
92
-
93
17
void Mesh::render () const
94
18
{
95
19
assert (vertexArrayObject_ > 0 && vertexBufferObject_ > 0 );
0 commit comments