Lava is now better visible inside water. (a crappy hack)
authorPerttu Ahola <celeron55@gmail.com>
Tue, 23 Aug 2011 00:01:01 +0000 (03:01 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 23 Aug 2011 00:01:01 +0000 (03:01 +0300)
src/content_mapblock.cpp
src/content_mapnode.cpp
src/mapnode.h

index b4006140ddc2f6525164b20640d4c39189e44636..482b9eb636236ef43abe967131f679269f3ee1c1 100644 (file)
@@ -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);
                                }
index f45853c4a3e0815e008e368ad26f0d31017bb291..386a5e4ee6a72c02b2a0e5898ec113105585f2c3 100644 (file)
@@ -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;
index 4c2b9285336d5d40cd887afaab35ebf1d68dc6f4..3ad67aaf6bebc152078d09a9959ef8bbe3ca7da3 100644 (file)
@@ -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;