forked from Mirrorlandia_minetest/minetest
Fix alpha for liquid nodes (#5494)
This commit is contained in:
parent
674400523e
commit
75c393c915
@ -469,21 +469,18 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
|
||||
writeU8(os, legacy_wallmounted);
|
||||
}
|
||||
|
||||
void ContentFeatures::correctAlpha()
|
||||
void ContentFeatures::correctAlpha(TileDef *tiles, int length)
|
||||
{
|
||||
// alpha == 0 means that the node is using texture alpha
|
||||
if (alpha == 0 || alpha == 255)
|
||||
return;
|
||||
|
||||
for (u32 i = 0; i < 6; i++) {
|
||||
for (int i = 0; i < length; i++) {
|
||||
if (tiles[i].name == "")
|
||||
continue;
|
||||
std::stringstream s;
|
||||
s << tiledef[i].name << "^[noalpha^[opacity:" << ((int)alpha);
|
||||
tiledef[i].name = s.str();
|
||||
}
|
||||
|
||||
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++) {
|
||||
std::stringstream s;
|
||||
s << tiledef_special[i].name << "^[noalpha^[opacity:" << ((int)alpha);
|
||||
tiledef_special[i].name = s.str();
|
||||
s << tiles[i].name << "^[noalpha^[opacity:" << ((int)alpha);
|
||||
tiles[i].name = s.str();
|
||||
}
|
||||
}
|
||||
|
||||
@ -668,6 +665,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
||||
if (tdef[j].name == "")
|
||||
tdef[j].name = "unknown_node.png";
|
||||
}
|
||||
// also the overlay tiles
|
||||
TileDef tdef_overlay[6];
|
||||
for (u32 j = 0; j < 6; j++)
|
||||
tdef_overlay[j] = tiledef_overlay[j];
|
||||
// also the special tiles
|
||||
TileDef tdef_spec[6];
|
||||
for (u32 j = 0; j < CF_SPECIAL_COUNT; j++)
|
||||
tdef_spec[j] = tiledef_special[j];
|
||||
|
||||
bool is_liquid = false;
|
||||
|
||||
@ -720,8 +725,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
||||
visual_solidness = 1;
|
||||
} else if (tsettings.leaves_style == LEAVES_SIMPLE) {
|
||||
for (u32 j = 0; j < 6; j++) {
|
||||
if (tiledef_special[j].name != "")
|
||||
tdef[j].name = tiledef_special[j].name;
|
||||
if (tdef_spec[j].name != "")
|
||||
tdef[j].name = tdef_spec[j].name;
|
||||
}
|
||||
drawtype = NDT_GLASSLIKE;
|
||||
solidness = 0;
|
||||
@ -759,12 +764,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_liquid)
|
||||
if (is_liquid) {
|
||||
// Vertex alpha is no longer supported, correct if necessary.
|
||||
correctAlpha(tdef, 6);
|
||||
correctAlpha(tdef_overlay, 6);
|
||||
correctAlpha(tdef_spec, CF_SPECIAL_COUNT);
|
||||
material_type = (alpha == 255) ?
|
||||
TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
|
||||
|
||||
// Vertex alpha is no longer supported, correct if necessary.
|
||||
correctAlpha();
|
||||
}
|
||||
|
||||
u32 tile_shader[6];
|
||||
for (u16 j = 0; j < 6; j++) {
|
||||
@ -776,18 +783,18 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
||||
for (u16 j = 0; j < 6; j++) {
|
||||
fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
|
||||
tsettings.use_normal_texture,
|
||||
tiledef[j].backface_culling, material_type);
|
||||
if (tiledef_overlay[j].name!="")
|
||||
fillTileAttribs(tsrc, &tiles[j].layers[1], &tiledef_overlay[j],
|
||||
tdef[j].backface_culling, material_type);
|
||||
if (tdef_overlay[j].name != "")
|
||||
fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j],
|
||||
tile_shader[j], tsettings.use_normal_texture,
|
||||
tiledef[j].backface_culling, material_type);
|
||||
tdef[j].backface_culling, material_type);
|
||||
}
|
||||
|
||||
// Special tiles (fill in f->special_tiles[])
|
||||
for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
|
||||
fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tiledef_special[j],
|
||||
fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tdef_spec[j],
|
||||
tile_shader[j], tsettings.use_normal_texture,
|
||||
tiledef_special[j].backface_culling, material_type);
|
||||
tdef_spec[j].backface_culling, material_type);
|
||||
}
|
||||
|
||||
if (param_type_2 == CPT2_COLOR ||
|
||||
|
@ -382,13 +382,13 @@ struct ContentFeatures
|
||||
void serializeOld(std::ostream &os, u16 protocol_version) const;
|
||||
void deSerializeOld(std::istream &is, int version);
|
||||
/*!
|
||||
* Since vertex alpha is no lnger supported, this method
|
||||
* adds instructions to the texture names to blend alpha there.
|
||||
* Since vertex alpha is no longer supported, this method
|
||||
* adds opacity directly to the texture pixels.
|
||||
*
|
||||
* tiledef, tiledef_special and alpha must be initialized
|
||||
* before calling this.
|
||||
* \param tiles array of the tile definitions.
|
||||
* \param length length of tiles
|
||||
*/
|
||||
void correctAlpha();
|
||||
void correctAlpha(TileDef *tiles, int length);
|
||||
|
||||
/*
|
||||
Some handy methods
|
||||
|
Loading…
Reference in New Issue
Block a user