]> git.localhorst.tv Git - blank.git/blob - src/model.cpp
032fc150a9e449c12bc68d62c98609280fee09a8
[blank.git] / src / model.cpp
1 #include "model.hpp"
2
3
4 namespace blank {
5
6 Model::Model()
7 : vertices()
8 , colors()
9 , normals()
10 , handle{}
11 , dirty(false) {
12         glGenBuffers(ATTRIB_COUNT, handle);
13 }
14
15 Model::~Model() {
16         glDeleteBuffers(ATTRIB_COUNT, handle);
17 }
18
19
20 void Model::Clear() {
21         vertices.clear();
22         colors.clear();
23         normals.clear();
24         Invalidate();
25 }
26
27 void Model::Reserve(int s) {
28         vertices.reserve(s);
29         colors.reserve(s);
30         normals.reserve(s);
31 }
32
33
34 void Model::Update() {
35         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
36         glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), vertices.data(), GL_STATIC_DRAW);
37
38         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
39         glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec3), colors.data(), GL_STATIC_DRAW);
40
41         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
42         glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), GL_STATIC_DRAW);
43
44         dirty = false;
45 }
46
47
48 void Model::Draw() {
49         if (dirty) {
50                 Update();
51         }
52
53         glEnableVertexAttribArray(ATTRIB_VERTEX);
54         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
55         glVertexAttribPointer(
56                 ATTRIB_VERTEX, // location (for shader)
57                 3,             // size
58                 GL_FLOAT,      // type
59                 GL_FALSE,      // normalized
60                 0,             // stride
61                 nullptr        // offset
62         );
63
64         glEnableVertexAttribArray(ATTRIB_COLOR);
65         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
66         glVertexAttribPointer(
67                 ATTRIB_COLOR,  // location (for shader)
68                 3,             // size
69                 GL_FLOAT,      // type
70                 GL_FALSE,      // normalized
71                 0,             // stride
72                 nullptr        // offset
73         );
74
75         glEnableVertexAttribArray(ATTRIB_NORMAL);
76         glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
77         glVertexAttribPointer(
78                 ATTRIB_NORMAL, // location (for shader)
79                 3,             // size
80                 GL_FLOAT,      // type
81                 GL_FALSE,      // normalized
82                 0,             // stride
83                 nullptr        // offset
84         );
85
86         glDrawArrays(
87                 GL_TRIANGLES,   // how
88                 0,              // start
89                 vertices.size() // len
90         );
91
92         glDisableVertexAttribArray(ATTRIB_NORMAL);
93         glDisableVertexAttribArray(ATTRIB_COLOR);
94         glDisableVertexAttribArray(ATTRIB_VERTEX);
95 }
96
97 }