Fix alpha for liquid nodes (#5494)

This commit is contained in:
Dániel Juhász 2017-05-19 07:46:10 +02:00 committed by Loïc Blot
parent 674400523e
commit 75c393c915
2 changed files with 34 additions and 27 deletions

@ -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