diff --git a/doomsday/libgui/include/de/gui/gltexture.h b/doomsday/libgui/include/de/gui/gltexture.h index b0983a2758..d38ad674cd 100644 --- a/doomsday/libgui/include/de/gui/gltexture.h +++ b/doomsday/libgui/include/de/gui/gltexture.h @@ -112,6 +112,7 @@ class LIBGUI_PUBLIC GLTexture : public Asset setWrapS(st.x); setWrapT(st.y); } + void setMaxAnisotropy(dfloat maxAnisotropy); gl::Filter minFilter() const; gl::Filter magFilter() const; @@ -119,6 +120,7 @@ class LIBGUI_PUBLIC GLTexture : public Asset gl::Wrapping wrapS() const; gl::Wrapping wrapT() const; Wraps wrap() const; + dfloat maxAnisotropy() const; bool isCubeMap() const; diff --git a/doomsday/libgui/src/gltexture.cpp b/doomsday/libgui/src/gltexture.cpp index 734dcf5b8a..3dda634e44 100644 --- a/doomsday/libgui/src/gltexture.cpp +++ b/doomsday/libgui/src/gltexture.cpp @@ -17,6 +17,7 @@ */ #include "de/GLTexture" +#include "de/GLInfo" #include "de/gui/opengl.h" namespace de { @@ -46,16 +47,18 @@ DENG2_PIMPL(GLTexture) Filter magFilter; MipFilter mipFilter; Wraps wrap; + dfloat maxAnisotropy; TextureFlags flags; Instance(Public *i) - : Base(i), - format(Image::Unknown), - name(0), - texTarget(GL_TEXTURE_2D), - minFilter(Linear), magFilter(Linear), mipFilter(MipNone), - wrap(Wraps(Repeat, Repeat)), - flags(ParamsChanged) + : Base(i) + , format(Image::Unknown) + , name(0) + , texTarget(GL_TEXTURE_2D) + , minFilter(Linear), magFilter(Linear), mipFilter(MipNone) + , wrap(Wraps(Repeat, Repeat)) + , maxAnisotropy(1.0f) + , flags(ParamsChanged) {} ~Instance() @@ -156,12 +159,17 @@ DENG2_PIMPL(GLTexture) * calling. */ void glUpdateParamsOfBoundTexture() - { + { glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, glWrap(wrap.x)); glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, glWrap(wrap.y)); glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, magFilter == Nearest? GL_NEAREST : GL_LINEAR); glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, glMinFilter(minFilter, mipFilter)); + if(GLInfo::extensions().EXT_texture_filter_anisotropic) + { + glTexParameteri(texTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy); + } + LIBGUI_ASSERT_GL_OK(); flags &= ~ParamsChanged; @@ -242,6 +250,12 @@ void GLTexture::setWrapT(Wrapping mode) d->flags |= ParamsChanged; } +void GLTexture::setMaxAnisotropy(dfloat maxAnisotropy) +{ + d->maxAnisotropy = maxAnisotropy; + d->flags |= ParamsChanged; +} + Filter GLTexture::minFilter() const { return d->minFilter; @@ -272,6 +286,11 @@ GLTexture::Wraps GLTexture::wrap() const return d->wrap; } +dfloat GLTexture::maxAnisotropy() const +{ + return d->maxAnisotropy; +} + bool GLTexture::isCubeMap() const { return d->isCube();