From efd8dabd913b2d1a0564378c30ae86c7a5081f06 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Tue, 23 Aug 2011 03:01:01 +0300
Subject: [PATCH] Lava is now better visible inside water. (a crappy hack)

---
 src/content_mapblock.cpp | 28 ++++++++++++++++------------
 src/content_mapnode.cpp  |  2 ++
 src/mapnode.h            |  2 ++
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index b4006140d..482b9eb63 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -448,12 +448,6 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 					{
 						air_count++;
 					}
-					/*// Air is liquid level 0
-					else if(content == CONTENT_AIR)
-					{
-						cornerlevel += -0.5*BS;
-						valid_count++;
-					}*/
 				}
 				if(air_count >= 2)
 					cornerlevel = -0.5*BS;
@@ -490,17 +484,20 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 						neighbor_flags[dir] & neighborflag_top_is_same_liquid)
 					continue;
 
-				u8 neighbor_content = neighbor_contents[dir];
+				content_t neighbor_content = neighbor_contents[dir];
 				
 				// Don't draw face if neighbor is not air or liquid
 				if(neighbor_content != CONTENT_AIR
-						&& neighbor_content != c_source)
+						&& content_liquid(neighbor_content) == false)
 					continue;
 				
-				bool neighbor_is_liquid = (neighbor_content == c_source);
+				bool neighbor_is_same_liquid = (neighbor_content == c_source
+						|| neighbor_content == c_flowing);
 				
-				// Don't draw any faces if neighbor is liquid and top is liquid
-				if(neighbor_is_liquid == true && top_is_same_liquid == false)
+				// Don't draw any faces if neighbor same is liquid and top is
+				// same liquid
+				if(neighbor_is_same_liquid == true
+						&& top_is_same_liquid == false)
 					continue;
 				
 				video::S3DVertex vertices[4] =
@@ -541,7 +538,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 					If neighbor is liquid, lower border of face is corner
 					liquid levels
 				*/
-				if(neighbor_is_liquid)
+				if(neighbor_is_same_liquid)
 				{
 					vertices[0].Pos.Y = corner_levels[side_corners[i][1]];
 					vertices[1].Pos.Y = corner_levels[side_corners[i][0]];
@@ -566,6 +563,13 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
 						vertices[j].Pos.rotateXZBy(90);
 					if(dir == v3s16(1,0,-0))
 						vertices[j].Pos.rotateXZBy(-90);
+						
+					// Do this to not cause glitches when two liquids are
+					// side-by-side
+					if(neighbor_is_same_liquid == false){
+						vertices[j].Pos.X *= 0.98;
+						vertices[j].Pos.Z *= 0.98;
+					}
 
 					vertices[j].Pos += intToFloat(p + blockpos_nodes, BS);
 				}
diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp
index f45853c4a..386a5e4ee 100644
--- a/src/content_mapnode.cpp
+++ b/src/content_mapnode.cpp
@@ -370,6 +370,7 @@ void content_mapnode_init()
 	f->param_type = CPT_LIGHT;
 	f->light_propagates = true;
 	f->solidness = 0; // Drawn separately, makes no faces
+	f->visual_solidness = 1;
 	f->walkable = false;
 	f->pointable = false;
 	f->diggable = false;
@@ -449,6 +450,7 @@ void content_mapnode_init()
 	f->light_propagates = false;
 	f->light_source = LIGHT_MAX-1;
 	f->solidness = 0; // Drawn separately, makes no faces
+	f->visual_solidness = 2;
 	f->walkable = false;
 	f->pointable = false;
 	f->diggable = false;
diff --git a/src/mapnode.h b/src/mapnode.h
index 4c2b92853..3ad67aaf6 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -121,6 +121,7 @@ struct ContentFeatures
 	bool light_propagates;
 	bool sunlight_propagates;
 	u8 solidness; // Used when choosing which face is drawn
+	u8 visual_solidness; // When solidness=0, this tells how it looks like
 	// This is used for collision detection.
 	// Also for general solidness queries.
 	bool walkable;
@@ -181,6 +182,7 @@ struct ContentFeatures
 		light_propagates = false;
 		sunlight_propagates = false;
 		solidness = 2;
+		visual_solidness = 0;
 		walkable = true;
 		pointable = true;
 		diggable = true;
-- 
GitLab