summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mapblock_mesh.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index b2870509b..daebbe217 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -32,6 +32,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include "util/directiontables.h"
+float srgb_linear_multiply(float f, float m, float max)
+{
+ f = f * f; // SRGB -> Linear
+ f *= m;
+ f = sqrt(f); // Linear -> SRGB
+ if(f > max)
+ f = max;
+ return f;
+}
+
/*
MeshMakeData
*/
@@ -1071,11 +1081,19 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
for(u32 j = 0; j < p.vertices.size(); j++)
{
video::SColor &vc = p.vertices[j].Color;
+ // Set initial real color and store for later updates
u8 day = vc.getRed();
u8 night = vc.getGreen();
finalColorBlend(vc, day, night, 1000);
if(day != night)
m_daynight_diffs[i][j] = std::make_pair(day, night);
+ // Brighten topside (no shaders)
+ if(p.vertices[j].Normal.Y > 0.5)
+ {
+ vc.setRed (srgb_linear_multiply(vc.getRed(), 1.3, 255.0));
+ vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.3, 255.0));
+ vc.setBlue (srgb_linear_multiply(vc.getBlue(), 1.3, 255.0));
+ }
}
}
@@ -1229,6 +1247,14 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
u8 night = j->second.second;
finalColorBlend(vertices[vertexIndex].Color,
day, night, daynight_ratio);
+ // Brighten topside (no shaders)
+ if(vertices[vertexIndex].Normal.Y > 0.5)
+ {
+ video::SColor &vc = vertices[vertexIndex].Color;
+ vc.setRed (srgb_linear_multiply(vc.getRed(), 1.3, 255.0));
+ vc.setGreen(srgb_linear_multiply(vc.getGreen(), 1.3, 255.0));
+ vc.setBlue (srgb_linear_multiply(vc.getBlue(), 1.3, 255.0));
+ }
}
}
m_last_daynight_ratio = daynight_ratio;