Browse Source

Add get/setWrap to Framebuffer (issue #192).

vrld 14 years ago
parent
commit
a88c4c6a79

+ 31 - 4
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);
 	}
 

+ 5 - 1
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;
 	};