diff --git a/platform/msvc2008/love.vcproj b/platform/msvc2008/love.vcproj index e5b41c39b..95acd0382 100644 --- a/platform/msvc2008/love.vcproj +++ b/platform/msvc2008/love.vcproj @@ -961,6 +961,14 @@ RelativePath="..\..\src\modules\graphics\opengl\ImageFont.h" > + + + + @@ -1081,6 +1089,14 @@ RelativePath="..\..\src\modules\graphics\opengl\wrap_Image.h" > + + + + + +// LOVE +#include "Image.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + SpriteBatch::SpriteBatch(Image * image, int size, int usage) + : image(image), size(size), next(0), usage(usage) + { + image->retain(); + + vertices = new vertex[size*4]; + indices = new GLushort[size*6]; + + for(int i = 0; irelease(); + + if(vbo[0] != 0 && vbo[1] != 0) + glDeleteBuffers(2, vbo); + + delete [] vertices; + delete [] indices; + } + + void SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, float oy) + { + // Only do this if there's a free slot. + if(next < size) + { + // Get a pointer to the correct insertion position. + vertex * v = vertices + next*4; + + memcpy(v, image->getVertices(), sizeof(vertex)*4); + + // Transform. + Matrix t; + t.translate(x, y); + t.scale(sx, sy); + t.rotate(a); + t.transform(v, v, 4); + + glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); + glBufferSubData(GL_ARRAY_BUFFER, (next*4)*sizeof(vertex), sizeof(vertex)*4, v); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + // Increment counter. + next++; + } + } + + void SpriteBatch::clear() + { + // Reset the position of the next index. + next = 0; + } + + void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const + { + glPushMatrix(); + glTranslatef(x, y, 0); + + image->bind(); + + // Enable vertex arrays. + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + + // Bind the VBO buffer. + glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]); + glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(vertex), (GLvoid*)0); + 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)); + + glDrawElements(GL_TRIANGLES, next*6, GL_UNSIGNED_SHORT, 0); + + // Disable vertex arrays. + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + + glPopMatrix(); + } + +} // opengl +} // graphics +} // love diff --git a/src/modules/graphics/opengl/SpriteBatch.h b/src/modules/graphics/opengl/SpriteBatch.h new file mode 100644 index 000000000..9e1a82114 --- /dev/null +++ b/src/modules/graphics/opengl/SpriteBatch.h @@ -0,0 +1,97 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H +#define LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H + +// C +#include + +// LOVE +#include +#include +#include +#include +#include + +// OpenGL +#include "GLee.h" +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + // Forward declarations. + class Image; + + class SpriteBatch : public Drawable + { + private: + + Image * image; + + // Max number of sprites in the batch. + int size; + + // The next free element. + int next; + + GLuint vbo[2]; + + // Vertex Buffer. + vertex * vertices; + + // Index buffer. + GLushort * indices; + + // The uage hint for the vertex buffer. + int usage; + int gl_usage; + + public: + + enum UsageHint + { + USAGE_DYNAMIC, + USAGE_STATIC, + USAGE_STREAM + }; + + SpriteBatch(Image * image, int size, int usage); + virtual ~SpriteBatch(); + + void add(float x, float y, float a, float sx, float sy, float ox, float oy); + //void adds(float x, float y, float a, float sx, float sy, float ox, float oy, float rx, float ry, float rw, float rh); + //void addf(float x, float y, float a, float sx, float sy, float ox, float oy, Frame * frame); + void clear(); + + // Implements Drawable. + void draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const; + + }; // SpriteBatch + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 534950e8e..5df635d9b 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -17,6 +17,7 @@ * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. **/ + #include "wrap_Graphics.h" namespace love @@ -218,17 +219,15 @@ namespace opengl return 1; } - /* int _wrap_newSpriteBatch(lua_State * L) { Image * image = luax_checktype(L, 1, "Image", LOVE_GRAPHICS_IMAGE_BITS); int size = luaL_optint(L, 2, 1000); - int usage = luaL_optint(L, 3, USAGE_ARRAY); + int usage = luaL_optint(L, 3, SpriteBatch::USAGE_DYNAMIC); SpriteBatch * t = instance->newSpriteBatch(image, size, usage); luax_newtype(L, "SpriteBatch", LOVE_GRAPHICS_SPRITE_BATCH_BITS, (void*)t); return 1; } - */ int _wrap_setColor(lua_State * L) { @@ -686,7 +685,7 @@ namespace opengl { "newFrame", _wrap_newFrame }, { "newFont", _wrap_newFont }, { "newImageFont", _wrap_newImageFont }, - //{ "newSpriteBatch", _wrap_newSpriteBatch }, + { "newSpriteBatch", _wrap_newSpriteBatch }, { "setColor", _wrap_setColor }, { "getColor", _wrap_getColor }, @@ -757,7 +756,7 @@ namespace opengl wrap_Font_open, wrap_Image_open, wrap_Frame_open, - //wrap_SpriteBatch_open, + wrap_SpriteBatch_open, 0 }; diff --git a/src/modules/graphics/opengl/wrap_Graphics.h b/src/modules/graphics/opengl/wrap_Graphics.h index 5f5016f3d..16d154d4e 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.h +++ b/src/modules/graphics/opengl/wrap_Graphics.h @@ -25,6 +25,7 @@ #include "wrap_Font.h" #include "wrap_Image.h" #include "wrap_Frame.h" +#include "wrap_SpriteBatch.h" #include "Graphics.h" namespace love @@ -46,14 +47,11 @@ namespace opengl int _wrap_isCreated(lua_State * L); int _wrap_setScissor(lua_State * L); int _wrap_getScissor(lua_State * L); - int _wrap_newColor(lua_State * L); int _wrap_newImage(lua_State * L); int _wrap_newFrame(lua_State * L); - int _wrap_newAnimation(lua_State * L); int _wrap_newFont(lua_State * L); int _wrap_newImageFont(lua_State * L); int _wrap_newSpriteBatch(lua_State * L); - int _wrap_newVertexBuffer(lua_State * L); int _wrap_setColor(lua_State * L); int _wrap_getColor(lua_State * L); int _wrap_setBackgroundColor(lua_State * L); diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp new file mode 100644 index 000000000..29b8d66bc --- /dev/null +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -0,0 +1,69 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#include "wrap_SpriteBatch.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + SpriteBatch * luax_checkspritebatch(lua_State * L, int idx) + { + return luax_checktype(L, idx, "SpriteBatch", LOVE_GRAPHICS_SPRITE_BATCH_BITS); + } + + int _wrap_SpriteBatch_add(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + float x = (float)luaL_optnumber(L, 2, 0.0f); + float y = (float)luaL_optnumber(L, 3, 0.0f); + float angle = (float)luaL_optnumber(L, 4, 0.0f); + float sx = (float)luaL_optnumber(L, 5, 1.0f); + float sy = (float)luaL_optnumber(L, 6, sx); + float ox = (float)luaL_optnumber(L, 7, 0); + float oy = (float)luaL_optnumber(L, 8, 0); + t->add(x, y, angle, sx, sy, ox, oy); + return 0; + } + + int _wrap_SpriteBatch_clear(lua_State * L) + { + SpriteBatch * t = luax_checkspritebatch(L, 1); + t->clear(); + return 0; + } + + static const luaL_Reg wrap_SpriteBatch_functions[] = { + { "add", _wrap_SpriteBatch_add }, + { "clear", _wrap_SpriteBatch_clear }, + { 0, 0 } + }; + + int wrap_SpriteBatch_open(lua_State * L) + { + luax_register_type(L, "SpriteBatch", wrap_SpriteBatch_functions); + return 0; + } + +} // opengl +} // graphics +} // love \ No newline at end of file diff --git a/src/modules/graphics/opengl/wrap_SpriteBatch.h b/src/modules/graphics/opengl/wrap_SpriteBatch.h new file mode 100644 index 000000000..5d56fbabd --- /dev/null +++ b/src/modules/graphics/opengl/wrap_SpriteBatch.h @@ -0,0 +1,42 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H +#define LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H + +#include +#include "SpriteBatch.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + SpriteBatch * luax_checkspritebatch(lua_State * L, int idx); + int _wrap_SpriteBatch_add(lua_State * L); + int _wrap_SpriteBatch_clear(lua_State * L); + int wrap_SpriteBatch_open(lua_State * L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H