X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flight.cpp;h=d5389b45060a098df3964b228e5d26ffaedbdc40;hb=c11208c4b55bc6b17e523761befed6156027edf9;hp=f214d6ea06615f1c5512600e66ca80e395a99b35;hpb=ffb1128951638fb462fe1e24aa2963aab6246b07;p=dragonfireclient.git diff --git a/src/light.cpp b/src/light.cpp index f214d6ea0..d5389b450 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -1,248 +1,93 @@ /* -Minetest-c55 -Copyright (C) 2010 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "light.h" +#include +#include +#include "util/numeric.h" +#include "settings.h" -#if 1 -// 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, -}; -#else -// Use for debugging in dark -u8 light_decode_table[LIGHT_MAX+1] = -{ -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] = -{ -8, -11, -14, -17, -21, -27, -42, -53, -66, -83, -104, -130, -163, -204, -255, -};*/ - -// 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 +#ifndef SERVER -from math import * -from sys import stdout +static u8 light_LUT[LIGHT_SUN + 1]; -# We want 0 at light=0 and 255 at light=LIGHT_MAX -LIGHT_MAX = 14 -#FACTOR = 0.69 -FACTOR = 0.75 +// The const ref to light_LUT is what is actually used in the code +const u8 *light_decode_table = light_LUT; -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, +struct LightingParams { + float a, b, c; // Lighting curve polynomial coefficients + float boost, center, sigma; // Lighting curve parametric boost + float gamma; // Lighting curve gamma correction }; -#endif +static LightingParams params; + +float decode_light_f(float x) +{ + if (x >= 1.0f) // x is often 1.0f + 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 extreme + 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) +{ +// Lighting curve bounding gradients + const float alpha = rangelim(g_settings->getFloat("lighting_alpha"), 0.0f, 3.0f); + const float beta = rangelim(g_settings->getFloat("lighting_beta"), 0.0f, 3.0f); +// Lighting curve polynomial coefficients + params.a = alpha + beta - 2.0f; + params.b = 3.0f - 2.0f * alpha - beta; + params.c = alpha; +// Lighting curve parametric boost + params.boost = rangelim(g_settings->getFloat("lighting_boost"), 0.0f, 0.4f); + params.center = rangelim(g_settings->getFloat("lighting_boost_center"), 0.0f, 1.0f); + params.sigma = rangelim(g_settings->getFloat("lighting_boost_spread"), 0.0f, 0.4f); +// Lighting curve gamma correction + params.gamma = rangelim(gamma, 0.33f, 3.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 > 0 && light_LUT[i] <= light_LUT[i - 1]) { + light_LUT[i] = std::min((u8)254, light_LUT[i - 1]) + 1; + } + } +} + +#endif