diff --git a/include/SMaterialLayer.h b/include/SMaterialLayer.h index c42cb718..56d8f123 100644 --- a/include/SMaterialLayer.h +++ b/include/SMaterialLayer.h @@ -45,7 +45,9 @@ namespace video TextureWrap(ETC_REPEAT), BilinearFilter(true), TrilinearFilter(false), - AnisotropicFilter(0), TextureMatrix(0) + AnisotropicFilter(0), + LODBias(0), + TextureMatrix(0) {} //! Copy constructor @@ -99,6 +101,7 @@ namespace video BilinearFilter = other.BilinearFilter; TrilinearFilter = other.TrilinearFilter; AnisotropicFilter = other.AnisotropicFilter; + LODBias = other.LODBias; return *this; } @@ -107,15 +110,15 @@ namespace video ITexture* Texture; //! Texture Clamp Mode - E_TEXTURE_CLAMP TextureWrap; + u8 TextureWrap; //! Is bilinear filtering enabled? Default: true - bool BilinearFilter; + bool BilinearFilter:1; //! Is trilinear filtering enabled? Default: false /** If the trilinear filter flag is enabled, the bilinear filtering flag is ignored. */ - bool TrilinearFilter; + bool TrilinearFilter:1; //! Is anisotropic filtering enabled? Default: 0, disabled /** In Irrlicht you can use anisotropic texture filtering @@ -126,6 +129,13 @@ namespace video Value 1 is equivalent to 0, but should be avoided. */ u8 AnisotropicFilter; + //! Bias for the mipmap choosing decision. + /** This value can make the textures more or less blurry than with the + default value of 0. The value (divided by 8.f) is added to the mipmap level + chosen initially, and thus takes a smaller mipmap for a region + if the value is positive. */ + s8 LODBias; + //! Gets the texture transformation matrix /** \return Texture matrix of this layer. */ core::matrix4& getTextureMatrix() @@ -171,7 +181,8 @@ namespace video TextureWrap != b.TextureWrap || BilinearFilter != b.BilinearFilter || TrilinearFilter != b.TrilinearFilter || - AnisotropicFilter != b.AnisotropicFilter; + AnisotropicFilter != b.AnisotropicFilter || + LODBias != b.LODBias; if (different) return true; else diff --git a/source/Irrlicht/CD3D8Driver.cpp b/source/Irrlicht/CD3D8Driver.cpp index 1a0f02f2..33f85e70 100644 --- a/source/Irrlicht/CD3D8Driver.cpp +++ b/source/Irrlicht/CD3D8Driver.cpp @@ -1469,6 +1469,12 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria // texture address mode for (u32 st=0; stSetTextureStageState(st, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)(&tmp)); + } + if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrap != material.TextureLayer[st].TextureWrap) { u32 mode = D3DTADDRESS_WRAP; diff --git a/source/Irrlicht/CD3D9Driver.cpp b/source/Irrlicht/CD3D9Driver.cpp index 0def8fe9..24bc4723 100644 --- a/source/Irrlicht/CD3D9Driver.cpp +++ b/source/Irrlicht/CD3D9Driver.cpp @@ -1828,6 +1828,12 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria // texture address mode for (u32 st=0; stSetSamplerState(st, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)(&tmp)); + } + if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrap != material.TextureLayer[st].TextureWrap) { u32 mode = D3DTADDRESS_WRAP; diff --git a/source/Irrlicht/COpenGLDriver.cpp b/source/Irrlicht/COpenGLDriver.cpp index 6467f595..8f92df10 100644 --- a/source/Irrlicht/COpenGLDriver.cpp +++ b/source/Irrlicht/COpenGLDriver.cpp @@ -2013,6 +2013,19 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater else if (i>0) break; +#ifdef EXT_texture_lod_bias + if (FeatureAvailable[IRR_EXT_texture_lod_bias]) + { + if (material.TextureLayer[i].LODBias) + { + const float tmp = core::clamp(material.TextureLayer[i].LODBias * 0.125f, -MaxTextureLODBias, MaxTextureLODBias); + glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, tmp); + } + else + glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0.f); + } +#endif + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST); diff --git a/source/Irrlicht/COpenGLExtensionHandler.cpp b/source/Irrlicht/COpenGLExtensionHandler.cpp index 219fccc7..5df9a045 100644 --- a/source/Irrlicht/COpenGLExtensionHandler.cpp +++ b/source/Irrlicht/COpenGLExtensionHandler.cpp @@ -21,7 +21,7 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() : TextureCompressionExtension(false), MaxTextureUnits(1), MaxLights(1), MaxAnisotropy(1), MaxUserClipPlanes(0), MaxAuxBuffers(0), MaxIndices(65535), MaxTextureSize(1), - Version(0), ShaderLanguageVersion(0) + MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0) #ifdef _IRR_OPENGL_USE_EXTPOINTER_ ,pGlActiveTextureARB(0), pGlClientActiveTextureARB(0), pGlGenProgramsARB(0), pGlBindProgramARB(0), pGlProgramStringARB(0), @@ -411,6 +411,10 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer) #endif glGetIntegerv(GL_MAX_TEXTURE_SIZE, &num); MaxTextureSize=static_cast(num); +#ifdef EXT_texture_lod_bias + if (FeatureAvailable[IRR_EXT_texture_lod_bias]) + glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS_EXT, &MaxTextureLODBias); +#endif glGetIntegerv(GL_MAX_CLIP_PLANES, &num); MaxUserClipPlanes=static_cast(num); glGetIntegerv(GL_AUX_BUFFERS, &num); diff --git a/source/Irrlicht/COpenGLExtensionHandler.h b/source/Irrlicht/COpenGLExtensionHandler.h index 1e190339..4e7c0b70 100644 --- a/source/Irrlicht/COpenGLExtensionHandler.h +++ b/source/Irrlicht/COpenGLExtensionHandler.h @@ -725,6 +725,8 @@ class COpenGLExtensionHandler u32 MaxIndices; //! Maximal texture dimension u32 MaxTextureSize; + //! Maximal LOD Bias + f32 MaxTextureLODBias; //! OpenGL version as Integer: 100*Major+Minor, i.e. 2.1 becomes 201 u16 Version;