summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/content_mapblock.cpp28
-rw-r--r--src/content_mapnode.cpp2
-rw-r--r--src/mapnode.h2
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;