mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
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);
|
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)
|
if (alpha == 0 || alpha == 255)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (u32 i = 0; i < 6; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
|
if (tiles[i].name == "")
|
||||||
|
continue;
|
||||||
std::stringstream s;
|
std::stringstream s;
|
||||||
s << tiledef[i].name << "^[noalpha^[opacity:" << ((int)alpha);
|
s << tiles[i].name << "^[noalpha^[opacity:" << ((int)alpha);
|
||||||
tiledef[i].name = s.str();
|
tiles[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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,6 +665,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
|||||||
if (tdef[j].name == "")
|
if (tdef[j].name == "")
|
||||||
tdef[j].name = "unknown_node.png";
|
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;
|
bool is_liquid = false;
|
||||||
|
|
||||||
@ -720,8 +725,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
|||||||
visual_solidness = 1;
|
visual_solidness = 1;
|
||||||
} else if (tsettings.leaves_style == LEAVES_SIMPLE) {
|
} else if (tsettings.leaves_style == LEAVES_SIMPLE) {
|
||||||
for (u32 j = 0; j < 6; j++) {
|
for (u32 j = 0; j < 6; j++) {
|
||||||
if (tiledef_special[j].name != "")
|
if (tdef_spec[j].name != "")
|
||||||
tdef[j].name = tiledef_special[j].name;
|
tdef[j].name = tdef_spec[j].name;
|
||||||
}
|
}
|
||||||
drawtype = NDT_GLASSLIKE;
|
drawtype = NDT_GLASSLIKE;
|
||||||
solidness = 0;
|
solidness = 0;
|
||||||
@ -759,12 +764,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
|
|||||||
break;
|
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) ?
|
material_type = (alpha == 255) ?
|
||||||
TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
|
TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
|
||||||
|
}
|
||||||
// Vertex alpha is no longer supported, correct if necessary.
|
|
||||||
correctAlpha();
|
|
||||||
|
|
||||||
u32 tile_shader[6];
|
u32 tile_shader[6];
|
||||||
for (u16 j = 0; j < 6; j++) {
|
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++) {
|
for (u16 j = 0; j < 6; j++) {
|
||||||
fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
|
fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
|
||||||
tsettings.use_normal_texture,
|
tsettings.use_normal_texture,
|
||||||
tiledef[j].backface_culling, material_type);
|
tdef[j].backface_culling, material_type);
|
||||||
if (tiledef_overlay[j].name!="")
|
if (tdef_overlay[j].name != "")
|
||||||
fillTileAttribs(tsrc, &tiles[j].layers[1], &tiledef_overlay[j],
|
fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j],
|
||||||
tile_shader[j], tsettings.use_normal_texture,
|
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[])
|
// Special tiles (fill in f->special_tiles[])
|
||||||
for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
|
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,
|
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 ||
|
if (param_type_2 == CPT2_COLOR ||
|
||||||
|
@ -382,13 +382,13 @@ struct ContentFeatures
|
|||||||
void serializeOld(std::ostream &os, u16 protocol_version) const;
|
void serializeOld(std::ostream &os, u16 protocol_version) const;
|
||||||
void deSerializeOld(std::istream &is, int version);
|
void deSerializeOld(std::istream &is, int version);
|
||||||
/*!
|
/*!
|
||||||
* Since vertex alpha is no lnger supported, this method
|
* Since vertex alpha is no longer supported, this method
|
||||||
* adds instructions to the texture names to blend alpha there.
|
* adds opacity directly to the texture pixels.
|
||||||
*
|
*
|
||||||
* tiledef, tiledef_special and alpha must be initialized
|
* \param tiles array of the tile definitions.
|
||||||
* before calling this.
|
* \param length length of tiles
|
||||||
*/
|
*/
|
||||||
void correctAlpha();
|
void correctAlpha(TileDef *tiles, int length);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Some handy methods
|
Some handy methods
|
||||||
|
Loading…
Reference in New Issue
Block a user