New lighting curve (#5279)
authorVitaliy <silverunicorn2011@yandex.ru>
Wed, 16 Aug 2017 22:23:20 +0000 (01:23 +0300)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Wed, 16 Aug 2017 22:23:20 +0000 (00:23 +0200)
* New lighting curve

* Make polynomial lighting curve

* Update default lighting settings

builtin/settingtypes.txt
minetest.conf.example
src/defaultsettings.cpp
src/light.cpp
src/settings_translation_file.cpp

index 395f98290bfdfdeb2661ac852c2e421b18e9763e..2ee8f5e2c8b256fb1c76f46bfd8bf44989fb1ba4 100644 (file)
@@ -602,7 +602,11 @@ zoom_fov (Field of view for zoom) int 15 7 160
 
 #    Adjust the gamma encoding for the light tables. Higher numbers are brighter.
 #    This setting is for the client only and is ignored by the server.
-display_gamma (Gamma) float 2.2 1.0 3.0
+display_gamma (Gamma) float 1.0 0.5 3.0
+
+lighting_alpha (Darkness sharpness) float 0.0 0.0 4.0
+
+lighting_beta (Lightness sharpness) float 0.0 0.0 4.0
 
 #    Path to texture directory. All textures are first searched from here.
 texture_path (Texture path) path
index d314577cbb80f834014b0610e4dd68e500bebb7a..f163965baab65d65aaa9345ce16c522307ed7abd 100644 (file)
 
 #    Adjust the gamma encoding for the light tables. Higher numbers are brighter.
 #    This setting is for the client only and is ignored by the server.
-#    type: float min: 1 max: 3
-# display_gamma = 2.2
+#    type: float min: 0.5 max: 3.0
+# display_gamma = 1.0
+
+#    type: float min: 0.0 max: 4.0
+# lighting_alpha = 0.0
+
+#    type: float min: 0.0 max: 4.0
+# lighting_beta = 0.0
 
 #    Path to texture directory. All textures are first searched from here.
 #    type: path
index e5b2c8da426fd5ad1cf83eab44f37fdb3c0dd690..5bdb5e14c47f37726a155228ac19b27dad40c4b6 100644 (file)
@@ -168,7 +168,9 @@ void set_default_settings(Settings *settings)
        settings->setDefault("leaves_style", "fancy");
        settings->setDefault("connected_glass", "false");
        settings->setDefault("smooth_lighting", "true");
-       settings->setDefault("display_gamma", "2.2");
+       settings->setDefault("lighting_alpha", "0.0");
+       settings->setDefault("lighting_beta", "0.0");
+       settings->setDefault("display_gamma", "1.0");
        settings->setDefault("texture_path", "");
        settings->setDefault("shader_path", "");
        settings->setDefault("video_driver", "opengl");
index 4a3ca5a60767c8388429f59e0a025935f80e7375..b269f623333412061472146560f3e88fd566b518 100644 (file)
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "light.h"
 #include <math.h>
 #include "util/numeric.h"
+#include "settings.h"
 
 #ifndef SERVER
 
@@ -32,52 +33,27 @@ u8 light_LUT[LIGHT_MAX+1];
 const u8 *light_decode_table = light_LUT;
 
 /** Initialize or update the light value tables using the specified \p gamma.
- *  If \p gamma == 1.0 then the light table is linear.  Typically values for
- *  gamma range between 1.8 and 2.2.
- *
- *  @note The value for gamma will be restricted to the range 1.1 <= gamma <= 3.0.
- *
- *  @note This function is not, currently, a simple linear to gamma encoding
- *        because adjustments are made so that a gamma of 1.8 gives the same
- *        results as those hardcoded for use by the server.
  */
 void set_light_table(float gamma)
 {
-       static const float brightness_step = 255.0f / (LIGHT_MAX + 1);
-
-       // this table is pure arbitrary values, made so that
-       // at gamma 2.2 the game looks not too dark at light=1,
-       // and mostly linear for the rest of the scale.
-       // we could try to inverse the gamma power function, but this
-       // is simpler and quicker.
-       static const int adjustments[LIGHT_MAX + 1] = {
-               -67,
-               -91,
-               -125,
-               -115,
-               -104,
-               -85,
-               -70,
-               -63,
-               -56,
-               -49,
-               -42,
-               -35,
-               -28,
-               -22,
-               0
-       };
-
-       gamma = rangelim(gamma, 1.0, 3.0);
-
-       float brightness = brightness_step;
+// lighting curve derivatives
+       const float alpha = g_settings->getFloat("lighting_alpha");
+       const float beta  = g_settings->getFloat("lighting_beta");
+// lighting curve coefficients
+       const float a = alpha + beta - 2;
+       const float b = 3 - 2 * alpha - beta;
+       const float c = alpha;
+// gamma correction
+       gamma = rangelim(gamma, 0.5, 3.0);
 
        for (size_t i = 0; i < LIGHT_MAX; i++) {
-               light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, 1.0 / gamma));
-               light_LUT[i] = rangelim(light_LUT[i] + adjustments[i], 0, 255);
-               if (i > 1 && light_LUT[i] < light_LUT[i - 1])
+               float x = i;
+               x /= LIGHT_MAX;
+               float brightness = a * x * x * x + b * x * x + c * x;
+               brightness = powf(brightness, 1.0 / gamma);
+               light_LUT[i] = rangelim((u32)(255 * brightness), 0, 255);
+               if (i > 1 && light_LUT[i] <= light_LUT[i - 1])
                        light_LUT[i] = light_LUT[i - 1] + 1;
-               brightness += brightness_step;
        }
        light_LUT[LIGHT_MAX] = 255;
 }
index d472852b8a43ab502a8107081940f64ec82341ed..a7fa67a749af749680388af0fe6e71f8dd8305bf 100644 (file)
@@ -245,6 +245,8 @@ fake_function() {
        gettext("Field of view while zooming in degrees.\nThis requires the \"zoom\" privilege on the server.");
        gettext("Gamma");
        gettext("Adjust the gamma encoding for the light tables. Higher numbers are brighter.\nThis setting is for the client only and is ignored by the server.");
+       gettext("Darkness sharpness");
+       gettext("Lightness sharpness");
        gettext("Texture path");
        gettext("Path to texture directory. All textures are first searched from here.");
        gettext("Video driver");