diff --git a/src/modules/graphics/Image.cpp b/src/modules/graphics/Image.cpp index 1e2b093be..c985cd482 100644 --- a/src/modules/graphics/Image.cpp +++ b/src/modules/graphics/Image.cpp @@ -30,6 +30,7 @@ Image::Filter Image::defaultFilter; Image::Filter::Filter() : min(FILTER_LINEAR) , mag(FILTER_LINEAR) + , mipmap(FILTER_NONE) { } diff --git a/src/modules/graphics/Image.h b/src/modules/graphics/Image.h index 85ef7f55d..881ae94fc 100644 --- a/src/modules/graphics/Image.h +++ b/src/modules/graphics/Image.h @@ -46,6 +46,7 @@ public: { FILTER_LINEAR = 1, FILTER_NEAREST, + FILTER_NONE, FILTER_MAX_ENUM }; @@ -54,6 +55,7 @@ public: Filter(); FilterMode min; FilterMode mag; + FilterMode mipmap; }; struct Wrap diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp index b1292b1d7..4cae16000 100644 --- a/src/modules/graphics/opengl/OpenGL.cpp +++ b/src/modules/graphics/opengl/OpenGL.cpp @@ -56,16 +56,27 @@ void setTextureFilter(const graphics::Image::Filter &f) { 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) { @@ -94,10 +105,26 @@ graphics::Image::Filter getTextureFilter() { case GL_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; case GL_LINEAR: default: f.min = Image::FILTER_LINEAR; + f.mipmap = Image::FILTER_NONE; break; }