19 MeshGL::MeshGL(const MeshGL &mesh)
21 indices = mesh.indices;
22 vertices = mesh.vertices;
23 normals = mesh.normals;
30 * if we set these to the actual
31 * vertices.size() and indices.size()
32 * update_vbo will have no effect
39 MeshGL &MeshGL::operator=(const MeshGL &mesh)
44 /* to avoid OpenGL leaks */
47 /* what the copy constructor does */
48 indices = mesh.indices;
49 vertices = mesh.vertices;
50 normals = mesh.normals;
64 void MeshGL::draw() const
66 // save the previously bound vao, vbo just in case
69 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao);
70 glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo);
72 glBindVertexArray(vao);
74 glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices);
75 glVertexPointer(3, GL_FLOAT, 0, 0);
76 glBindBuffer(GL_ARRAY_BUFFER, vbo_normals);
77 glNormalPointer(GL_FLOAT, 0, 0);
78 glBindBuffer(GL_ARRAY_BUFFER, 0);
80 glEnableClientState(GL_VERTEX_ARRAY);
81 glEnableClientState(GL_NORMAL_ARRAY);
82 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
83 glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, 0);
84 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
85 glDisableClientState(GL_VERTEX_ARRAY);
86 glDisableClientState(GL_NORMAL_ARRAY);
88 // return to previous state
89 glBindBuffer(GL_ARRAY_BUFFER, curr_vbo);
90 glBindVertexArray(curr_vao);
94 void MeshGL::update_vertex_data()
99 void MeshGL::update_vbo()
101 // save the previously bound vao, vbo just in case
104 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &curr_vao);
105 glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &curr_vbo);
108 glGenVertexArrays(1, &vao);
110 glBindVertexArray(vao);
112 if(which_mask & MESH_NORMAL) {
114 glGenBuffers(1, &vbo_normals);
116 glBindBuffer(GL_ARRAY_BUFFER, vbo_normals);
117 if(num_vertices != (int)normals.size()) {
118 glBufferData(GL_ARRAY_BUFFER, normals.size() * 3 * sizeof(float),
119 &normals[0], GL_STREAM_DRAW);
122 glBufferSubData(GL_ARRAY_BUFFER, 0, normals.size() * 3 * sizeof(float),
127 if(which_mask & MESH_VERTEX) {
129 glGenBuffers(1, &vbo_vertices);
131 glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices);
132 if(num_vertices != (int)vertices.size()) {
133 glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float),
134 &vertices[0], GL_STREAM_DRAW);
137 glBufferSubData(GL_ARRAY_BUFFER, 0, vertices.size() * 3 * sizeof(float),
140 num_vertices = vertices.size();
143 if(which_mask & MESH_INDEX) {
145 glGenBuffers(1, &ibo);
147 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
148 if(num_indices != (int)indices.size()) {
149 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * 2,
150 &indices[0], GL_STATIC_DRAW);
153 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indices.size() * 2,
156 num_indices = indices.size();
159 /* bind previously bound vbo */
160 glBindBuffer(GL_ARRAY_BUFFER, curr_vbo);
161 glBindVertexArray(curr_vao);
164 void MeshGL::destroy_vbo()
167 glDeleteBuffers(1, &vbo_vertices);
169 glDeleteBuffers(1, &vbo_normals);
171 glDeleteBuffers(1, &ibo);
173 glDeleteVertexArrays(1, &vao);