mirror of
https://github.com/minetest/irrlicht.git
synced 2025-06-28 06:20:21 +02:00
Split up texture filtering properties of SMaterialLayer into MinFilter and MagFilter
You can now set the filter used when scaling textures down and the filter used when scaling textures up separately.
This commit is contained in:
@ -97,19 +97,19 @@ CNullDriver::CNullDriver(io::IFileSystem* io, const core::dimension2d<u32>& scre
|
||||
for (u32 i=0; i<video::EVDF_COUNT; ++i)
|
||||
FeatureEnabled[i]=true;
|
||||
|
||||
InitMaterial2D.AntiAliasing=video::EAAM_OFF;
|
||||
InitMaterial2D.Lighting=false;
|
||||
InitMaterial2D.ZWriteEnable=video::EZW_OFF;
|
||||
InitMaterial2D.ZBuffer=video::ECFN_DISABLED;
|
||||
InitMaterial2D.UseMipMaps=false;
|
||||
for (u32 i=0; i<video::MATERIAL_MAX_TEXTURES; ++i)
|
||||
{
|
||||
InitMaterial2D.TextureLayer[i].BilinearFilter=false;
|
||||
InitMaterial2D.TextureLayer[i].TextureWrapU=video::ETC_REPEAT;
|
||||
InitMaterial2D.TextureLayer[i].TextureWrapV=video::ETC_REPEAT;
|
||||
InitMaterial2D.TextureLayer[i].TextureWrapW = video::ETC_REPEAT;
|
||||
}
|
||||
OverrideMaterial2D=InitMaterial2D;
|
||||
InitMaterial2D.AntiAliasing = video::EAAM_OFF;
|
||||
InitMaterial2D.Lighting = false;
|
||||
InitMaterial2D.ZWriteEnable = video::EZW_OFF;
|
||||
InitMaterial2D.ZBuffer = video::ECFN_DISABLED;
|
||||
InitMaterial2D.UseMipMaps = false;
|
||||
InitMaterial2D.forEachTexture([] (auto &tex) {
|
||||
tex.MinFilter = video::ETMINF_NEAREST;
|
||||
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||
tex.TextureWrapU = video::ETC_REPEAT;
|
||||
tex.TextureWrapV = video::ETC_REPEAT;
|
||||
tex.TextureWrapW = video::ETC_REPEAT;
|
||||
});
|
||||
OverrideMaterial2D = InitMaterial2D;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1696,41 +1696,40 @@ COGLES2Driver::~COGLES2Driver()
|
||||
if (resetAllRenderstates)
|
||||
tmpTexture->getStatesCache().IsCached = false;
|
||||
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MagFilter != tmpTexture->getStatesCache().MagFilter)
|
||||
{
|
||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayer[i].MagFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
magFilter == ETMAGF_BILINEAR ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MagFilter = magFilter;
|
||||
}
|
||||
|
||||
if (material.UseMipMaps && tmpTexture->hasMipMaps())
|
||||
{
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || !tmpTexture->getStatesCache().MipMapStatus)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
!tmpTexture->getStatesCache().MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
minFilter == ETMINF_TRILINEAR ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
minFilter == ETMINF_BILINEAR ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
GL_NEAREST_MIPMAP_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || tmpTexture->getStatesCache().MipMapStatus)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
tmpTexture->getStatesCache().MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
(minFilter == ETMINF_TRILINEAR || minFilter == ETMINF_BILINEAR) ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = false;
|
||||
}
|
||||
}
|
||||
|
@ -1914,41 +1914,40 @@ void COGLES1Driver::setTextureRenderStates(const SMaterial& material, bool reset
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MagFilter != statesCache.MagFilter)
|
||||
{
|
||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayer[i].MagFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
magFilter == ETMAGF_BILINEAR ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MagFilter = magFilter;
|
||||
}
|
||||
|
||||
if (material.UseMipMaps && tmpTexture->hasMipMaps())
|
||||
{
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter || !statesCache.MipMapStatus)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MinFilter != statesCache.MinFilter ||
|
||||
!statesCache.MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
minFilter == ETMINF_TRILINEAR ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
minFilter == ETMINF_BILINEAR ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
GL_NEAREST_MIPMAP_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MinFilter = minFilter;
|
||||
statesCache.MipMapStatus = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter || statesCache.MipMapStatus)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MinFilter != statesCache.MinFilter ||
|
||||
statesCache.MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
(minFilter == ETMINF_TRILINEAR || minFilter == ETMINF_BILINEAR) ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MinFilter = minFilter;
|
||||
statesCache.MipMapStatus = false;
|
||||
}
|
||||
}
|
||||
|
@ -31,8 +31,8 @@ public:
|
||||
struct SStatesCache
|
||||
{
|
||||
SStatesCache() : WrapU(ETC_REPEAT), WrapV(ETC_REPEAT), WrapW(ETC_REPEAT),
|
||||
LODBias(0), AnisotropicFilter(0), BilinearFilter(false), TrilinearFilter(false),
|
||||
MipMapStatus(false), IsCached(false)
|
||||
LODBias(0), AnisotropicFilter(0), MinFilter(video::ETMINF_NEAREST),
|
||||
MagFilter(video::ETMAGF_NEAREST), MipMapStatus(false), IsCached(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -41,8 +41,8 @@ public:
|
||||
u8 WrapW;
|
||||
s8 LODBias;
|
||||
u8 AnisotropicFilter;
|
||||
bool BilinearFilter;
|
||||
bool TrilinearFilter;
|
||||
video::E_TEXTURE_MIN_FILTER MinFilter;
|
||||
video::E_TEXTURE_MAG_FILTER MagFilter;
|
||||
bool MipMapStatus;
|
||||
bool IsCached;
|
||||
};
|
||||
|
@ -2709,41 +2709,40 @@ void COpenGLDriver::setTextureRenderStates(const SMaterial& material, bool reset
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MagFilter != statesCache.MagFilter)
|
||||
{
|
||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayer[i].MagFilter;
|
||||
glTexParameteri(tmpType, GL_TEXTURE_MAG_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
magFilter == ETMAGF_BILINEAR ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MagFilter = magFilter;
|
||||
}
|
||||
|
||||
if (material.UseMipMaps && tmpTexture->hasMipMaps())
|
||||
{
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter || !statesCache.MipMapStatus)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MinFilter != statesCache.MinFilter ||
|
||||
!statesCache.MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpType, GL_TEXTURE_MIN_FILTER,
|
||||
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
minFilter == ETMINF_TRILINEAR ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
minFilter == ETMINF_BILINEAR ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
GL_NEAREST_MIPMAP_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MinFilter = minFilter;
|
||||
statesCache.MipMapStatus = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].BilinearFilter != statesCache.BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != statesCache.TrilinearFilter || statesCache.MipMapStatus)
|
||||
if (!statesCache.IsCached || material.TextureLayer[i].MinFilter != statesCache.MinFilter ||
|
||||
statesCache.MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpType, GL_TEXTURE_MIN_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
(minFilter == ETMINF_TRILINEAR || minFilter == ETMINF_BILINEAR) ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
statesCache.BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
statesCache.TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
statesCache.MinFilter = minFilter;
|
||||
statesCache.MipMapStatus = false;
|
||||
}
|
||||
}
|
||||
|
@ -1456,41 +1456,40 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
if (resetAllRenderstates)
|
||||
tmpTexture->getStatesCache().IsCached = false;
|
||||
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MagFilter != tmpTexture->getStatesCache().MagFilter)
|
||||
{
|
||||
E_TEXTURE_MAG_FILTER magFilter = material.TextureLayer[i].MagFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MAG_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
magFilter == ETMAGF_BILINEAR ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MagFilter = magFilter;
|
||||
}
|
||||
|
||||
if (material.UseMipMaps && tmpTexture->hasMipMaps())
|
||||
{
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || !tmpTexture->getStatesCache().MipMapStatus)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
!tmpTexture->getStatesCache().MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
material.TextureLayer[i].TrilinearFilter ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
material.TextureLayer[i].BilinearFilter ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
minFilter == ETMINF_TRILINEAR ? GL_LINEAR_MIPMAP_LINEAR :
|
||||
minFilter == ETMINF_BILINEAR ? GL_LINEAR_MIPMAP_NEAREST :
|
||||
GL_NEAREST_MIPMAP_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].BilinearFilter != tmpTexture->getStatesCache().BilinearFilter ||
|
||||
material.TextureLayer[i].TrilinearFilter != tmpTexture->getStatesCache().TrilinearFilter || tmpTexture->getStatesCache().MipMapStatus)
|
||||
if (!tmpTexture->getStatesCache().IsCached || material.TextureLayer[i].MinFilter != tmpTexture->getStatesCache().MinFilter ||
|
||||
tmpTexture->getStatesCache().MipMapStatus)
|
||||
{
|
||||
E_TEXTURE_MIN_FILTER minFilter = material.TextureLayer[i].MinFilter;
|
||||
glTexParameteri(tmpTextureType, GL_TEXTURE_MIN_FILTER,
|
||||
(material.TextureLayer[i].BilinearFilter || material.TextureLayer[i].TrilinearFilter) ? GL_LINEAR : GL_NEAREST);
|
||||
(minFilter == ETMINF_TRILINEAR || minFilter == ETMINF_BILINEAR) ? GL_LINEAR : GL_NEAREST);
|
||||
|
||||
tmpTexture->getStatesCache().BilinearFilter = material.TextureLayer[i].BilinearFilter;
|
||||
tmpTexture->getStatesCache().TrilinearFilter = material.TextureLayer[i].TrilinearFilter;
|
||||
tmpTexture->getStatesCache().MinFilter = minFilter;
|
||||
tmpTexture->getStatesCache().MipMapStatus = false;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user