mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add display_gamma option for client
This commit is contained in:
parent
2414580754
commit
3d29be24e0
7 changed files with 108 additions and 42 deletions
|
@ -18,31 +18,93 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
*/
|
||||
|
||||
#include "light.h"
|
||||
#include <math.h>
|
||||
#include "util/numeric.h"
|
||||
|
||||
#ifndef SERVER
|
||||
|
||||
#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] =
|
||||
|
||||
u8 light_LUT[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,
|
||||
/* 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.
|
||||
*/
|
||||
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,
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
/* These are adjustment values that are added to the calculated light value
|
||||
* after gamma is applied. Currently they are used so that given a gamma
|
||||
* of 1.8 the light values set by this function are the same as those
|
||||
* hardcoded in the initalizer list for the declaration of light_LUT.
|
||||
*/
|
||||
static const int adjustments[LIGHT_MAX + 1] = {
|
||||
7,
|
||||
7,
|
||||
7,
|
||||
5,
|
||||
2,
|
||||
0,
|
||||
-7,
|
||||
-20,
|
||||
-31,
|
||||
-39,
|
||||
-43,
|
||||
-45,
|
||||
-40,
|
||||
-25,
|
||||
0
|
||||
};
|
||||
|
||||
gamma = rangelim(gamma, 1.1, 3.0);
|
||||
|
||||
float brightness = brightness_step;
|
||||
|
||||
for (size_t i = 0; i < LIGHT_MAX; i++) {
|
||||
light_LUT[i] = (u8)(255 * powf(brightness / 255.0f, 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
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
/*
|
||||
Made using this and:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue