Browse Source

Added mipmap support to Image filter struct and OpenGL texture filter helper functions

Alexander Szpakowski 12 years ago
parent
commit
ab98b0de45

+ 1 - 0
src/modules/graphics/Image.cpp

@@ -30,6 +30,7 @@ Image::Filter Image::defaultFilter;
 Image::Filter::Filter()
 Image::Filter::Filter()
 	: min(FILTER_LINEAR)
 	: min(FILTER_LINEAR)
 	, mag(FILTER_LINEAR)
 	, mag(FILTER_LINEAR)
+	, mipmap(FILTER_NONE)
 {
 {
 }
 }
 
 

+ 2 - 0
src/modules/graphics/Image.h

@@ -46,6 +46,7 @@ public:
 	{
 	{
 		FILTER_LINEAR = 1,
 		FILTER_LINEAR = 1,
 		FILTER_NEAREST,
 		FILTER_NEAREST,
+		FILTER_NONE,
 		FILTER_MAX_ENUM
 		FILTER_MAX_ENUM
 	};
 	};
 
 
@@ -54,6 +55,7 @@ public:
 		Filter();
 		Filter();
 		FilterMode min;
 		FilterMode min;
 		FilterMode mag;
 		FilterMode mag;
+		FilterMode mipmap;
 	};
 	};
 
 
 	struct Wrap
 	struct Wrap

+ 35 - 8
src/modules/graphics/opengl/OpenGL.cpp

@@ -56,17 +56,28 @@ void setTextureFilter(const graphics::Image::Filter &f)
 {
 {
 	GLint gmin, gmag;
 	GLint gmin, gmag;
 	
 	
-	switch (f.min)
+	if (f.mipmap == Image::FILTER_NONE)
 	{
 	{
-	case Image::FILTER_NEAREST:
-		gmin = GL_NEAREST;
-		break;
-	case Image::FILTER_LINEAR:
-	default:
-		gmin = GL_LINEAR;
-		break;
+		if (f.min == Image::FILTER_NEAREST)
+			gmin = GL_NEAREST;
+		else // f.min == Image::FILTER_LINEAR
+			gmin = GL_LINEAR;
+	}
+	else
+	{
+		if (f.min == f.mipmap == Image::FILTER_NEAREST)
+			gmin = GL_NEAREST_MIPMAP_NEAREST;
+		else if (f.min == Image::FILTER_NEAREST && f.mipmap == Image::FILTER_LINEAR)
+			gmin = GL_NEAREST_MIPMAP_LINEAR;
+		else if (f.min == Image::FILTER_LINEAR && f.mipmap == Image::FILTER_NEAREST)
+			gmin = GL_LINEAR_MIPMAP_NEAREST;
+		else if (f.min == f.mipmap == Image::FILTER_LINEAR)
+			gmin = GL_LINEAR_MIPMAP_LINEAR;
+		else
+			gmin = GL_LINEAR;
 	}
 	}
 	
 	
+	
 	switch (f.mag)
 	switch (f.mag)
 	{
 	{
 	case Image::FILTER_NEAREST:
 	case Image::FILTER_NEAREST:
@@ -94,10 +105,26 @@ graphics::Image::Filter getTextureFilter()
 	{
 	{
 	case GL_NEAREST:
 	case GL_NEAREST:
 		f.min = Image::FILTER_NEAREST;
 		f.min = Image::FILTER_NEAREST;
+		f.mipmap = Image::FILTER_NONE;
+		break;
+	case GL_NEAREST_MIPMAP_NEAREST:
+		f.min = f.mipmap = Image::FILTER_NEAREST;
+		break;
+	case GL_NEAREST_MIPMAP_LINEAR:
+		f.min = Image::FILTER_NEAREST;
+		f.mipmap = Image::FILTER_LINEAR;
+		break;
+	case GL_LINEAR_MIPMAP_NEAREST:
+		f.min = Image::FILTER_LINEAR;
+		f.mipmap = Image::FILTER_NEAREST;
+		break;
+	case GL_LINEAR_MIPMAP_LINEAR:
+		f.min = f.mipmap = Image::FILTER_LINEAR;
 		break;
 		break;
 	case GL_LINEAR:
 	case GL_LINEAR:
 	default:
 	default:
 		f.min = Image::FILTER_LINEAR;
 		f.min = Image::FILTER_LINEAR;
+		f.mipmap = Image::FILTER_NONE;
 		break;
 		break;
 	}
 	}