1 // GL Array Buffer Manipulation
9 #if !defined(__ANDROID__) && !defined(__EMSCRIPTEN__) && !defined(__ODROID__)
11 # include "gl_core_3_3.h"
13 # include "gl_compat_4_4.h"
19 // Kept public for now
20 public void GLABDeleteBuffers(int count, GLAB * buffers)
23 for(i = 0; i < count; i++)
25 uint buffer = buffers[i].buffer;
28 if(buffer == glabCurArrayBuffer)
29 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
30 else if(buffer == glabCurElementBuffer)
31 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
34 if(count && buffers[0].buffer)
35 glDeleteBuffers(count, (GLuint *)buffers);
38 void GLABBindBuffer(int target, uint buffer)
40 glBindBuffer(target, buffer);
41 if(target == GL_ARRAY_BUFFER)
42 glabCurArrayBuffer = buffer;
43 else if(target == GL_ELEMENT_ARRAY_BUFFER)
44 glabCurElementBuffer = buffer;
47 public enum GLBufferContents { vertex, normal, texCoord, color };
49 public define noAB = GLAB { 0 };
51 uint glabCurArrayBuffer;
57 void upload(uint size, void * data)
62 glGenBuffers(1, &buffer);
63 if(glabCurArrayBuffer != buffer)
64 GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
65 glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
71 if(this != null && buffer)
73 GLABDeleteBuffers(1, this);
78 void use(GLBufferContents contents, int n, int type, uint stride, void * pointer)
80 if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
81 GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
83 glVertexAttribPointer(contents, n, type, GL_FALSE, stride, pointer);
87 case normal: glNormalPointer(type, stride, pointer); break;
88 case vertex: glVertexPointer(n, type, stride, pointer); break;
89 case texCoord: glTexCoordPointer(n, type, stride, pointer); break;
90 case color: glColorPointer(n, type, stride, pointer); break;
95 void useVertTrans(uint count, int n, int type, uint stride, void * pointer)
97 #if defined(_GLES) || defined(ES1_1)
98 if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
99 GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
101 glimtkVertexPointeri(n, stride, pointer, count);
102 else if(type == GL_DOUBLE)
105 glVertexAttribPointer(GLBufferContents::vertex, n, GL_DOUBLE, GL_FALSE, stride, pointer);
107 glVertexPointer(n, GL_DOUBLE, stride, pointer);
111 use(vertex, n, type, stride, pointer);
116 uint glabCurElementBuffer;
118 public define noEAB = GLEAB { 0 };
124 void upload(uint size, void * data)
129 glGenBuffers(1, &buffer);
131 if(glabCurElementBuffer != buffer)
132 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
133 glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
139 if(this != null && buffer)
141 GLABDeleteBuffers(1, (GLAB *)this);
146 void draw(int primType, int count, int type, void * indices)
148 if(glabCurElementBuffer != ((this != null) ? buffer : 0))
149 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
150 #if defined(_GLES) || defined(ES1_1)
151 type = GL_UNSIGNED_SHORT;
153 glDrawElements(primType, count, type, indices);