Use *ARB versions for VBOs in SpriteBatch. Throw error if SpriteBatch not

supported. Prettier overloading of SpriteBatch:add[q]().
This commit is contained in:
vrld
2011-07-05 16:06:14 +02:00
parent dd143c76ac
commit 6ea187b2f1
5 changed files with 90 additions and 62 deletions
+8 -1
View File
@@ -507,7 +507,14 @@ namespace opengl
SpriteBatch * Graphics::newSpriteBatch(Image * image, int size, int usage)
{
return new SpriteBatch(image, size, usage);
SpriteBatch * t = NULL;
try {
t = new SpriteBatch(image, size, usage);
} catch (love::Exception& e) {
if (t) delete t;
throw e;
}
return t;
}
ParticleSystem * Graphics::newParticleSystem(Image * image, int size)
+28 -25
View File
@@ -36,6 +36,9 @@ namespace opengl
SpriteBatch::SpriteBatch(Image * image, int size, int usage)
: image(image), size(size), next(0), usage(usage), lockp(0)
{
if (!(GLEE_ARB_vertex_buffer_object || GLEE_VERSION_1_5))
throw love::Exception("Your OpenGL version does not support SpriteBatches. Go upgrade!");
image->retain();
vertices = new vertex[size*4];
@@ -69,20 +72,20 @@ namespace opengl
bool SpriteBatch::loadVolatile()
{
// Find out which OpenGL VBO usage hint to use.
gl_usage = GL_STREAM_DRAW;
gl_usage = (usage == USAGE_DYNAMIC) ? GL_DYNAMIC_DRAW : gl_usage;
gl_usage = (usage == USAGE_STATIC) ? GL_STATIC_DRAW : gl_usage;
gl_usage = (usage == USAGE_STREAM) ? GL_STREAM_DRAW : gl_usage;
gl_usage = GL_STREAM_DRAW_ARB;
gl_usage = (usage == USAGE_DYNAMIC) ? GL_DYNAMIC_DRAW_ARB : gl_usage;
gl_usage = (usage == USAGE_STATIC) ? GL_STATIC_DRAW_ARB : gl_usage;
gl_usage = (usage == USAGE_STREAM) ? GL_STREAM_DRAW_ARB : gl_usage;
glGenBuffers(2, vbo);
glGenBuffersARB(2, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex)*size*4, vertices, gl_usage);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(vertex)*size*4, vertices, gl_usage);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*size*6, indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[1]);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(GLushort)*size*6, indices, GL_STATIC_DRAW_ARB);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
return true;
}
@@ -98,7 +101,7 @@ namespace opengl
// Delete the buffers.
if(vbo[0] != 0 && vbo[1] != 0)
glDeleteBuffers(2, vbo);
glDeleteBuffersARB(2, vbo);
}
void SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky)
@@ -159,18 +162,18 @@ namespace opengl
if(lockp != 0)
return lockp;
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
lockp = (vertex *)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]);
lockp = (vertex *)glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_READ_WRITE_ARB);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
return lockp;
}
void SpriteBatch::unlock()
{
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]);
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
lockp = 0;
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
void SpriteBatch::setImage(Image * newimage)
@@ -196,8 +199,8 @@ namespace opengl
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Bind the VBO buffer.
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vbo[1]);
glVertexPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)(sizeof(unsigned char)*4));
glTexCoordPointer(2, GL_FLOAT, sizeof(vertex), (GLvoid*)(sizeof(unsigned char)*4+sizeof(float)*2));
@@ -207,8 +210,8 @@ namespace opengl
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
glPopMatrix();
}
@@ -223,9 +226,9 @@ namespace opengl
else
{
// ... use glBufferSubData otherwise.
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferSubData(GL_ARRAY_BUFFER, (next*4)*sizeof(vertex), sizeof(vertex)*4, v);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo[0]);
glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, (next*4)*sizeof(vertex), sizeof(vertex)*4, v);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
}
}
@@ -311,7 +311,12 @@ namespace opengl
Image * image = luax_checktype<Image>(L, 1, "Image", GRAPHICS_IMAGE_T);
int size = luaL_optint(L, 2, 1000);
int usage = luaL_optint(L, 3, SpriteBatch::USAGE_DYNAMIC);
SpriteBatch * t = instance->newSpriteBatch(image, size, usage);
SpriteBatch * t = NULL;
try {
t = instance->newSpriteBatch(image, size, usage);
} catch(love::Exception& e) {
return luaL_error(L, e.what());
}
luax_newtype(L, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T, (void*)t);
return 1;
}