diff options
Diffstat (limited to 'src/renderer/mesh.cpp')
-rw-r--r-- | src/renderer/mesh.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/renderer/mesh.cpp b/src/renderer/mesh.cpp new file mode 100644 index 0000000..b06b723 --- /dev/null +++ b/src/renderer/mesh.cpp | |||
@@ -0,0 +1,109 @@ | |||
1 | #include "mesh.h" | ||
2 | #include <fstream> | ||
3 | #include <vector> | ||
4 | #include <map> | ||
5 | #include <glm/glm.hpp> | ||
6 | #include "util.h" | ||
7 | |||
8 | Mesh::Mesh(std::string filename) | ||
9 | { | ||
10 | std::ifstream meshfile(filename); | ||
11 | if (!meshfile.is_open()) | ||
12 | { | ||
13 | throw std::invalid_argument("Could not open mesh file"); | ||
14 | } | ||
15 | |||
16 | std::vector<glm::vec3> tempVertices; | ||
17 | std::vector<glm::vec2> tempUvs; | ||
18 | std::vector<glm::vec3> tempNormals; | ||
19 | |||
20 | std::vector<glm::vec3> outVertices; | ||
21 | std::vector<glm::vec2> outUvs; | ||
22 | std::vector<glm::vec3> outNormals; | ||
23 | std::map<element, unsigned short> elementIds; | ||
24 | std::vector<unsigned short> indices; | ||
25 | |||
26 | while (meshfile) | ||
27 | { | ||
28 | std::string linetype; | ||
29 | meshfile >> linetype; | ||
30 | |||
31 | if (linetype == "v") | ||
32 | { | ||
33 | glm::vec3 vertex; | ||
34 | meshfile >> vertex.x >> vertex.y >> vertex.z; | ||
35 | |||
36 | tempVertices.push_back(std::move(vertex)); | ||
37 | } else if (linetype == "vt") | ||
38 | { | ||
39 | glm::vec2 uv; | ||
40 | meshfile >> uv.x >> uv.y; | ||
41 | |||
42 | tempUvs.push_back(std::move(uv)); | ||
43 | } else if (linetype == "vn") | ||
44 | { | ||
45 | glm::vec3 normal; | ||
46 | meshfile >> normal.x >> normal.y >> normal.z; | ||
47 | |||
48 | tempNormals.push_back(std::move(normal)); | ||
49 | } else if (linetype == "f") | ||
50 | { | ||
51 | element elements[3]; | ||
52 | |||
53 | meshfile | ||
54 | >> elements[0].vertexId >> chlit('/') | ||
55 | >> elements[0].uvId >> chlit('/') | ||
56 | >> elements[0].normalId | ||
57 | >> elements[1].vertexId >> chlit('/') | ||
58 | >> elements[1].uvId >> chlit('/') | ||
59 | >> elements[1].normalId | ||
60 | >> elements[2].vertexId >> chlit('/') | ||
61 | >> elements[2].uvId >> chlit('/') | ||
62 | >> elements[2].normalId; | ||
63 | |||
64 | for (size_t i = 0; i < 3; i++) | ||
65 | { | ||
66 | if (!elementIds.count(elements[i])) | ||
67 | { | ||
68 | elementIds[elements[i]] = outVertices.size(); | ||
69 | |||
70 | outVertices.push_back(tempVertices[elements[i].vertexId - 1]); | ||
71 | outUvs.push_back(tempUvs[elements[i].uvId - 1]); | ||
72 | outNormals.push_back(tempNormals[elements[i].normalId - 1]); | ||
73 | } | ||
74 | |||
75 | indices.push_back(elementIds[elements[i]]); | ||
76 | } | ||
77 | } | ||
78 | } | ||
79 | |||
80 | glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_.getId()); | ||
81 | glBufferData( | ||
82 | GL_ARRAY_BUFFER, | ||
83 | outVertices.size() * sizeof(glm::vec3), | ||
84 | outVertices.data(), | ||
85 | GL_STATIC_DRAW); | ||
86 | |||
87 | glBindBuffer(GL_ARRAY_BUFFER, uvBuffer_.getId()); | ||
88 | glBufferData( | ||
89 | GL_ARRAY_BUFFER, | ||
90 | outUvs.size() * sizeof(glm::vec2), | ||
91 | outUvs.data(), | ||
92 | GL_STATIC_DRAW); | ||
93 | |||
94 | glBindBuffer(GL_ARRAY_BUFFER, normalBuffer_.getId()); | ||
95 | glBufferData( | ||
96 | GL_ARRAY_BUFFER, | ||
97 | outNormals.size() * sizeof(glm::vec3), | ||
98 | outNormals.data(), | ||
99 | GL_STATIC_DRAW); | ||
100 | |||
101 | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer_.getId()); | ||
102 | glBufferData( | ||
103 | GL_ELEMENT_ARRAY_BUFFER, | ||
104 | indices.size() * sizeof(unsigned short), | ||
105 | indices.data(), | ||
106 | GL_STATIC_DRAW); | ||
107 | |||
108 | indexCount_ = indices.size(); | ||
109 | } | ||