Made dark places tint slightly in blue
authorPerttu Ahola <celeron55@gmail.com>
Sat, 23 Jul 2011 01:10:17 +0000 (04:10 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 23 Jul 2011 01:10:17 +0000 (04:10 +0300)
src/content_mapblock.cpp
src/mapblock_mesh.cpp
src/mapblock_mesh.h

index 730907222cf3db279a2f4ccfe5c99948e40addc9..e542cb3359ef7c5ec4bd0b982facd63415514c6b 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "content_mapnode.h"
 #include "main.h" // For g_settings and g_texturesource
 #include "mineral.h"
+#include "mapblock_mesh.h" // For MapBlock_LightColor()
 
 #ifndef SERVER
 // Create a cuboid.
@@ -286,7 +287,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_SIGN_WALL)
                {
                        u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
                                
                        float d = (float)BS/16;
                        // Wall at X+ of node
@@ -352,7 +353,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                        // Otherwise use the light of this node (the water)
                        else
                                l = decode_light(n.getLightBlend(data->m_daynight_ratio));
-                       video::SColor c(WATER_ALPHA,l,l,l);
+                       video::SColor c = MapBlock_LightColor(WATER_ALPHA, l);
                        
                        // Neighbor water levels (key = relative position)
                        // Includes current node
@@ -618,7 +619,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                                continue;
 
                        u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
-                       video::SColor c(WATER_ALPHA,l,l,l);
+                       video::SColor c = MapBlock_LightColor(WATER_ALPHA, l);
                        
                        video::S3DVertex vertices[4] =
                        {
@@ -653,7 +654,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                {
                        /*u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));*/
                        u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        for(u32 j=0; j<6; j++)
                        {
@@ -720,7 +721,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_GLASS)
                {
                        u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        for(u32 j=0; j<6; j++)
                        {
@@ -783,7 +784,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_FENCE)
                {
                        u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        const f32 post_rad=(f32)BS/10;
                        const f32 bar_rad=(f32)BS/20;
@@ -872,7 +873,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                                else
                                        l = 255;*/
                                u8 l = 255;
-                               video::SColor c(255,l,l,l);
+                               video::SColor c = MapBlock_LightColor(255, l);
                                
                                // Get the right texture
                                TileSpec ts = n.getTile(dir);
@@ -930,7 +931,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_PAPYRUS)
                {
                        u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        for(u32 j=0; j<4; j++)
                        {
@@ -980,7 +981,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_JUNGLEGRASS)
                {
                        u8 l = decode_light(undiminish_light(n.getLightBlend(data->m_daynight_ratio)));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        for(u32 j=0; j<4; j++)
                        {
@@ -1031,7 +1032,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
                else if(n.d == CONTENT_RAIL)
                {
                        u8 l = decode_light(n.getLightBlend(data->m_daynight_ratio));
-                       video::SColor c(255,l,l,l);
+                       video::SColor c = MapBlock_LightColor(255, l);
 
                        bool is_rail_x [] = { false, false };  /* x-1, x+1 */
                        bool is_rail_z [] = { false, false };  /* z-1, z+1 */
index 447716d0059d44e53f6681af8c3dda1b8314b6aa..bcbf374188cee72b0f1c9669d07da3f14f27df5d 100644 (file)
@@ -140,9 +140,24 @@ void getNodeVertexDirs(v3s16 dir, v3s16 *vertex_dirs)
        }
 }
 
-inline video::SColor lightColor(u8 alpha, u8 light)
+video::SColor MapBlock_LightColor(u8 alpha, u8 light)
 {
+#if 0
        return video::SColor(alpha,light,light,light);
+#endif
+       //return video::SColor(alpha,light,light,MYMAX(0, (s16)light-25)+25);
+       /*return video::SColor(alpha,light,light,MYMAX(0,
+                       pow((float)light/255.0, 0.8)*255.0));*/
+#if 1
+       // Emphase blue a bit in darker places
+       float lim = 80;
+       float power = 0.7;
+       if(light > lim)
+               return video::SColor(alpha,light,light,light);
+       else
+               return video::SColor(alpha,light,light,MYMAX(0,
+                               pow((float)light/lim, power)*lim));
+#endif
 }
 
 struct FastFace
@@ -198,7 +213,7 @@ void makeFastFace(TileSpec tile, u8 li0, u8 li1, u8 li2, u8 li3, v3f p,
        float w = tile.texture.size.X;
        float h = tile.texture.size.Y;
 
-       /*video::SColor c = lightColor(alpha, li);
+       /*video::SColor c = MapBlock_LightColor(alpha, li);
 
        face.vertices[0] = video::S3DVertex(vertex_pos[0], v3f(0,1,0), c,
                        core::vector2d<f32>(x0+w*abs_scale, y0+h));
@@ -210,16 +225,16 @@ void makeFastFace(TileSpec tile, u8 li0, u8 li1, u8 li2, u8 li3, v3f p,
                        core::vector2d<f32>(x0+w*abs_scale, y0));*/
 
        face.vertices[0] = video::S3DVertex(vertex_pos[0], v3f(0,1,0),
-                       lightColor(alpha, li0),
+                       MapBlock_LightColor(alpha, li0),
                        core::vector2d<f32>(x0+w*abs_scale, y0+h));
        face.vertices[1] = video::S3DVertex(vertex_pos[1], v3f(0,1,0),
-                       lightColor(alpha, li1),
+                       MapBlock_LightColor(alpha, li1),
                        core::vector2d<f32>(x0, y0+h));
        face.vertices[2] = video::S3DVertex(vertex_pos[2], v3f(0,1,0),
-                       lightColor(alpha, li2),
+                       MapBlock_LightColor(alpha, li2),
                        core::vector2d<f32>(x0, y0));
        face.vertices[3] = video::S3DVertex(vertex_pos[3], v3f(0,1,0),
-                       lightColor(alpha, li3),
+                       MapBlock_LightColor(alpha, li3),
                        core::vector2d<f32>(x0+w*abs_scale, y0));
 
        face.tile = tile;
index 591172bc90e0ea8eac8ed46a78957a9a8629d939..d43c19a253f53cc020d122714ca093ab77293829 100644 (file)
@@ -121,6 +121,9 @@ private:
        core::array<PreMeshBuffer> m_prebuffers;
 };
 
+// Helper functions
+video::SColor MapBlock_LightColor(u8 alpha, u8 light);
+
 class MapBlock;
 
 struct MeshMakeData
@@ -137,6 +140,7 @@ struct MeshMakeData
        void fill(u32 daynight_ratio, MapBlock *block);
 };
 
+// This is the highest-level function in here
 scene::SMesh* makeMapBlockMesh(MeshMakeData *data);
 
 #endif