1 // OpenGL Immediate Mode Transition Kit
15 triangleStrip = 0x0005,
22 static int beginCount;
23 static int vertexCount;
24 static int normalCount;
25 static float *vertexPointer;
26 static float *normalPointer;
27 static GLIMTKMode beginMode = unset;
28 static uint beginBufferSize, normalBufferSize;
29 static int numVertexCoords = 2;
30 static bool vertexColorValues = false;
31 static int vertexStride = 4;
32 static int vertexOffset = 2;
34 public void glimtkRecti(int a, int b, int c, int d)
44 public void glimtkBegin(GLIMTKMode mode)
49 vertexColorValues = false;
56 normalBufferSize = beginBufferSize = 1024; // default number of vertices
57 vertexPointer = new float[beginBufferSize * vertexStride];
58 normalPointer = new float[normalBufferSize * 3];
62 public void glimtkTexCoord2f(float x, float y)
64 int count = vertexCount;
66 if(vertexCount + numVertexCoords > beginBufferSize)
68 beginBufferSize = beginBufferSize + beginBufferSize/2;
69 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
72 vertexPointer[count*vertexStride ] = x;
73 vertexPointer[count*vertexStride+1] = y;
76 if(beginMode == quads && ((beginCount % 4) == 3))
78 vertexPointer[count*vertexStride ] = vertexPointer[(count-4)*vertexStride];
79 vertexPointer[count*vertexStride+1] = vertexPointer[(count-4)*vertexStride+1];
81 vertexPointer[count*vertexStride ] = vertexPointer[(count-3)*vertexStride];
82 vertexPointer[count*vertexStride+1] = vertexPointer[(count-3)*vertexStride+1];
86 public void glimtkTexCoord2i(int x, int y) { glimtkTexCoord2f((float)x, (float)y); }
87 public void glimtkTexCoord2d(double x, double y) { glimtkTexCoord2f((float)x, (float)y); }
88 public void glimtkTexCoord2fv(float * a) { glimtkTexCoord2f(a[0], a[1]); }
90 public void glimtkVertex2f(float x, float y)
93 vertexStride = vertexOffset + numVertexCoords;
95 if(vertexCount + 4 > beginBufferSize)
97 beginBufferSize = beginBufferSize + beginBufferSize/2;
98 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
101 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
102 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = y;
105 if(beginMode == quads && ((beginCount % 4) == 3))
107 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
108 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset + 1];
110 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
111 vertexPointer[vertexCount*vertexStride+vertexOffset + 1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset + 1];
116 public void glimtkVertex2i(int x, int y) { glimtkVertex2f((float)x, (float)y); }
117 public void glimtkVertex2d(double x, double y) { glimtkVertex2f((float)x, (float)y); }
119 GLAB streamVecAB, streamNorAB;
121 public void glimtkEnd()
123 GLIMTKMode mode = beginMode;
124 if(mode == quads) mode = triangles;
125 else if(mode == polygon) mode = triangleFan;
127 GLEnableClientState(TEXCOORDS);
129 if(glcaps_vertexBuffer)
131 streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
132 streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
135 noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
137 if(vertexColorValues)
139 GLEnableClientState(COLORS);
140 if(glcaps_vertexBuffer)
141 streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
143 noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
145 #if ENABLE_GL_SHADERS
147 shader_setPerVertexColor(true);
151 if(glcaps_vertexBuffer)
152 streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
154 noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
156 if(normalCount && normalCount == vertexCount)
158 GLEnableClientState(NORMALS);
159 if(glcaps_vertexBuffer)
161 streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
162 streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
165 noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
169 glDrawArrays(mode, 0, vertexCount);
172 GLDisableClientState(NORMALS);
173 if(vertexColorValues)
175 GLDisableClientState(COLORS);
177 #if ENABLE_GL_SHADERS
179 shader_setPerVertexColor(false);
183 GLDisableClientState(TEXCOORDS);
186 vertexColorValues = false;
192 static float *floatVPBuffer = null;
193 static short *shortVPBuffer = null;
194 static unsigned int shortVPSize = 0, floatVPSize = 0;
197 static unsigned short *shortBDBuffer = null;
198 static unsigned int shortBDSize = 0;
200 public void glimtkVertexPointeri(int numCoords, int stride, int *pointer, int numVertices)
205 if(numVertices*numCoords > shortVPSize)
207 shortVPSize = numVertices*numCoords;
208 shortVPBuffer = renew shortVPBuffer short[shortVPSize];
210 for(i = 0; i < numVertices*numCoords; i++)
211 shortVPBuffer[i] = (short)pointer[i];
213 GLVertexPointer(numCoords, GL_SHORT, stride, shortVPBuffer);
216 GLVertexPointer(numCoords, GL_SHORT, stride, 0);
219 public void glimtkVertexPointerd(int numCoords, int stride, double *pointer, int numVertices)
224 if(numVertices*numCoords > floatVPSize)
226 floatVPSize = numVertices*numCoords;
227 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
229 for(i = 0; i < numVertices*numCoords; i++)
230 floatVPBuffer[i] = (float)pointer[i];
231 GLVertexPointer(numCoords, GL_FLOAT, stride, floatVPBuffer);
234 GLVertexPointer(numCoords, GL_FLOAT, stride, 0);
237 public void glimtkTexReuseIntVP(int numCoords)
239 GLTexCoordPointer(numCoords, GL_SHORT, 0, floatVPBuffer);
242 public void glimtkTexReuseDoubleVP(int numCoords)
244 GLTexCoordPointer(numCoords, GL_FLOAT, 0, floatVPBuffer);
247 public void glimtkColor4f(float r, float g, float b, float a)
249 if(beginMode != unset)
251 int count = vertexCount;
253 vertexColorValues = true;
255 vertexStride = vertexOffset + numVertexCoords;
257 if(vertexCount + vertexStride > beginBufferSize)
259 beginBufferSize = beginBufferSize + beginBufferSize/2;
260 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
263 vertexPointer[count*vertexStride + 2] = r;
264 vertexPointer[count*vertexStride + 3] = g;
265 vertexPointer[count*vertexStride + 4] = b;
266 vertexPointer[count*vertexStride + 5] = a;
269 if(beginMode == quads && ((beginCount % 4) == 3))
271 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-4) * vertexStride + 2];
272 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-4) * vertexStride + 3];
273 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-4) * vertexStride + 4];
274 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-4) * vertexStride + 5];
276 vertexPointer[count*vertexStride + 2] = vertexPointer[(count-3) * vertexStride + 2];
277 vertexPointer[count*vertexStride + 3] = vertexPointer[(count-3) * vertexStride + 3];
278 vertexPointer[count*vertexStride + 4] = vertexPointer[(count-3) * vertexStride + 4];
279 vertexPointer[count*vertexStride + 5] = vertexPointer[(count-3) * vertexStride + 5];
285 #if ENABLE_GL_SHADERS
287 shader_color(r, g, b, a);
293 glColor4f(r, g, b, a);
296 float color[4] = { r, g, b, a };
297 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color);
298 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color);
305 public void glimtkColor3f( float r, float g, float b )
307 glimtkColor4f(r, g, b, 1.0f);
310 public void glimtkColor4ub(byte r, byte g, byte b, byte a)
312 glimtkColor4f(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
315 public void glimtkColor4fv(float * a)
317 glimtkColor4f(a[0], a[1], a[2], a[3]);
320 public void glimtkBufferDatad(int target, int size, void * data, int usage)
322 int numElems = size/sizeof(double);
323 double * dblPtr = (double *)data;
325 if (numElems > floatVPSize)
327 floatVPSize = numElems;
328 floatVPBuffer = renew floatVPBuffer float[floatVPSize];
330 for (i=0; i< numElems; i++)
331 floatVPBuffer[i] = (float)dblPtr[i];
333 glBufferData(target, numElems*sizeof(float), floatVPBuffer, usage);
336 public void glimtkBufferDatai(int target, int size, void * data, int usage)
338 int numElems = size/sizeof(unsigned int);
339 unsigned int * pointer = (unsigned int *)data;
341 if (numElems > shortBDSize)
343 shortBDSize = numElems;
344 shortBDBuffer = renew shortBDBuffer uint16[shortBDSize];
346 for (i=0; i< numElems; i++)
347 shortBDBuffer[i] = (unsigned short)pointer[i];
349 glBufferData(target, numElems*sizeof(unsigned short), shortBDBuffer, usage);
352 public void glimtkVertex3f( float x, float y, float z )
355 vertexStride = vertexOffset + numVertexCoords;
357 if(vertexCount + vertexStride > beginBufferSize)
359 beginBufferSize = beginBufferSize + beginBufferSize/2;
360 vertexPointer = renew vertexPointer float[beginBufferSize * vertexStride];
363 vertexPointer[vertexCount*vertexStride+vertexOffset] = x;
364 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = y;
365 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = z;
368 if(beginMode == quads && ((beginCount % 4) == 3))
370 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset];
371 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+1];
372 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-4)*vertexStride+vertexOffset+2];
374 vertexPointer[vertexCount*vertexStride+vertexOffset] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset];
375 vertexPointer[vertexCount*vertexStride+vertexOffset+1] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+1];
376 vertexPointer[vertexCount*vertexStride+vertexOffset+2] = vertexPointer[(vertexCount-3)*vertexStride+vertexOffset+2];
382 public void glimtkVertex3d( double x, double y, double z ) { glimtkVertex3f((float)x, (float)y, (float)z); }
383 public void glimtkVertex3fv( float* coords ) { glimtkVertex3f(coords[0], coords[1], coords[2]); }
384 public void glimtkVertex3dv( double* coords ) { glimtkVertex3f((float)coords[0], (float)coords[1], (float)coords[2]); }
386 public void glimtkNormal3f(float x, float y, float z)
388 normalCount = vertexCount;
389 if(vertexCount + 4 > normalBufferSize)
391 normalBufferSize = normalBufferSize + normalBufferSize/2;
392 normalPointer = renew normalPointer float[normalBufferSize * 2];
395 normalPointer[normalCount*3+0] = x;
396 normalPointer[normalCount*3+1] = y;
397 normalPointer[normalCount*3+2] = z;
400 if(beginMode == quads && ((beginCount % 4) == 3))
402 normalPointer[normalCount*3+0] = normalPointer[(normalCount-4)*3+0];
403 normalPointer[normalCount*3+1] = normalPointer[(normalCount-4)*3+1];
404 normalPointer[normalCount*3+2] = normalPointer[(normalCount-4)*3+2];
406 normalPointer[normalCount*3+0] = normalPointer[(normalCount-3)*3+0];
407 normalPointer[normalCount*3+1] = normalPointer[(normalCount-3)*3+1];
408 normalPointer[normalCount*3+2] = normalPointer[(normalCount-3)*3+2];
412 public void glimtkNormal3fd(double x, double y, double z) { glimtkNormal3f((float)x, (float)y, (float)z); }
413 public void glimtkNormal3fv(float * coords) { glimtkNormal3f(coords[0], coords[1], coords[2]); }
415 public void glimtkTerminate()
417 delete vertexPointer;
418 delete normalPointer;
421 delete floatVPBuffer;
424 delete shortVPBuffer;
427 delete shortBDBuffer;