From efd8dabd913b2d1a0564378c30ae86c7a5081f06 Mon Sep 17 00:00:00 2001 From: Perttu Ahola 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;