From 75c393c915ce7fa0e6529999f77c86f3a5897106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Juh=C3=A1sz?= Date: Fri, 19 May 2017 07:46:10 +0200 Subject: [PATCH] Fix alpha for liquid nodes (#5494) --- src/nodedef.cpp | 51 ++++++++++++++++++++++++++++--------------------- src/nodedef.h | 10 +++++----- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 966275076..2ac59f8ae 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -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 || diff --git a/src/nodedef.h b/src/nodedef.h index 4d3bacc6c..07a962ed0 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -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