Skip to content
Permalink
Browse files

Fix alpha for liquid nodes (#5494)

  • Loading branch information
juhdanad authored and nerzhul committed May 19, 2017
1 parent 6744005 commit 75c393c915ce7fa0e6529999f77c86f3a5897106
Showing with 34 additions and 27 deletions.
  1. +29 −22 src/nodedef.cpp
  2. +5 −5 src/nodedef.h
@@ -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++) {
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++) {
for (int i = 0; i < length; i++) {
if (tiles[i].name == "")
continue;
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

0 comments on commit 75c393c

Please sign in to comment.