From a88c4c6a79ef11dbf3f2fdcefac96fc31b9a8c78 Mon Sep 17 00:00:00 2001 From: vrld Date: Thu, 10 Mar 2011 13:41:25 +0100 Subject: [PATCH] Add get/setWrap to Framebuffer (issue #192). --- src/modules/graphics/opengl/Framebuffer.cpp | 35 ++++++++++++++++++--- src/modules/graphics/opengl/Framebuffer.h | 6 +++- 2 files changed, 36 insertions(+), 5 deletions(-) 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; };