1 // OpenGL Immediate Mode Transition Kit
7 #if defined(__ANDROID__) || defined(__ODROID__)
9 #elif defined(__EMSCRIPTEN__)
10 #include <GLES2/gl2.h>
13 # include "gl_core_3_3.h"
15 # include "gl_compat_4_4.h"
24 #undef glEnableClientState
25 #undef glDisableClientState
26 #undef GL_VERTEX_ARRAY
27 #undef GL_NORMAL_ARRAY
28 #undef GL_TEXTURE_COORD_ARRAY
30 #undef glVertexPointer
31 #undef glTexCoordPointer
33 #define glEnableClientState glEnableVertexAttribArray
34 #define glDisableClientState glDisableVertexAttribArray
35 #define GL_VERTEX_ARRAY GLBufferContents::vertex
36 #define GL_NORMAL_ARRAY GLBufferContents::normal
37 #define GL_TEXTURE_COORD_ARRAY GLBufferContents::texCoord
38 #define GL_COLOR_ARRAY GLBufferContents::color
40 #define glVertexPointer(n, t, s, p) glVertexAttribPointer(GLBufferContents::vertex, n, t, GL_FALSE, s, p)
41 #define glTexCoordPointer(n, t, s, p) glVertexAttribPointer(GLBufferContents::texCoord, n, t, GL_FALSE, s, p)
45 public enum GLIMTKMode
53 triangleStrip = 0x0005,
60 static int beginCount;
61 static int vertexCount;
62 static int normalCount;
63 static float *vertexPointer;
64 static float *normalPointer;
65 static GLIMTKMode beginMode = unset;
66 static uint beginBufferSize, normalBufferSize;
67 static int numVertexCoords = 2;
68 static bool vertexColorValues = false;
69 static int vertexStride = 4;
70 static int vertexOffset = 2;
72 public void glimtkRecti(int a, int b, int c, int d)
82 public void glimtkBegin(GLIMTKMode mode)
87 vertexColorValues = false;
94 normalBufferSize = beginBufferSize = 1024; // default number of vertices
95 vertexPointer = new float[beginBufferSize * vertexStride];
96 normalPointer = new float[normalBufferSize * 3];
100 public void glimtkTexCoord2f(float x, float y)
102 int count = vertexCount;
104 if(vertexCount + numVertexCoords > beginBufferSize)
106 beginBufferSize = beginBufferSize + beginBufferSize/2;
107 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
110 vertexPointer[count*vertexStride ] = x;
111 vertexPointer[count*vertexStride+1] = y;
114 if(beginMode == quads && ((beginCount % 4) == 3))
116 vertexPointer[count*vertexStride ] = vertexPointer[(count-4)*vertexStride];
117 vertexPointer[count*vertexStride+1] = vertexPointer[(count-4)*vertexStride+1];
119 vertexPointer[count*vertexStride ] = vertexPointer[(count-3)*vertexStride];
120 vertexPointer[count*vertexStride+1] = vertexPointer[(count-3)*vertexStride+1];
124 public void glimtkTexCoord2i(int x, int y) { glimtkTexCoord2f((float)x, (float)y); }
125 public void glimtkTexCoord2d(double x, double y) { glimtkTexCoord2f((float)x, (float)y); }
126 public void glimtkTexCoord2fv(float * a) { glimtkTexCoord2f(a[0], a[1]); }
128 public void glimtkVertex2f(float x, float y)
131 vertexStride = vertexOffset + numVertexCoords;
133 if(vertexCount + 4 > beginBufferSize)
135 beginBufferSize = beginBufferSize + beginBufferSize/2;
136 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
139 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
140 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = y;
143 if(beginMode == quads && ((beginCount % 4) == 3))
145 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
146 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset + 1];
148 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
149 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset + 1];
154 public void glimtkVertex2i(int x, int y) { glimtkVertex2f((float)x, (float)y); }
155 public void glimtkVertex2d(double x, double y) { glimtkVertex2f((float)x, (float)y); }
157 GLAB streamVecAB, streamNorAB;
159 public void glimtkEnd(void)
161 GLIMTKMode mode = beginMode;
162 if(mode == quads) mode = triangles;
163 else if(mode == polygon) mode = triangleFan;
165 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
169 streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
170 streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
173 noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
175 if(vertexColorValues)
177 glEnableClientState(GL_COLOR_ARRAY);
179 streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
181 noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
184 shader_setPerVertexColor(true);
189 streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
191 noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
193 if(normalCount && normalCount == vertexCount)
195 glEnableClientState(GL_NORMAL_ARRAY);
198 streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
199 streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
202 noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
205 glDrawArrays(mode, 0, vertexCount);
208 glDisableClientState(GL_NORMAL_ARRAY);
209 if(vertexColorValues)
211 glDisableClientState(GL_COLOR_ARRAY);
214 shader_setPerVertexColor(false);
218 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
221 vertexColorValues = false;
227 static float *floatVPBuffer = null;
228 static short *shortVPBuffer = null;
229 static unsigned int shortVPSize = 0, floatVPSize = 0;
232 static unsigned short *shortBDBuffer = null;
233 static unsigned int shortBDSize = 0;
235 public void glimtkVertexPointeri(int numCoords, int stride, int *pointer, int numVertices)
240 if(numVertices*numCoords > shortVPSize)
242 shortVPSize = numVertices*numCoords;
243 shortVPBuffer = renew shortVPBuffer short[shortVPSize];
245 for(i = 0; i < numVertices*numCoords; i++)
246 shortVPBuffer[i] = (short)pointer[i];
248 glVertexPointer(numCoords, GL_SHORT, stride, shortVPBuffer);
251 glVertexPointer(numCoords, GL_SHORT, stride, 0);
254 public void glimtkVertexPointerd(int numCoords, int stride, double *pointer, int numVertices)
259 if(numVertices*numCoords > floatVPSize)
261 floatVPSize = numVertices*numCoords;
262 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
264 for(i = 0; i < numVertices*numCoords; i++)
265 floatVPBuffer[i] = (float)pointer[i];
266 glVertexPointer(numCoords, GL_FLOAT, stride, floatVPBuffer);
269 glVertexPointer(numCoords, GL_FLOAT, stride, 0);
272 public void glimtkTexReuseIntVP(int numCoords)
274 glTexCoordPointer(numCoords, GL_SHORT, 0, floatVPBuffer);
277 public void glimtkTexReuseDoubleVP(int numCoords)
279 glTexCoordPointer(numCoords, GL_FLOAT, 0, floatVPBuffer);
282 public void glimtkColor4f(float r, float g, float b, float a)
284 if(beginMode != unset)
286 int count = vertexCount;
288 vertexColorValues = true;
290 vertexStride = vertexOffset + numVertexCoords;
292 if(vertexCount + vertexStride > beginBufferSize)
294 beginBufferSize = beginBufferSize + beginBufferSize/2;
295 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
298 vertexPointer[count*vertexStride + 2] = r;
299 vertexPointer[count*vertexStride + 3] = g;
300 vertexPointer[count*vertexStride + 4] = b;
301 vertexPointer[count*vertexStride + 5] = a;
304 if(beginMode == quads && ((beginCount % 4) == 3))
306 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-4) * vertexStride + 2];
307 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-4) * vertexStride + 3];
308 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-4) * vertexStride + 4];
309 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-4) * vertexStride + 5];
311 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-3) * vertexStride + 2];
312 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-3) * vertexStride + 3];
313 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-3) * vertexStride + 4];
314 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-3) * vertexStride + 5];
321 shader_color(r, g, b, a);
323 glColor4f(r, g, b, a);
326 float color[4] = { r, g, b, a };
327 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
328 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
334 public void glimtkColor3f( float r, float g, float b )
336 glimtkColor4f(r, g, b, 1.0f);
339 public void glimtkColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a)
341 glimtkColor4f(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
344 public void glimtkColor4fv(float * a)
346 glimtkColor4f(a[0], a[1], a[2], a[3]);
349 public void glimtkBufferDatad(int target, int size, void * data, int usage)
351 int numElems = size/sizeof(double);
352 double * dblPtr = (double *)data;
354 if (numElems > floatVPSize)
356 floatVPSize = numElems;
357 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
359 for (i=0; i< numElems; i++)
360 floatVPBuffer[i] = (float)dblPtr[i];
362 glBufferData(target, numElems*sizeof(float), floatVPBuffer, usage);
365 public void glimtkBufferDatai(int target, int size, void * data, int usage)
367 int numElems = size/sizeof(unsigned int);
368 unsigned int * pointer = (unsigned int *)data;
370 if (numElems > shortBDSize)
372 shortBDSize = numElems;
373 shortBDBuffer = renew shortBDBuffer uint16[shortBDSize];
375 for (i=0; i< numElems; i++)
376 shortBDBuffer[i] = (unsigned short)pointer[i];
378 glBufferData(target, numElems*sizeof(unsigned short), shortBDBuffer, usage);
381 public void glimtkVertex3f( float x, float y, float z )
384 vertexStride = vertexOffset + numVertexCoords;
386 if(vertexCount + vertexStride > beginBufferSize)
388 beginBufferSize = beginBufferSize + beginBufferSize/2;
389 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
392 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
393 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = y;
394 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = z;
397 if(beginMode == quads && ((beginCount % 4) == 3))
399 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
400 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+1];
401 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+2];
403 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
404 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+1];
405 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+2];
411 public void glimtkVertex3d( double x, double y, double z ) { glimtkVertex3f((float)x, (float)y, (float)z); }
412 public void glimtkVertex3fv( float* coords ) { glimtkVertex3f(coords[0], coords[1], coords[2]); }
413 public void glimtkVertex3dv( double* coords ) { glimtkVertex3f((float)coords[0], (float)coords[1], (float)coords[2]); }
415 public void glimtkNormal3f(float x, float y, float z)
417 normalCount = vertexCount;
418 if(vertexCount + 4 > normalBufferSize)
420 normalBufferSize = normalBufferSize + normalBufferSize/2;
421 normalPointer = renew normalPointer float[normalBufferSize * 2];
424 normalPointer[normalCount*3+0] = x;
425 normalPointer[normalCount*3+1] = y;
426 normalPointer[normalCount*3+2] = z;
429 if(beginMode == quads && ((beginCount % 4) == 3))
431 normalPointer[normalCount*3+0] = normalPointer[(normalCount-4)*3+0];
432 normalPointer[normalCount*3+1] = normalPointer[(normalCount-4)*3+1];
433 normalPointer[normalCount*3+2] = normalPointer[(normalCount-4)*3+2];
435 normalPointer[normalCount*3+0] = normalPointer[(normalCount-3)*3+0];
436 normalPointer[normalCount*3+1] = normalPointer[(normalCount-3)*3+1];
437 normalPointer[normalCount*3+2] = normalPointer[(normalCount-3)*3+2];
441 public void glimtkNormal3fd(double x, double y, double z) { glimtkNormal3f((float)x, (float)y, (float)z); }
442 public void glimtkNormal3fv(float * coords) { glimtkNormal3f(coords[0], coords[1], coords[2]); }
444 public void glimtkTerminate()
446 delete vertexPointer;
447 delete normalPointer;
450 delete floatVPBuffer;
453 delete shortVPBuffer;
456 delete shortBDBuffer;