From 6ea187b2f186894de6b2653479d35e02373a3549 Mon Sep 17 00:00:00 2001 From: vrld Date: Tue, 5 Jul 2011 16:06:14 +0200 Subject: [PATCH] Use *ARB versions for VBOs in SpriteBatch. Throw error if SpriteBatch not supported. Prettier overloading of SpriteBatch:add[q](). --- src/modules/graphics/opengl/Graphics.cpp | 9 ++- src/modules/graphics/opengl/SpriteBatch.cpp | 53 +++++++++-------- src/modules/graphics/opengl/wrap_Graphics.cpp | 7 ++- src/scripts/graphics.lua | 26 ++++++--- src/scripts/graphics.lua.h | 57 ++++++++++--------- 5 files changed, 90 insertions(+), 62 deletions(-) diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 9bf061b29..c131f6c6f 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -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) diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 36fd63ab2..51cb9b4db 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -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); } } diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index d8b3b602c..47c23c8a4 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -311,7 +311,12 @@ namespace opengl Image * image = luax_checktype(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; } diff --git a/src/scripts/graphics.lua b/src/scripts/graphics.lua index 005d488b9..9cf2c588f 100644 --- a/src/scripts/graphics.lua +++ b/src/scripts/graphics.lua @@ -1306,14 +1306,22 @@ AAIAAAxQCuxfDzz1AB8IAAAAAAC6ufC4AAAAALrCZ5H+if4dCkwHbQAAAAgAAQAAAAAAAA== return lgprint(text, x,y, unpack_transform(...)) end - local temp_img = love.graphics.newImage(love.image.newImageData(0,0)) - local temp_spritebatch = love.graphics.newSpriteBatch(temp_img, 0) - local sb_meta = getmetatable(temp_spritebatch) - local add, addq = sb_meta.add, sb_meta.addq - function sb_meta:add(x,y, ...) - return add(self, x,y, unpack_transform(...)) - end - function sb_meta:addq(quad, x,y, ...) - return addq(self, quad, x,y, unpack_transform(...)) + local newSpritebatch = love.graphics.newSpriteBatch + function love.graphics.newSpriteBatch(image, size) + local sb = newSpritebatch(image, size) + local meta = getmetatable(sb) + + local add = meta.add + function meta:add(x,y, ...) + return add(self, x,y, unpack_transform(...)) + end + + local addq = meta.addq + function meta:addq(quad, x,y, ...) + return addq(self, quad, x,y, unpack_transform(...)) + end + + love.graphics.newSpriteBatch = newSpritebatch + return sb end end diff --git a/src/scripts/graphics.lua.h b/src/scripts/graphics.lua.h index dd28fcb04..b1e510d5e 100644 --- a/src/scripts/graphics.lua.h +++ b/src/scripts/graphics.lua.h @@ -5086,32 +5086,37 @@ const unsigned char graphics_lua[] = 0x65, 0x78, 0x74, 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x69, 0x6d, 0x67, 0x20, 0x3d, 0x20, - 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, - 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x29, 0x29, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x73, 0x70, 0x72, 0x69, 0x74, 0x65, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x69, 0x6d, 0x67, 0x2c, 0x20, 0x30, 0x29, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x62, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x67, - 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x73, - 0x70, 0x72, 0x69, 0x74, 0x65, 0x62, 0x61, 0x74, 0x63, 0x68, 0x29, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x2c, 0x20, 0x61, 0x64, 0x64, 0x71, 0x20, 0x3d, - 0x20, 0x73, 0x62, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x61, 0x64, 0x64, 0x2c, 0x20, 0x73, 0x62, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x2e, 0x61, 0x64, 0x64, 0x71, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x62, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x3a, - 0x61, 0x64, 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, - 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x0a, - 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x62, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x3a, - 0x61, 0x64, 0x64, 0x71, 0x28, 0x71, 0x75, 0x61, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x2e, 0x2e, - 0x2e, 0x29, 0x0a, - 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x71, 0x28, 0x73, 0x65, 0x6c, 0x66, - 0x2c, 0x20, 0x71, 0x75, 0x61, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, - 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x53, 0x70, + 0x72, 0x69, 0x74, 0x65, 0x62, 0x61, 0x74, 0x63, 0x68, 0x28, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x62, 0x29, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, 0x61, + 0x2e, 0x61, 0x64, 0x64, 0x0a, + 0x09, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x61, 0x64, + 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x71, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x74, + 0x61, 0x2e, 0x61, 0x64, 0x64, 0x71, 0x0a, + 0x09, 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x3a, 0x61, 0x64, + 0x64, 0x71, 0x28, 0x71, 0x75, 0x61, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x71, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x71, 0x75, 0x61, 0x64, 0x2c, 0x20, 0x78, 0x2c, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a,0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, + 0x77, 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, + 0x53, 0x70, 0x72, 0x69, 0x74, 0x65, 0x62, 0x61, 0x74, 0x63, 0x68, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x62, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, }; // [graphics.lua]