Rev Author Line No. Line
23 ovan 1 #include "ogl4_vao.h"
2 #include <memory.h>
3 #include <GL/gl.h>
4  
5 namespace sleek
6 {
7     static GLuint ogl4_call_mode[] =
8     {
9         GL_STATIC_DRAW,
10         GL_DYNAMIC_DRAW,
11         GL_STREAM_DRAW
12     };
13  
14     namespace driver
15     {
16         template<>
17         ogl4_vao_identifer<false>::ogl4_vao_identifer(MeshBuffer *o, VAO_ALIGNMENT t, VAO_ALIGNMENT v) noexcept
18             : identifier(o), vert(t), element(v)
19         {
20             glGenVertexArrays(1, &gl);
21             glBindVertexArray(gl);
22  
23             glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
24             glBufferSubData(
25                 GL_ELEMENT_ARRAY_BUFFER, 0,
26                 sizeof(*o->indices.data()) * o->indices.size(),
27                 o->indices.data()
28             );
29  
30             glBindBuffer(GL_ARRAY_BUFFER, vbo);
31             glBufferSubData(
32                 GL_ARRAY_BUFFER, 0,
33                 sizeof(*o->vertices.data()) * o->vertices.size(),
34                 o->vertices.data()
35             );
36  
37             glBindVertexArray(0);
38         }
39  
40         template<>
41         ogl4_vao_identifer<true>::ogl4_vao_identifer(MeshBuffer *o, VAO_ALIGNMENT t, VAO_ALIGNMENT v) noexcept
42             : identifier(o), vert(t), element(v)
43         {
44             glGenVertexArrays(1, &gl);
45             glBindVertexArray(gl);
46  
47             glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
48             glBufferSubData(
49                 GL_ELEMENT_ARRAY_BUFFER, 0,
50                 sizeof(*o->indices.data()) * o->indices.size(),
51                 o->indices.data()
52             );
53  
54             glBindBuffer(GL_ARRAY_BUFFER, vbo);
55             glBufferSubData(
56                 GL_ARRAY_BUFFER, 0,
57                 sizeof(*o->vertices.data()) * o->vertices.size(),
58                 o->vertices.data()
59             );
60  
61             glBindVertexArray(0);
62         }
63  
64         template<bool dsa>
65         ogl4_vao_identifer<dsa>::~ogl4_vao_identifer() noexcept
66         {
67             glDeleteBuffers(1, &vbo);
68             glDeleteBuffers(1, &ebo);
69             glDeleteBuffers(1, &gl);
70         }
71  
72         template<bool dsa>
73         void* ogl4_vao_identifer<dsa>::getHardwareLink() const noexcept
74         {
75             GLuint *tmp = (GLuint*)&gl;
76             return tmp;
77         }
78  
79         template<bool dsa>
80         void ogl4_vao_identifer<dsa>::bind() noexcept
81         {
82             glBindVertexArray(gl);
83         }
84  
85         template<bool dsa>
86         void ogl4_vao_identifer<dsa>::unbind() noexcept
87         {
88             glBindVertexArray(0);
89         }
90  
91         template<>
92         void ogl4_vao_identifer<false>::update() noexcept
93         {
94             MeshBuffer *tmp = (MeshBuffer*)owner;
95  
96             glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
97             glBufferSubData(
98                 GL_ELEMENT_ARRAY_BUFFER, 0,
99                 sizeof(*tmp->indices.data()) * tmp->indices.size(),
100                 tmp->indices.data()
101             );
102  
103             glBindBuffer(GL_ARRAY_BUFFER, vbo);
104             glBufferSubData(
105                 GL_ARRAY_BUFFER, 0,
106                 sizeof(*tmp->vertices.data()) * tmp->vertices.size(),
107                 tmp->vertices.data()
108             );
109         }
110  
111         template<>
112         void ogl4_vao_identifer<true>::update() noexcept
113         {
114             MeshBuffer *tmp = (MeshBuffer*)owner;
115  
116             glNamedBufferSubDataEXT(
117                 ebo, 0,
118                 sizeof(*tmp->indices.data()) * tmp->indices.size(),
119                 tmp->indices.data()
120             );
121  
122             glNamedBufferSubDataEXT(
123                 vbo, 0,
124                 sizeof(*tmp->vertices.data()) * tmp->vertices.size(),
125                 tmp->vertices.data()
126             );
127         }
128     }
129 }