1 // GL Array Buffer Manipulation
7 #if defined(__ANDROID__) || defined(__ODROID__)
11 #define GL_DOUBLE 0x140A
12 #elif defined(__EMSCRIPTEN__)
13 #include <GLES2/gl2.h>
20 #define GL_DOUBLE 0x140A
23 # include "gl_core_3_3.h"
25 # include "gl_compat_4_4.h"
31 import "OpenGLDisplayDriver"
33 // Kept public for now
34 public void GLABDeleteBuffers(int count, GLAB * buffers)
39 for(i = 0; i < count; i++)
41 uint buffer = buffers[i].buffer;
44 if(buffer == glabCurArrayBuffer)
45 GLABBindBuffer(GL_ARRAY_BUFFER, 0);
46 else if(buffer == glabCurElementBuffer)
47 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
50 if(count && buffers[0].buffer)
51 glDeleteBuffers(count, (GLuint *)buffers);
55 void GLABBindBuffer(int target, uint buffer)
59 glBindBuffer(target, buffer);
60 if(target == GL_ARRAY_BUFFER)
61 glabCurArrayBuffer = buffer;
62 else if(target == GL_ELEMENT_ARRAY_BUFFER)
63 glabCurElementBuffer = buffer;
67 public enum GLBufferContents { vertex, normal, texCoord, color };
69 public define noAB = GLAB { 0 };
71 uint glabCurArrayBuffer;
77 void upload(uint size, void * data)
84 glGenBuffers(1, &buffer);
85 if(glabCurArrayBuffer != buffer)
86 GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
87 glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
96 if(this != null && buffer)
99 GLABDeleteBuffers(1, this);
104 void use(GLBufferContents contents, int n, int type, uint stride, void * pointer)
106 if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
107 GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
109 glVertexAttribPointer(contents, n, type, GL_FALSE, stride, pointer);
113 case normal: glNormalPointer(type, stride, pointer); break;
114 case vertex: glVertexPointer(n, type, stride, pointer); break;
115 case texCoord: glTexCoordPointer(n, type, stride, pointer); break;
116 case color: glColorPointer(n, type, stride, pointer); break;
121 void useVertTrans(uint count, int n, int type, uint stride, void * pointer)
123 #if defined(_GLES) || defined(_GLES2)
124 if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
125 GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
127 glimtkVertexPointeri(n, stride, pointer, count);
128 else if(type == GL_DOUBLE)
131 glVertexAttribPointer(GLBufferContents::vertex, n, GL_DOUBLE, GL_FALSE, stride, pointer);
133 glVertexPointer(n, GL_DOUBLE, stride, pointer);
137 use(vertex, n, type, stride, pointer);
142 uint glabCurElementBuffer;
144 public define noEAB = GLEAB { 0 };
150 void upload(uint size, void * data)
157 glGenBuffers(1, &buffer);
159 if(glabCurElementBuffer != buffer)
160 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
162 glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
173 if(this != null && buffer)
176 GLABDeleteBuffers(1, (GLAB *)this);
181 void draw(int primType, int count, int type, void * indices)
183 if(vboAvailable || !buffer)
185 if(glabCurElementBuffer != ((this != null) ? buffer : 0))
186 GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
187 #if defined(_GLES) || defined(_GLES2)
188 type = GL_UNSIGNED_SHORT;
190 glDrawElements(primType, count, type, indices);