summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornumber Zero <silverunicorn2011@yandex.ru>2018-01-29 20:24:15 +0300
committersfan5 <sfan5@live.de>2018-01-30 21:13:24 +0100
commit49b65a5593c981a4ebc587538923e267a22c2437 (patch)
tree64fc985391759af9e194e7659369fe3164513ba3
parentcc400581e286747812736c0dc0383b6fca9e7e41 (diff)
downloadminetest-49b65a5593c981a4ebc587538923e267a22c2437.tar.gz
minetest-49b65a5593c981a4ebc587538923e267a22c2437.tar.bz2
minetest-49b65a5593c981a4ebc587538923e267a22c2437.zip
Fix liquid bottoms not being rendered
-rw-r--r--src/content_mapblock.cpp27
-rw-r--r--src/content_mapblock.h2
2 files changed, 29 insertions, 0 deletions
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index 8edccf3de..69982c335 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -385,9 +385,16 @@ void MapblockMeshGenerator::prepareLiquidNodeDrawing()
getSpecialTile(1, &tile_liquid);
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(p.X, p.Y + 1, p.Z));
+ MapNode nbottom = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(p.X, p.Y - 1, p.Z));
c_flowing = nodedef->getId(f->liquid_alternative_flowing);
c_source = nodedef->getId(f->liquid_alternative_source);
top_is_same_liquid = (ntop.getContent() == c_flowing) || (ntop.getContent() == c_source);
+ draw_liquid_bottom = (nbottom.getContent() != c_flowing) && (nbottom.getContent() != c_source);
+ if (draw_liquid_bottom) {
+ const ContentFeatures &f2 = nodedef->get(nbottom.getContent());
+ if (f2.solidness > 1)
+ draw_liquid_bottom = false;
+ }
if (data->m_smooth_lighting)
return; // don't need to pre-compute anything in this case
@@ -595,6 +602,24 @@ void MapblockMeshGenerator::drawLiquidTop()
collector->append(tile_liquid_top, vertices, 4, quad_indices, 6);
}
+void MapblockMeshGenerator::drawLiquidBottom()
+{
+ video::S3DVertex vertices[4] = {
+ video::S3DVertex(-BS / 2, -BS / 2, -BS / 2, 0, 0, 0, color_liquid_top, 0, 0),
+ video::S3DVertex( BS / 2, -BS / 2, -BS / 2, 0, 0, 0, color_liquid_top, 1, 0),
+ video::S3DVertex( BS / 2, -BS / 2, BS / 2, 0, 0, 0, color_liquid_top, 1, 1),
+ video::S3DVertex(-BS / 2, -BS / 2, BS / 2, 0, 0, 0, color_liquid_top, 0, 1),
+ };
+
+ for (int i = 0; i < 4; i++) {
+ if (data->m_smooth_lighting)
+ vertices[i].Color = blendLightColor(vertices[i].Pos);
+ vertices[i].Pos += origin;
+ }
+
+ collector->append(tile_liquid_top, vertices, 4, quad_indices, 6);
+}
+
void MapblockMeshGenerator::drawLiquidNode()
{
prepareLiquidNodeDrawing();
@@ -603,6 +628,8 @@ void MapblockMeshGenerator::drawLiquidNode()
drawLiquidSides();
if (!top_is_same_liquid)
drawLiquidTop();
+ if (draw_liquid_bottom)
+ drawLiquidBottom();
}
void MapblockMeshGenerator::drawGlasslikeNode()
diff --git a/src/content_mapblock.h b/src/content_mapblock.h
index 3d196aa99..ac3bda799 100644
--- a/src/content_mapblock.h
+++ b/src/content_mapblock.h
@@ -92,6 +92,7 @@ public:
// liquid-specific
bool top_is_same_liquid;
+ bool draw_liquid_bottom;
TileSpec tile_liquid;
TileSpec tile_liquid_top;
content_t c_flowing;
@@ -112,6 +113,7 @@ public:
f32 getCornerLevel(int i, int k);
void drawLiquidSides();
void drawLiquidTop();
+ void drawLiquidBottom();
// raillike-specific
// name of the group that enables connecting to raillike nodes of different kind