mirror of
https://github.com/minetest/minetest.git
synced 2025-02-17 02:22:26 +01: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:
@ -843,9 +843,8 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
|||||||
|
|
||||||
// Apply filter settings
|
// Apply filter settings
|
||||||
material.forEachTexture([this] (video::SMaterialLayer &tex) {
|
material.forEachTexture([this] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = m_cache_trilinear_filter;
|
tex.setFiltersMinetest(m_cache_bilinear_filter, m_cache_trilinear_filter,
|
||||||
tex.BilinearFilter = m_cache_trilinear_filter;
|
m_cache_anistropic_filter);
|
||||||
tex.AnisotropicFilter = m_cache_anistropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
material.Wireframe = m_control.show_wireframe;
|
material.Wireframe = m_control.show_wireframe;
|
||||||
|
|
||||||
@ -859,9 +858,9 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
|||||||
// Do not enable filter on shadow texture to avoid visual artifacts
|
// Do not enable filter on shadow texture to avoid visual artifacts
|
||||||
// with colored shadows.
|
// with colored shadows.
|
||||||
// Filtering is done in shader code anyway
|
// Filtering is done in shader code anyway
|
||||||
layer.BilinearFilter = false;
|
layer.MinFilter = video::ETMINF_NEAREST;
|
||||||
layer.AnisotropicFilter = false;
|
layer.MagFilter = video::ETMAGF_NEAREST;
|
||||||
layer.TrilinearFilter = false;
|
layer.AnisotropicFilter = 0;
|
||||||
}
|
}
|
||||||
driver->setMaterial(material);
|
driver->setMaterial(material);
|
||||||
++material_swaps;
|
++material_swaps;
|
||||||
|
@ -53,7 +53,8 @@ Clouds::Clouds(scene::ISceneManager* mgr,
|
|||||||
m_material.AntiAliasing = video::EAAM_SIMPLE;
|
m_material.AntiAliasing = video::EAAM_SIMPLE;
|
||||||
m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
m_material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
m_material.forEachTexture([] (video::SMaterialLayer &tex) {
|
m_material.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
|
|
||||||
m_params.height = 120;
|
m_params.height = 120;
|
||||||
|
@ -255,7 +255,8 @@ void TestCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
|
|||||||
buf->getMaterial().Lighting = false;
|
buf->getMaterial().Lighting = false;
|
||||||
buf->getMaterial().BackfaceCulling = false;
|
buf->getMaterial().BackfaceCulling = false;
|
||||||
buf->getMaterial().setTexture(0, tsrc->getTextureForMesh("rat.png"));
|
buf->getMaterial().setTexture(0, tsrc->getTextureForMesh("rat.png"));
|
||||||
buf->getMaterial().TextureLayer[0].BilinearFilter = false;
|
buf->getMaterial().TextureLayer[0].MinFilter = video::ETMINF_NEAREST;
|
||||||
|
buf->getMaterial().TextureLayer[0].MagFilter = video::ETMAGF_NEAREST;
|
||||||
buf->getMaterial().FogEnable = true;
|
buf->getMaterial().FogEnable = true;
|
||||||
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
// Add to mesh
|
// Add to mesh
|
||||||
@ -652,7 +653,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
|
|||||||
mat.NormalizeNormals = true;
|
mat.NormalizeNormals = true;
|
||||||
}
|
}
|
||||||
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1353,9 +1355,8 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = use_trilinear_filter;
|
tex.setFiltersMinetest(use_bilinear_filter, use_trilinear_filter,
|
||||||
tex.BilinearFilter = use_bilinear_filter;
|
use_anisotropic_filter);
|
||||||
tex.AnisotropicFilter = use_anisotropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1390,9 +1391,8 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
use_bilinear_filter &= res > 64;
|
use_bilinear_filter &= res > 64;
|
||||||
|
|
||||||
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = use_trilinear_filter;
|
tex.setFiltersMinetest(use_bilinear_filter, use_trilinear_filter,
|
||||||
tex.BilinearFilter = use_bilinear_filter;
|
use_anisotropic_filter);
|
||||||
tex.AnisotropicFilter = use_anisotropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
for (u32 i = 0; i < m_prop.colors.size() &&
|
for (u32 i = 0; i < m_prop.colors.size() &&
|
||||||
@ -1438,9 +1438,8 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = use_trilinear_filter;
|
tex.setFiltersMinetest(use_bilinear_filter, use_trilinear_filter,
|
||||||
tex.BilinearFilter = use_bilinear_filter;
|
use_anisotropic_filter);
|
||||||
tex.AnisotropicFilter = use_anisotropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (m_prop.visual == "upright_sprite") {
|
} else if (m_prop.visual == "upright_sprite") {
|
||||||
@ -1464,9 +1463,8 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = use_trilinear_filter;
|
tex.setFiltersMinetest(use_bilinear_filter, use_trilinear_filter,
|
||||||
tex.BilinearFilter = use_bilinear_filter;
|
use_anisotropic_filter);
|
||||||
tex.AnisotropicFilter = use_anisotropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -1494,9 +1492,8 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = use_trilinear_filter;
|
tex.setFiltersMinetest(use_bilinear_filter, use_trilinear_filter,
|
||||||
tex.BilinearFilter = use_bilinear_filter;
|
use_anisotropic_filter);
|
||||||
tex.AnisotropicFilter = use_anisotropic_filter ? 0xFF : 0;
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// Set mesh color (only if lighting is disabled)
|
// Set mesh color (only if lighting is disabled)
|
||||||
|
@ -43,7 +43,8 @@ public:
|
|||||||
mat.Lighting = false;
|
mat.Lighting = false;
|
||||||
mat.FogEnable = true;
|
mat.FogEnable = true;
|
||||||
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
m_spritenode->setColor(video::SColor(255,0,0,0));
|
m_spritenode->setColor(video::SColor(255,0,0,0));
|
||||||
|
@ -768,7 +768,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
|||||||
material.FogEnable = true;
|
material.FogEnable = true;
|
||||||
material.setTexture(0, p.layer.texture);
|
material.setTexture(0, p.layer.texture);
|
||||||
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (m_enable_shaders) {
|
if (m_enable_shaders) {
|
||||||
|
@ -101,7 +101,8 @@ scene::IAnimatedMesh* createCubeMesh(v3f scale)
|
|||||||
buf->getMaterial().Lighting = false;
|
buf->getMaterial().Lighting = false;
|
||||||
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
buf->getMaterial().forEachTexture([] (video::SMaterialLayer &tex) {
|
buf->getMaterial().forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
// Add mesh buffer to mesh
|
// Add mesh buffer to mesh
|
||||||
mesh->addMeshBuffer(buf);
|
mesh->addMeshBuffer(buf);
|
||||||
@ -410,7 +411,8 @@ scene::IMesh* convertNodeboxesToMesh(const std::vector<aabb3f> &boxes,
|
|||||||
scene::IMeshBuffer *buf = new scene::SMeshBuffer();
|
scene::IMeshBuffer *buf = new scene::SMeshBuffer();
|
||||||
buf->getMaterial().Lighting = false;
|
buf->getMaterial().Lighting = false;
|
||||||
buf->getMaterial().forEachTexture([] (video::SMaterialLayer &tex) {
|
buf->getMaterial().forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
dst_mesh->addMeshBuffer(buf);
|
dst_mesh->addMeshBuffer(buf);
|
||||||
buf->drop();
|
buf->drop();
|
||||||
|
@ -609,7 +609,8 @@ void Minimap::drawMinimap(core::rect<s32> rect) {
|
|||||||
|
|
||||||
video::SMaterial &material = m_meshbuffer->getMaterial();
|
video::SMaterial &material = m_meshbuffer->getMaterial();
|
||||||
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.TrilinearFilter = true;
|
tex.MinFilter = video::ETMINF_TRILINEAR;
|
||||||
|
tex.MagFilter = video::ETMAGF_BILINEAR;
|
||||||
});
|
});
|
||||||
material.Lighting = false;
|
material.Lighting = false;
|
||||||
material.TextureLayer[0].Texture = minimap_texture;
|
material.TextureLayer[0].Texture = minimap_texture;
|
||||||
|
@ -93,7 +93,8 @@ Particle::Particle(
|
|||||||
m_material.BackfaceCulling = false;
|
m_material.BackfaceCulling = false;
|
||||||
m_material.FogEnable = true;
|
m_material.FogEnable = true;
|
||||||
m_material.forEachTexture([] (video::SMaterialLayer &tex) {
|
m_material.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
|
|
||||||
// correctly render layered transparent particles -- see #10398
|
// correctly render layered transparent particles -- see #10398
|
||||||
|
@ -38,9 +38,9 @@ void PostProcessingStep::configureMaterial()
|
|||||||
material.ZBuffer = true;
|
material.ZBuffer = true;
|
||||||
material.ZWriteEnable = video::EZW_ON;
|
material.ZWriteEnable = video::EZW_ON;
|
||||||
for (u32 k = 0; k < texture_map.size(); ++k) {
|
for (u32 k = 0; k < texture_map.size(); ++k) {
|
||||||
material.TextureLayer[k].AnisotropicFilter = false;
|
material.TextureLayer[k].AnisotropicFilter = 0;
|
||||||
material.TextureLayer[k].BilinearFilter = false;
|
material.TextureLayer[k].MinFilter = video::ETMINF_NEAREST;
|
||||||
material.TextureLayer[k].TrilinearFilter = false;
|
material.TextureLayer[k].MagFilter = video::ETMAGF_NEAREST;
|
||||||
material.TextureLayer[k].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
material.TextureLayer[k].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
||||||
material.TextureLayer[k].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
material.TextureLayer[k].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
||||||
}
|
}
|
||||||
@ -92,7 +92,8 @@ void PostProcessingStep::run(PipelineContext &context)
|
|||||||
void PostProcessingStep::setBilinearFilter(u8 index, bool value)
|
void PostProcessingStep::setBilinearFilter(u8 index, bool value)
|
||||||
{
|
{
|
||||||
assert(index < video::MATERIAL_MAX_TEXTURES);
|
assert(index < video::MATERIAL_MAX_TEXTURES);
|
||||||
material.TextureLayer[index].BilinearFilter = value;
|
material.TextureLayer[index].MinFilter = value ? video::ETMINF_BILINEAR : video::ETMINF_NEAREST;
|
||||||
|
material.TextureLayer[index].MagFilter = value ? video::ETMAGF_BILINEAR : video::ETMAGF_NEAREST;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderStep *addPostProcessing(RenderPipeline *pipeline, RenderStep *previousStep, v2f scale, Client *client)
|
RenderStep *addPostProcessing(RenderPipeline *pipeline, RenderStep *previousStep, v2f scale, Client *client)
|
||||||
|
@ -51,8 +51,8 @@ static video::SMaterial baseMaterial()
|
|||||||
static inline void disableTextureFiltering(video::SMaterial &mat)
|
static inline void disableTextureFiltering(video::SMaterial &mat)
|
||||||
{
|
{
|
||||||
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
mat.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
tex.TrilinearFilter = false;
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
tex.AnisotropicFilter = 0;
|
tex.AnisotropicFilter = 0;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -298,10 +298,11 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename,
|
|||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = 0.5f;
|
||||||
material.BackfaceCulling = true;
|
material.BackfaceCulling = true;
|
||||||
// Enable bi/trilinear filtering only for high resolution textures
|
// Enable bi/trilinear filtering only for high resolution textures
|
||||||
material.forEachTexture([this, &dim] (video::SMaterialLayer &tex) {
|
bool bilinear_filter = dim.Width > 32 && m_bilinear_filter;
|
||||||
tex.BilinearFilter = dim.Width > 32 && m_bilinear_filter;
|
bool trilinear_filter = dim.Width > 32 && m_trilinear_filter;
|
||||||
tex.TrilinearFilter = dim.Width > 32 && m_trilinear_filter;
|
material.forEachTexture([=] (video::SMaterialLayer &tex) {
|
||||||
tex.AnisotropicFilter = m_anisotropic_filter ? 0xFF : 0;
|
tex.setFiltersMinetest(bilinear_filter, trilinear_filter,
|
||||||
|
m_anisotropic_filter);
|
||||||
});
|
});
|
||||||
// mipmaps cause "thin black line" artifacts
|
// mipmaps cause "thin black line" artifacts
|
||||||
material.UseMipMaps = false;
|
material.UseMipMaps = false;
|
||||||
@ -464,8 +465,8 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che
|
|||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = 0.5f;
|
||||||
material.BackfaceCulling = cull_backface;
|
material.BackfaceCulling = cull_backface;
|
||||||
material.forEachTexture([this] (video::SMaterialLayer &tex) {
|
material.forEachTexture([this] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = m_bilinear_filter;
|
tex.setFiltersMinetest(m_bilinear_filter, m_trilinear_filter,
|
||||||
tex.TrilinearFilter = m_trilinear_filter;
|
m_anisotropic_filter);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -655,8 +656,8 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
|
|||||||
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = 0.5f;
|
||||||
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
material.forEachTexture([] (video::SMaterialLayer &tex) {
|
||||||
tex.BilinearFilter = false;
|
tex.MinFilter = video::ETMINF_NEAREST;
|
||||||
tex.TrilinearFilter = false;
|
tex.MagFilter = video::ETMAGF_NEAREST;
|
||||||
});
|
});
|
||||||
material.BackfaceCulling = cull_backface;
|
material.BackfaceCulling = cull_backface;
|
||||||
material.Lighting = false;
|
material.Lighting = false;
|
||||||
@ -701,8 +702,8 @@ scene::SMesh *getExtrudedMesh(ITextureSource *tsrc,
|
|||||||
video::SMaterial &material = mesh->getMeshBuffer(layer)->getMaterial();
|
video::SMaterial &material = mesh->getMeshBuffer(layer)->getMaterial();
|
||||||
material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
|
||||||
material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
material.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
|
||||||
material.TextureLayer[0].BilinearFilter = false;
|
material.TextureLayer[0].MinFilter = video::ETMINF_NEAREST;
|
||||||
material.TextureLayer[0].TrilinearFilter = false;
|
material.TextureLayer[0].MagFilter = video::ETMAGF_NEAREST;
|
||||||
material.BackfaceCulling = true;
|
material.BackfaceCulling = true;
|
||||||
material.Lighting = false;
|
material.Lighting = false;
|
||||||
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
|
@ -68,7 +68,8 @@ void GUIScene::setTexture(u32 idx, video::ITexture *texture)
|
|||||||
material.TextureLayer[0].Texture = texture;
|
material.TextureLayer[0].Texture = texture;
|
||||||
material.Lighting = false;
|
material.Lighting = false;
|
||||||
material.FogEnable = true;
|
material.FogEnable = true;
|
||||||
material.TextureLayer[0].BilinearFilter = false;
|
material.TextureLayer[0].MinFilter = video::ETMINF_NEAREST;
|
||||||
|
material.TextureLayer[0].MagFilter = video::ETMAGF_NEAREST;
|
||||||
material.BackfaceCulling = false;
|
material.BackfaceCulling = false;
|
||||||
material.ZWriteEnable = video::EZW_AUTO;
|
material.ZWriteEnable = video::EZW_AUTO;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user