From ab98b0de45f7e5e93551117b4f16e54e54c42a9c Mon Sep 17 00:00:00 2001 From: Alexander Szpakowski Date: Tue, 1 Jan 2013 21:44:27 -0400 Subject: [PATCH] Added mipmap support to Image filter struct and OpenGL texture filter helper functions --- src/modules/graphics/Image.cpp | 1 + src/modules/graphics/Image.h | 2 ++ src/modules/graphics/opengl/OpenGL.cpp | 43 +++++++++++++++++++++----- 3 files changed, 38 insertions(+), 8 deletions(-) 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; }