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

This commit is contained in:
Alexander Szpakowski
2013-01-01 21:44:27 -04:00
parent 1678252b7a
commit ab98b0de45
3 changed files with 38 additions and 8 deletions
+1
View File
@@ -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
View File
@@ -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
+33 -6
View File
@@ -56,16 +56,27 @@ 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: if (f.min == Image::FILTER_NEAREST)
gmin = GL_NEAREST; gmin = GL_NEAREST;
break; else // f.min == Image::FILTER_LINEAR
case Image::FILTER_LINEAR:
default:
gmin = GL_LINEAR; gmin = GL_LINEAR;
break;
} }
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)
{ {
@@ -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;
} }