X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flight.cpp;h=4a3ca5a60767c8388429f59e0a025935f80e7375;hb=da88a186766020762f5c86bc6ba1624e4feaae2c;hp=66bceb72bcbf15ead6cdf07356d89b868e4d13e4;hpb=037b2591971d752e67fa7d47095b996b3f56da5a;p=minetest.git diff --git a/src/light.cpp b/src/light.cpp index 66bceb72b..4a3ca5a60 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -1,6 +1,6 @@ /* -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 Lesser General Public License as published by @@ -18,309 +18,68 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "light.h" +#include +#include "util/numeric.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 - -#!/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 -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) +#ifndef SERVER -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, -}; -#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 -#if 0 -// Use for debugging in dark -u8 light_decode_table[LIGHT_MAX+1] = +u8 light_LUT[LIGHT_MAX+1]; + +// the const ref to light_LUT is what is actually used in the code. +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) { -58, -64, -72, -80, -88, -98, -109, -121, -135, -150, -167, -185, -206, -229, -255, -}; + 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; + + 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]) + light_LUT[i] = light_LUT[i - 1] + 1; + brightness += brightness_step; + } + light_LUT[LIGHT_MAX] = 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 - -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 - -