nicer looking water
authorPerttu Ahola <celeron55@gmail.com>
Thu, 3 Feb 2011 23:48:52 +0000 (01:48 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Thu, 3 Feb 2011 23:48:52 +0000 (01:48 +0200)
minetest.conf.example
src/defaultsettings.cpp
src/map.cpp
src/mapblock.cpp
src/mapnode.cpp

index 0cdccf20c3406b6251dccfc33c173a0c387c2263..9a1a0dfd817cad77245638642b568f2f21c28796 100644 (file)
@@ -23,6 +23,7 @@
 #client_delete_unused_sectors_timeout = 1200
 
 #enable_fog = true
+#new_style_water = true
 
 # Server side stuff
 
index 0665cd02eee12022058af3e6f7bc927a3b648ea8..70f5e0aeb6ceb2c0ba55f8b48caa15deb11f6720 100644 (file)
@@ -36,6 +36,7 @@ void set_default_settings()
        g_settings.setDefault("random_input", "false");
        g_settings.setDefault("client_delete_unused_sectors_timeout", "1200");
        g_settings.setDefault("enable_fog", "true");
+       g_settings.setDefault("new_style_water", "true");
 
        // Server stuff
        g_settings.setDefault("creative_mode", "false");
index d03bc0ce2f4e5c7740d38cc5d8b15ab2033f41e4..3a316920091d411968a66eed80373346f2cfc07a 100644 (file)
@@ -2058,7 +2058,7 @@ void make_tree(VoxelManipulator &vmanip, v3s16 p0)
        MapNode treenode(CONTENT_TREE);
        MapNode leavesnode(CONTENT_LEAVES);
 
-       s16 trunk_h = myrand_range(2, 6);
+       s16 trunk_h = myrand_range(3, 6);
        v3s16 p1 = p0;
        for(s16 ii=0; ii<trunk_h; ii++)
        {
index a5f1066bd39033db7e7190de98a5e1b2177e0daa..da7d22ac56f4679a43f42cf8ba3b8513b6beed01 100644 (file)
@@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "mapblock.h"
 #include "map.h"
-// For g_materials
+// For g_settings and g_irrlicht
 #include "main.h"
 #include "light.h"
 #include <sstream>
@@ -600,7 +600,6 @@ void MapBlock::updateMesh(u32 daynight_ratio)
        v3f posRelative_f(getPosRelative().X, getPosRelative().Y,
                        getPosRelative().Z); // floating point conversion
        
-       
        /*
                Avoid interlocks by copying m_temp_mods
        */
@@ -610,6 +609,11 @@ void MapBlock::updateMesh(u32 daynight_ratio)
                m_temp_mods.copy(temp_mods);
        }
 
+       bool new_style_water = g_settings.getBool("new_style_water");
+       float node_water_level = 1.0;
+       if(new_style_water)
+               node_water_level = 0.8;
+       
        /*
                We are including the faces of the trailing edges of the block.
                This means that when something changes, the caller must
@@ -846,9 +850,10 @@ void MapBlock::updateMesh(u32 daynight_ratio)
                                        content = n2.d;
 
                                        if(n2.d == CONTENT_WATERSOURCE)
-                                               level = 0.5 * BS;
+                                               level = (-0.5+node_water_level) * BS;
                                        else if(n2.d == CONTENT_WATER)
-                                               level = (-0.5 + ((float)n2.param2 + 0.5) / 8.0) * BS;
+                                               level = (-0.5 + ((float)n2.param2 + 0.5) / 8.0
+                                                               * node_water_level) * BS;
 
                                        // Check node above neighbor.
                                        // NOTE: This doesn't get executed if neighbor
@@ -889,7 +894,7 @@ void MapBlock::updateMesh(u32 daynight_ratio)
                                        // Special case for source nodes
                                        if(content == CONTENT_WATERSOURCE)
                                        {
-                                               cornerlevel = 0.5*BS;
+                                               cornerlevel = (-0.5+node_water_level)*BS;
                                                valid_count = 1;
                                                break;
                                        }
@@ -1045,6 +1050,47 @@ void MapBlock::updateMesh(u32 daynight_ratio)
                                collector.append(material_w1, vertices, 4, indices, 6);
                        }
                }
+               /*
+                       Add water sources to mesh
+               */
+               else if(n.d == CONTENT_WATERSOURCE && new_style_water)
+               {
+                       //bool top_is_water = false;
+                       bool top_is_air = false;
+                       try{
+                               MapNode n = getNodeParent(v3s16(x,y+1,z));
+                               /*if(n.d == CONTENT_WATER || n.d == CONTENT_WATERSOURCE)
+                                       top_is_water = true;*/
+                               if(n.d == CONTENT_AIR)
+                                       top_is_air = true;
+                       }catch(InvalidPositionException &e){}
+                       
+                       /*if(top_is_water == true)
+                               continue;*/
+                       if(top_is_air == false)
+                               continue;
+
+                       u8 l = decode_light(n.getLightBlend(daynight_ratio));
+                       video::SColor c(WATER_ALPHA,l,l,l);
+                       
+                       video::S3DVertex vertices[4] =
+                       {
+                               video::S3DVertex(-BS/2,0,-BS/2, 0,0,0, c, 0,1),
+                               video::S3DVertex(BS/2,0,-BS/2, 0,0,0, c, 1,1),
+                               video::S3DVertex(BS/2,0,BS/2, 0,0,0, c, 1,0),
+                               video::S3DVertex(-BS/2,0,BS/2, 0,0,0, c, 0,0),
+                       };
+
+                       for(s32 i=0; i<4; i++)
+                       {
+                               vertices[i].Pos.Y += (-0.5+node_water_level)*BS;
+                               vertices[i].Pos += intToFloat(p + getPosRelative());
+                       }
+
+                       u16 indices[] = {0,1,2,2,3,0};
+                       // Add to mesh collector
+                       collector.append(material_w1, vertices, 4, indices, 6);
+               }
        }
 
        /*
index 6f34aa03900fbe319736471e09a4ef937f233c2b..d585238ae3b69096d3e20b3fb54abef75ea77996 100644 (file)
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "porting.h"
 #include <string>
 #include "mineral.h"
+// For g_settings
+#include "main.h"
 
 ContentFeatures::~ContentFeatures()
 {
@@ -139,10 +141,13 @@ void init_mapnode(IIrrlichtWrapper *irrlicht)
        f->buildable_to = true;
        f->liquid_type = LIQUID_FLOWING;
        
+       bool new_style_water = g_settings.getBool("new_style_water");
+       
        i = CONTENT_WATERSOURCE;
        f = &g_content_features[i];
        //f->setTexture(0, irrlicht->getTextureId("water.png"), WATER_ALPHA);
-       f->setAllTextures(irrlicht->getTextureId("water.png"), WATER_ALPHA);
+       if(new_style_water == false)
+               f->setAllTextures(irrlicht->getTextureId("water.png"), WATER_ALPHA);
        f->setInventoryTexture(irrlicht->getTextureId("water.png"));
        f->param_type = CPT_LIGHT;
        f->light_propagates = true;