summaryrefslogtreecommitdiff
path: root/src/light.cpp
diff options
context:
space:
mode:
authorParamat <paramat@users.noreply.github.com>2019-10-24 01:08:49 +0100
committerGitHub <noreply@github.com>2019-10-24 01:08:49 +0100
commit1f142ec06fc146464822a322fdf39bddb680bfe6 (patch)
tree3b508ac3a0a59ff07e41e6c33a42c1e30b10c175 /src/light.cpp
parentcd35949cd07dff9f64f982b7a28999b89dfbeb5a (diff)
downloadminetest-1f142ec06fc146464822a322fdf39bddb680bfe6.tar.gz
minetest-1f142ec06fc146464822a322fdf39bddb680bfe6.tar.bz2
minetest-1f142ec06fc146464822a322fdf39bddb680bfe6.zip
Improve light curve parameter limits and documentation (#9054)
Revert gamma upper limit to 3.0 because that was raised based on a misunderstanding and had no benefit. A sane upper limit is needed as players on a competitive server tend to use the maximum. Set gamma lower limit to 0.33 for consistency with 3.0. Set sane limits on alpha, beta, boost and enforce these in code to limit values entered in minetest.conf and to avoid easy cheating by editing settingtypes.txt. Improve documentation and 'readable' setting names. Clarify that gamma does not significantly affect natural night light. light.cpp: Various codestyle and comment improvements.
Diffstat (limited to 'src/light.cpp')
-rw-r--r--src/light.cpp36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/light.cpp b/src/light.cpp
index 9b6f5c210..8196fedff 100644
--- a/src/light.cpp
+++ b/src/light.cpp
@@ -29,44 +29,48 @@ static u8 light_LUT[LIGHT_SUN + 1];
// The const ref to light_LUT is what is actually used in the code
const u8 *light_decode_table = light_LUT;
+
struct LightingParams {
- float a, b, c; // polynomial coefficients
- float boost, center, sigma; // normal boost parameters
- float gamma;
+ float a, b, c; // Lighting curve polynomial coefficients
+ float boost, center, sigma; // Lighting curve parametric boost
+ float gamma; // Lighting curve gamma correction
};
static LightingParams params;
+
float decode_light_f(float x)
{
- if (x >= 1.0f) // x is equal to 1.0f half the time
+ 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 insane
+ 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 derivatives
- const float alpha = g_settings->getFloat("lighting_alpha");
- const float beta = g_settings->getFloat("lighting_beta");
-// Lighting curve coefficients
+// 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;
-// 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);
+// 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;