]> git.lizzy.rs Git - minetest.git/commitdiff
Fix liquid bottoms not being rendered
authornumber Zero <silverunicorn2011@yandex.ru>
Mon, 29 Jan 2018 17:24:15 +0000 (20:24 +0300)
committersfan5 <sfan5@live.de>
Tue, 30 Jan 2018 20:13:24 +0000 (21:13 +0100)
src/content_mapblock.cpp
src/content_mapblock.h

index 8edccf3de2062f651e462f4f6c17467b2a4d149d..69982c335234f8b55823b7ccc5d8e5c7d0d94d2f 100644 (file)
@@ -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()
index 3d196aa99f174f3e202e434dbc5dc3ba045ff830..ac3bda799fd728f881c493bd9ccbe3d9a39eb5fe 100644 (file)
@@ -92,6 +92,7 @@ class MapblockMeshGenerator
 
 // 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 @@ class MapblockMeshGenerator
        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