forked from Mirrorlandia_minetest/minetest
ContentCAO: Fix threshold of alpha channel textures (#14213)
With disabled shaders, the material EMT_TRANSPARENT_ALPHA_CHANNEL uses the parameter as an alpha threshold to decide whether to draw the texture. Thus lowering this limit fixes the issue of vanishing textures below alpha 128.
This commit is contained in:
parent
0d41996562
commit
a7eaee77ca
@ -620,6 +620,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
|
|||||||
|
|
||||||
infostream << "GenericCAO::addToScene(): " << m_prop.visual << std::endl;
|
infostream << "GenericCAO::addToScene(): " << m_prop.visual << std::endl;
|
||||||
|
|
||||||
|
m_material_type_param = 0.5f; // May cut off alpha < 128 depending on m_material_type
|
||||||
|
|
||||||
if (m_enable_shaders) {
|
if (m_enable_shaders) {
|
||||||
IShaderSource *shader_source = m_client->getShaderSource();
|
IShaderSource *shader_source = m_client->getShaderSource();
|
||||||
MaterialType material_type;
|
MaterialType material_type;
|
||||||
@ -634,8 +636,12 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
|
|||||||
u32 shader_id = shader_source->getShader("object_shader", material_type, NDT_NORMAL);
|
u32 shader_id = shader_source->getShader("object_shader", material_type, NDT_NORMAL);
|
||||||
m_material_type = shader_source->getShaderInfo(shader_id).material;
|
m_material_type = shader_source->getShaderInfo(shader_id).material;
|
||||||
} else {
|
} else {
|
||||||
m_material_type = (m_prop.use_texture_alpha) ?
|
if (m_prop.use_texture_alpha) {
|
||||||
video::EMT_TRANSPARENT_ALPHA_CHANNEL : video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
m_material_type = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
|
m_material_type_param = 1.0f / 256.f; // minimal alpha for texture rendering
|
||||||
|
} else {
|
||||||
|
m_material_type = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto grabMatrixNode = [this] {
|
auto grabMatrixNode = [this] {
|
||||||
@ -1341,7 +1347,7 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
|
|
||||||
video::SMaterial &material = m_spritenode->getMaterial(0);
|
video::SMaterial &material = m_spritenode->getMaterial(0);
|
||||||
material.MaterialType = m_material_type;
|
material.MaterialType = m_material_type;
|
||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = m_material_type_param;
|
||||||
material.setTexture(0, tsrc->getTextureForMesh(texturestring));
|
material.setTexture(0, tsrc->getTextureForMesh(texturestring));
|
||||||
|
|
||||||
// This allows setting per-material colors. However, until a real lighting
|
// This allows setting per-material colors. However, until a real lighting
|
||||||
@ -1377,7 +1383,7 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
// Set material flags and texture
|
// Set material flags and texture
|
||||||
video::SMaterial &material = m_animated_meshnode->getMaterial(i);
|
video::SMaterial &material = m_animated_meshnode->getMaterial(i);
|
||||||
material.MaterialType = m_material_type;
|
material.MaterialType = m_material_type;
|
||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = m_material_type_param;
|
||||||
material.TextureLayers[0].Texture = texture;
|
material.TextureLayers[0].Texture = texture;
|
||||||
material.Lighting = true;
|
material.Lighting = true;
|
||||||
material.BackfaceCulling = m_prop.backface_culling;
|
material.BackfaceCulling = m_prop.backface_culling;
|
||||||
@ -1421,7 +1427,7 @@ void GenericCAO::updateTextures(std::string mod)
|
|||||||
// Set material flags and texture
|
// Set material flags and texture
|
||||||
video::SMaterial &material = m_meshnode->getMaterial(i);
|
video::SMaterial &material = m_meshnode->getMaterial(i);
|
||||||
material.MaterialType = m_material_type;
|
material.MaterialType = m_material_type;
|
||||||
material.MaterialTypeParam = 0.5f;
|
material.MaterialTypeParam = m_material_type_param;
|
||||||
material.Lighting = false;
|
material.Lighting = false;
|
||||||
material.setTexture(0, tsrc->getTextureForMesh(texturestring));
|
material.setTexture(0, tsrc->getTextureForMesh(texturestring));
|
||||||
material.getTextureMatrix(0).makeIdentity();
|
material.getTextureMatrix(0).makeIdentity();
|
||||||
|
@ -130,6 +130,7 @@ private:
|
|||||||
bool m_is_visible = false;
|
bool m_is_visible = false;
|
||||||
// Material
|
// Material
|
||||||
video::E_MATERIAL_TYPE m_material_type;
|
video::E_MATERIAL_TYPE m_material_type;
|
||||||
|
f32 m_material_type_param;
|
||||||
// Settings
|
// Settings
|
||||||
bool m_enable_shaders = false;
|
bool m_enable_shaders = false;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user