+ 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;
+}