diff --git a/src/modules/graphics/opengl/Framebuffer.cpp b/src/modules/graphics/opengl/Framebuffer.cpp index 298f39c74..93575d70b 100644 --- a/src/modules/graphics/opengl/Framebuffer.cpp +++ b/src/modules/graphics/opengl/Framebuffer.cpp @@ -286,7 +286,7 @@ namespace opengl return img; } - void Framebuffer::setFilter(Image::Filter f) + void Framebuffer::setFilter(const Image::Filter &f) { GLint gmin = (f.min == Image::FILTER_NEAREST) ? GL_NEAREST : GL_LINEAR; GLint gmag = (f.mag == Image::FILTER_NEAREST) ? GL_NEAREST : GL_LINEAR; @@ -311,18 +311,45 @@ namespace opengl return f; } + void Framebuffer::setWrap(const Image::Wrap &w) + { + GLint wrap_s = (w.s == Image::WRAP_CLAMP) ? GL_CLAMP_TO_EDGE : GL_REPEAT; + GLint wrap_t = (w.t == Image::WRAP_CLAMP) ? GL_CLAMP_TO_EDGE : GL_REPEAT; + + glBindTexture(GL_TEXTURE_2D, img); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t); + } + + Image::Wrap Framebuffer::getWrap() const + { + GLint wrap_s, wrap_t; + glBindTexture(GL_TEXTURE_2D, img); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &wrap_s); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, &wrap_t); + + Image::Wrap w; + w.s = (wrap_s == GL_CLAMP_TO_EDGE) ? Image::WRAP_CLAMP : Image::WRAP_REPEAT; + w.t = (wrap_t == GL_CLAMP_TO_EDGE) ? Image::WRAP_CLAMP : Image::WRAP_REPEAT; + + return w; + } + bool Framebuffer::loadVolatile() { status = strategy->createFBO(fbo, depthbuffer, img, width, height); - if (status == GL_FRAMEBUFFER_COMPLETE) - setFilter(settings.filter); + if (status != GL_FRAMEBUFFER_COMPLETE) + return false; - return (status == GL_FRAMEBUFFER_COMPLETE); + setFilter(settings.filter); + setWrap(settings.wrap); + return true; } void Framebuffer::unloadVolatile() { settings.filter = getFilter(); + settings.wrap = getWrap(); strategy->deleteFBO(fbo, depthbuffer, img); } diff --git a/src/modules/graphics/opengl/Framebuffer.h b/src/modules/graphics/opengl/Framebuffer.h index 486bc02a2..c8faae295 100644 --- a/src/modules/graphics/opengl/Framebuffer.h +++ b/src/modules/graphics/opengl/Framebuffer.h @@ -32,9 +32,12 @@ namespace opengl virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const; love::image::ImageData * getImageData(love::image::Image * image); - void setFilter(Image::Filter f); + void setFilter(const Image::Filter &f); Image::Filter getFilter() const; + void setWrap(const Image::Wrap &w); + Image::Wrap getWrap() const; + bool loadVolatile(); void unloadVolatile(); @@ -51,6 +54,7 @@ namespace opengl struct { Image::Filter filter; + Image::Wrap wrap; } settings; }; diff --git a/src/modules/graphics/opengl/wrap_Framebuffer.cpp b/src/modules/graphics/opengl/wrap_Framebuffer.cpp index a01976843..a15c18d41 100644 --- a/src/modules/graphics/opengl/wrap_Framebuffer.cpp +++ b/src/modules/graphics/opengl/wrap_Framebuffer.cpp @@ -51,7 +51,7 @@ namespace opengl if (!Image::getConstant(minstr, f.min)) return luaL_error(L, "Invalid min filter mode: %s", minstr); if (!Image::getConstant(magstr, f.mag)) - return luaL_error(L, "Invalid max filter mode: %s", minstr); + return luaL_error(L, "Invalid max filter mode: %s", magstr); fbo->setFilter(f); return 0; @@ -73,11 +73,45 @@ namespace opengl return 2; } + int w_Framebuffer_setWrap(lua_State * L) + { + Framebuffer * fbo = luax_checkfbo(L, 1); + const char * wrap_s = luaL_checkstring(L, 2); + const char * wrap_t = luaL_checkstring(L, 3); + + Image::Wrap w; + if (!Image::getConstant(wrap_s, w.s)) + return luaL_error(L, "Invalid wrap mode: %s", wrap_s); + if (!Image::getConstant(wrap_t, w.t)) + return luaL_error(L, "Invalid wrap mode: %s", wrap_t); + + fbo->setWrap(w); + return 0; + } + + int w_Framebuffer_getWrap(lua_State * L) + { + Framebuffer * fbo = luax_checkfbo(L, 1); + Image::Wrap w = fbo->getWrap(); + + const char * wrap_s; + const char * wrap_t; + Image::getConstant(w.s, wrap_s); + Image::getConstant(w.t, wrap_t); + + lua_pushstring(L, wrap_s); + lua_pushstring(L, wrap_t); + + return 2; + } + static const luaL_Reg functions[] = { { "renderTo", w_Framebuffer_renderTo }, { "getImageData", w_Framebuffer_getImageData }, { "setFilter", w_Framebuffer_setFilter }, { "getFilter", w_Framebuffer_getFilter }, + { "setWrap", w_Framebuffer_setWrap }, + { "getWrap", w_Framebuffer_getWrap }, { 0, 0 } }; diff --git a/src/modules/graphics/opengl/wrap_Framebuffer.h b/src/modules/graphics/opengl/wrap_Framebuffer.h index ae0cc8873..55bf99da4 100644 --- a/src/modules/graphics/opengl/wrap_Framebuffer.h +++ b/src/modules/graphics/opengl/wrap_Framebuffer.h @@ -17,6 +17,8 @@ namespace opengl int w_Framebuffer_getImageData(lua_State * L); int w_Framebuffer_setFilter(lua_State * L); int w_Framebuffer_getFilter(lua_State * L); + int w_Framebuffer_setWrap(lua_State * L); + int w_Framebuffer_getWrap(lua_State * L); int luaopen_framebuffer(lua_State * L); } // opengl diff --git a/src/modules/physics/box2d/World.cpp b/src/modules/physics/box2d/World.cpp index cc338b11c..87594530f 100644 --- a/src/modules/physics/box2d/World.cpp +++ b/src/modules/physics/box2d/World.cpp @@ -96,14 +96,14 @@ namespace box2d } World::World(b2AABB aabb) - : meter(DEFAULT_METER), world(NULL) + : world(NULL), meter(DEFAULT_METER) { world = new b2World(scaleDown(aabb), b2Vec2(0,0), true); world->SetContactListener(this); } World::World(b2AABB aabb, b2Vec2 gravity, bool sleep, int meter) - : meter(meter), world(NULL) + : world(NULL), meter(meter) { world = new b2World(scaleDown(aabb), scaleDown(gravity), sleep); world->SetContactListener(this);