aboutsummaryrefslogtreecommitdiff
path: root/src/light.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/light.cpp')
-rw-r--r--src/light.cpp98
1 files changed, 80 insertions, 18 deletions
diff --git a/src/light.cpp b/src/light.cpp
index 765c6303a..08380a180 100644
--- a/src/light.cpp
+++ b/src/light.cpp
@@ -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: