-
Notifications
You must be signed in to change notification settings - Fork 2
/
vertex_buffer.h
52 lines (41 loc) · 1.1 KB
/
vertex_buffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef CGS_GL_VERTEX_BUFFER_H
#define CGS_GL_VERTEX_BUFFER_H
#include <glad/glad.h>
#include "exception.h"
namespace cgs {
namespace gl {
template<class T>
class VertexBuffer final
{
GLuint vbo_;
const size_t size_;
public:
template<class CONTAINER>
VertexBuffer(const CONTAINER& data, GLenum usage)
: size_(data.size())
{
glCreateBuffers(1, &vbo_);
glNamedBufferData(vbo_, sizeof(T) * data.size(), data.data(), usage);
}
~VertexBuffer()
{
glDeleteBuffers(1, &vbo_);
}
template<class CONTAINER>
void update(const CONTAINER& data)
{
if (data.size() != size_)
handleError("Data size mismatch.");
auto buffer = glMapNamedBuffer(vbo_, GL_WRITE_ONLY);
std::copy(data.begin(), data.end(), buffer);
glUnmapNamedBuffer(vbo_);
}
GLuint get() const { return vbo_; }
VertexBuffer(const VertexBuffer&) = delete;
VertexBuffer& operator=(const VertexBuffer&) = delete;
VertexBuffer(VertexBuffer&&) = default;
VertexBuffer& operator=(VertexBuffer&&) = default;
};
} //gl
} //cgs
#endif