X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flight.cpp;h=9b6f5c210ee7df4da84ff2208328a3b165eafe89;hb=115ef6c09c640598695d5d506a7a8e1ab928174b;hp=765c6303a97218ff27f31f2bf470bdb1c5f91710;hpb=22e186b4aa88b585e71500c4e9a03bf69b0b6191;p=dragonfireclient.git diff --git a/src/light.cpp b/src/light.cpp index 765c6303a..9b6f5c210 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -18,309 +18,69 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "light.h" +#include +#include "util/numeric.h" +#include "settings.h" -#if 1 -// Middle-raised variation of a_n+1 = a_n * 0.786 -// Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. -// LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11+2, -14+7, -18+10, -22+15, -29+20, -37+20, -47+15, -60+10, -76+7, -97+5, -123+2, -157, -200, -255, -}; -#endif - -#if 0 -/* -Made using this and: -- adding 220 as the second last one -- replacing the third last one (212) with 195 +#ifndef SERVER -#!/usr/bin/python +static u8 light_LUT[LIGHT_SUN + 1]; -from math import * -from sys import stdout +// The const ref to light_LUT is what is actually used in the code +const u8 *light_decode_table = light_LUT; -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -#FACTOR = 0.75 -FACTOR = 0.83 -START_FROM_ZERO = False - -L = [] -if START_FROM_ZERO: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(0) -else: - for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) - L.append(255) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -23, -27, -33, -40, -48, -57, -69, -83, -100, -121, -146, -176, -195, -220, -255, +struct LightingParams { + float a, b, c; // polynomial coefficients + float boost, center, sigma; // normal boost parameters + float gamma; }; -#endif -#if 0 -// This is good -// a_n+1 = a_n * 0.786 -// Length of LIGHT_MAX+1 means LIGHT_MAX is the last value. -// LIGHT_SUN is read as LIGHT_MAX from here. -u8 light_decode_table[LIGHT_MAX+1] = -{ -8, -11, -14, -18, -22, -29, -37, -47, -60, -76, -97, -123, -157, -200, -255, -}; -#endif +static LightingParams params; -#if 0 -// Use for debugging in dark -u8 light_decode_table[LIGHT_MAX+1] = +float decode_light_f(float x) { -58, -64, -72, -80, -88, -98, -109, -121, -135, -150, -167, -185, -206, -229, -255, -}; -#endif - -// This is reasonable with classic lighting with a light source -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -2, -3, -4, -6, -9, -13, -18, -25, -32, -35, -45, -57, -69, -79, -255 -};*/ - - -// As in minecraft, a_n+1 = a_n * 0.8 -// NOTE: This doesn't really work that well because this defines -// LIGHT_MAX as dimmer than LIGHT_SUN -// NOTE: Uh, this has had 34 left out; forget this. -/*u8 light_decode_table[LIGHT_MAX+1] = + if (x >= 1.0f) // x is equal to 1.0f half the time + return 1.0f; + x = std::fmax(x, 0.0f); + float brightness = ((params.a * x + params.b) * x + params.c) * x; + brightness += params.boost * std::exp(-0.5f * sqr((x - params.center) / params.sigma)); + if (brightness <= 0.0f) // may happen if parameters are insane + return 0.0f; + if (brightness >= 1.0f) + return 1.0f; + return powf(brightness, 1.0f / params.gamma); +} + +// Initialize or update the light value tables using the specified gamma +void set_light_table(float gamma) { -8, -11, -14, -17, -21, -27, -42, -53, -66, -83, -104, -130, -163, -204, -255, -};*/ +// Lighting curve derivatives + const float alpha = g_settings->getFloat("lighting_alpha"); + const float beta = g_settings->getFloat("lighting_beta"); +// Lighting curve coefficients + params.a = alpha + beta - 2.0f; + params.b = 3.0f - 2.0f * alpha - beta; + params.c = alpha; +// Mid boost + params.boost = g_settings->getFloat("lighting_boost"); + params.center = g_settings->getFloat("lighting_boost_center"); + params.sigma = g_settings->getFloat("lighting_boost_spread"); +// Gamma correction + params.gamma = rangelim(gamma, 0.5f, 10.0f); + +// Boundary values should be fixed + light_LUT[0] = 0; + light_LUT[LIGHT_SUN] = 255; + + for (size_t i = 1; i < LIGHT_SUN; i++) { + float brightness = decode_light_f((float)i / LIGHT_SUN); + // Strictly speaking, rangelim is not necessary here—if the implementation + // is conforming. But we don’t want problems in any case. + light_LUT[i] = rangelim((s32)(255.0f * brightness), 0, 255); + // Ensure light brightens with each level + if (i > 1 && light_LUT[i] <= light_LUT[i - 1]) + light_LUT[i] = light_LUT[i - 1] + 1; + } +} -// This was a quick try of more light, manually quickly made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -7, -11, -15, -21, -29, -42, -53, -69, -85, -109, -135, -167, -205, -255, -};*/ - -// This was used for a long time, manually made -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -3, -6, -10, -18, -25, -35, -50, -75, -95, -120, -150, -185, -215, -255, -};*/ -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -5, -12, -22, -35, -50, -65, -85, -100, -120, -140, -160, -185, -215, -255, -};*/ -// LIGHT_MAX is 14, 0-14 is 15 values -/*u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -9, -12, -14, -16, -20, -26, -34, -45, -61, -81, -108, -143, -191, -255, -};*/ - -#if 0 -/* -#!/usr/bin/python - -from math import * -from sys import stdout - -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -FACTOR = 0.75 - -L = [] -for i in range(1,LIGHT_MAX+1): - L.append(int(round(255.0 * FACTOR ** (i-1)))) -L.append(0) - -L.reverse() -for i in L: - stdout.write(str(i)+",\n") -*/ -u8 light_decode_table[LIGHT_MAX+1] = -{ -0, -6, -8, -11, -14, -19, -26, -34, -45, -61, -81, -108, -143, -191, -255, -}; #endif - -