浏览代码

Use *ARB versions for VBOs in SpriteBatch. Throw error if SpriteBatch not
supported. Prettier overloading of SpriteBatch:add[q]().

vrld 14 年之前
父节点
当前提交
6ea187b2f1

+ 8 - 1
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)

+ 28 - 25
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);
 		}
 	}
 

+ 6 - 1
src/modules/graphics/opengl/wrap_Graphics.cpp

@@ -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;
 	}

+ 17 - 9
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

+ 31 - 26
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]