#define GL_CLAMP_TO_EDGE 0x812F
-static bool vboAvailable;
+/*static */bool vboAvailable;
static bool useSingleGLContext = false;
class OGLDisplay : struct
oglSystem.pow2textures = (extensions && strstr(extensions, "GL_ARB_texture_non_power_of_two")) ? false : true;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &oglSystem.maxTextureSize);
+#ifdef DIAGNOSTICS
+ PrintLn("max texture size: ", oglSystem.maxTextureSize);
+#endif
}
bool CreateDisplaySystem(DisplaySystem displaySystem)
case vSync:
{
#if defined(__WIN32__)
- wglSwapIntervalEXT(value ? 1 : 0);
+ if(wglSwapIntervalEXT)
+ wglSwapIntervalEXT(value ? 1 : 0);
#endif
break;
}
{
OGLIndices oglIndices = primitive->data;
- GLEAB eab = ((!display.display3D.collectingHits && oglIndices) ? oglIndices.buffer : noEAB);
-
+ GLEAB eab = ((!display.display3D.collectingHits && oglIndices && vboAvailable) ? oglIndices.buffer : noEAB);
+#if defined(ES1_1) || defined(ES2)
+ if(!vboAvailable && primitive->type.indices32bit)
+ {
+ uint16 * temp = new uint16[primitive->nIndices];
+ uint32 * src = (uint32 *)(oglIndices ? oglIndices.indices : primitive->indices);
+ int i;
+ for(i = 0; i < primitive->nIndices; i++)
+ temp[i] = (uint16)src[i];
+ eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices, GL_UNSIGNED_SHORT, temp);
+ delete temp;
+ }
+ else
+#endif
eab.draw(primitiveTypes[primitive->type.primitiveType], primitive->nIndices,
primitive->type.indices32bit ? GL_UNSIGNED_INT : GL_UNSIGNED_SHORT,
eab.buffer ? 0 : (oglIndices ? oglIndices.indices : primitive->indices));
// Kept public for now
public void GLABDeleteBuffers(int count, GLAB * buffers)
{
- int i;
- for(i = 0; i < count; i++)
+ if(vboAvailable)
{
- uint buffer = buffers[i].buffer;
- if(buffer)
+ int i;
+ for(i = 0; i < count; i++)
{
- if(buffer == glabCurArrayBuffer)
- GLABBindBuffer(GL_ARRAY_BUFFER, 0);
- else if(buffer == glabCurElementBuffer)
- GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ uint buffer = buffers[i].buffer;
+ if(buffer)
+ {
+ if(buffer == glabCurArrayBuffer)
+ GLABBindBuffer(GL_ARRAY_BUFFER, 0);
+ else if(buffer == glabCurElementBuffer)
+ GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
}
+ if(count && buffers[0].buffer)
+ glDeleteBuffers(count, (GLuint *)buffers);
}
- if(count && buffers[0].buffer)
- glDeleteBuffers(count, (GLuint *)buffers);
}
void GLABBindBuffer(int target, uint buffer)
{
- glBindBuffer(target, buffer);
- if(target == GL_ARRAY_BUFFER)
- glabCurArrayBuffer = buffer;
- else if(target == GL_ELEMENT_ARRAY_BUFFER)
- glabCurElementBuffer = buffer;
+ if(vboAvailable)
+ {
+ glBindBuffer(target, buffer);
+ if(target == GL_ARRAY_BUFFER)
+ glabCurArrayBuffer = buffer;
+ else if(target == GL_ELEMENT_ARRAY_BUFFER)
+ glabCurElementBuffer = buffer;
+ }
}
public enum GLBufferContents { vertex, normal, texCoord, color };
{
if(this != null)
{
- if(!buffer)
- glGenBuffers(1, &buffer);
- if(glabCurArrayBuffer != buffer)
- GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
- glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
+ if(vboAvailable)
+ {
+ if(!buffer)
+ glGenBuffers(1, &buffer);
+ if(glabCurArrayBuffer != buffer)
+ GLABBindBuffer(GL_ARRAY_BUFFER, buffer);
+ glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
+ }
+ else
+ buffer = 1;
}
}
{
if(this != null && buffer)
{
- GLABDeleteBuffers(1, this);
+ if(vboAvailable)
+ GLABDeleteBuffers(1, this);
buffer = 0;
}
}
void use(GLBufferContents contents, int n, int type, uint stride, void * pointer)
{
- if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
+ if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
#ifdef SHADERS
glVertexAttribPointer(contents, n, type, GL_FALSE, stride, pointer);
void useVertTrans(uint count, int n, int type, uint stride, void * pointer)
{
#if defined(_GLES) || defined(ES1_1) || defined(ES2)
- if(glabCurArrayBuffer != ((this != null) ? buffer : 0))
+ if(glabCurArrayBuffer != ((this != null) ? buffer : 0) && vboAvailable)
GLABBindBuffer(GL_ARRAY_BUFFER, ((this != null) ? buffer : 0));
if(type == GL_INT)
glimtkVertexPointeri(n, stride, pointer, count);
{
if(this != null)
{
- if(!buffer)
- glGenBuffers(1, &buffer);
-
- if(glabCurElementBuffer != buffer)
- GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
- if(size)
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
+ if(vboAvailable)
+ {
+ if(!buffer)
+ glGenBuffers(1, &buffer);
+
+ if(glabCurElementBuffer != buffer)
+ GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
+ if(size)
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW); //GL_DYNAMIC_DRAW);
+ else
+ ;
+ }
else
- ;
+ buffer = 1;
}
}
{
if(this != null && buffer)
{
- GLABDeleteBuffers(1, (GLAB *)this);
+ if(vboAvailable)
+ GLABDeleteBuffers(1, (GLAB *)this);
buffer = 0;
}
}
void draw(int primType, int count, int type, void * indices)
{
- if(glabCurElementBuffer != ((this != null) ? buffer : 0))
- GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
+ if(vboAvailable || !buffer)
+ {
+ if(glabCurElementBuffer != ((this != null) ? buffer : 0))
+ GLABBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ((this != null) ? buffer : 0));
#if defined(_GLES) || defined(ES1_1) || defined(ES2)
- type = GL_UNSIGNED_SHORT;
+ type = GL_UNSIGNED_SHORT;
#endif
- glDrawElements(primType, count, type, indices);
+ glDrawElements(primType, count, type, indices);
+ }
}
};
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
-
- streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
- // noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
+ if(vboAvailable)
+ {
+ streamVecAB.upload(vertexStride * sizeof(float) * vertexCount, vertexPointer);
+ streamVecAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), 0);
+ }
+ else
+ noAB.use(texCoord, 2, GL_FLOAT, vertexStride * sizeof(float), vertexPointer);
if(vertexColorValues)
{
glEnableClientState(GL_COLOR_ARRAY);
- streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
+ if(vboAvailable)
+ streamVecAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), (void *)(2 * sizeof(float)));
+ else
+ noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
#ifdef SHADERS
shader_setPerVertexColor(true);
#endif
-
-
- //noAB.use(color, 4, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + 2);
}
- streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
- // noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
+ if(vboAvailable)
+ streamVecAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), (void *)(vertexOffset * sizeof(float)));
+ else
+ noAB.use(vertex, numVertexCoords, GL_FLOAT, vertexStride * sizeof(float), vertexPointer + vertexOffset);
if(normalCount && normalCount == vertexCount)
{
glEnableClientState(GL_NORMAL_ARRAY);
- streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
- streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
- // noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
+ if(vboAvailable)
+ {
+ streamNorAB.upload(3*sizeof(float) * vertexCount, normalPointer);
+ streamNorAB.use(normal, 3, GL_FLOAT, 3*sizeof(float), 0);
+ }
+ else
+ noAB.use(normal, 3, GL_FLOAT, 3*sizeof(float),normalPointer);
}
glDrawArrays(mode, 0, vertexCount);