Line data Source code
1 : /*
2 : Minetest
3 : Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 :
5 : This program is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU Lesser General Public License as published by
7 : the Free Software Foundation; either version 2.1 of the License, or
8 : (at your option) any later version.
9 :
10 : This program is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU Lesser General Public License for more details.
14 :
15 : You should have received a copy of the GNU Lesser General Public License along
16 : with this program; if not, write to the Free Software Foundation, Inc.,
17 : 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 : */
19 :
20 : #ifndef LIGHT_HEADER
21 : #define LIGHT_HEADER
22 :
23 : #include "irrlichttypes.h"
24 :
25 : /*
26 : Lower level lighting stuff
27 : */
28 :
29 : // This directly sets the range of light.
30 : // Actually this is not the real maximum, and this is not the
31 : // brightest. The brightest is LIGHT_SUN.
32 : #define LIGHT_MAX 14
33 : // Light is stored as 4 bits, thus 15 is the maximum.
34 : // This brightness is reserved for sunlight
35 : #define LIGHT_SUN 15
36 :
37 5462 : inline u8 diminish_light(u8 light)
38 : {
39 5462 : if(light == 0)
40 1193 : return 0;
41 4269 : if(light >= LIGHT_MAX)
42 1023 : return LIGHT_MAX - 1;
43 :
44 3246 : return light - 1;
45 : }
46 :
47 : inline u8 diminish_light(u8 light, u8 distance)
48 : {
49 : if(distance >= light)
50 : return 0;
51 : return light - distance;
52 : }
53 :
54 279029 : inline u8 undiminish_light(u8 light)
55 : {
56 : // We don't know if light should undiminish from this particular 0.
57 : // Thus, keep it at 0.
58 279029 : if(light == 0)
59 94172 : return 0;
60 184857 : if(light == LIGHT_MAX)
61 3988 : return light;
62 :
63 180869 : return light + 1;
64 : }
65 :
66 : #ifndef SERVER
67 :
68 : /**
69 : * \internal
70 : *
71 : * \warning DO NOT USE this directly; it is here simply so that decode_light()
72 : * can be inlined.
73 : *
74 : * Array size is #LIGHTMAX+1
75 : *
76 : * The array is a lookup table to convert the internal representation of light
77 : * (brightness) to the display brightness.
78 : *
79 : */
80 : extern const u8 *light_decode_table;
81 :
82 : // 0 <= light <= LIGHT_SUN
83 : // 0 <= return value <= 255
84 38120146 : inline u8 decode_light(u8 light)
85 : {
86 38120146 : if(light > LIGHT_MAX)
87 4091319 : light = LIGHT_MAX;
88 :
89 38120146 : return light_decode_table[light];
90 : }
91 :
92 : // 0.0 <= light <= 1.0
93 : // 0.0 <= return value <= 1.0
94 1166 : inline float decode_light_f(float light_f)
95 : {
96 1166 : s32 i = (u32)(light_f * LIGHT_MAX + 0.5);
97 :
98 1166 : if(i <= 0)
99 0 : return (float)light_decode_table[0] / 255.0;
100 1166 : if(i >= LIGHT_MAX)
101 1166 : return (float)light_decode_table[LIGHT_MAX] / 255.0;
102 :
103 0 : float v1 = (float)light_decode_table[i-1] / 255.0;
104 0 : float v2 = (float)light_decode_table[i] / 255.0;
105 0 : float f0 = (float)i - 0.5;
106 0 : float f = light_f * LIGHT_MAX - f0;
107 0 : return f * v2 + (1.0 - f) * v1;
108 : }
109 :
110 : void set_light_table(float gamma);
111 :
112 : #endif // ifndef SERVER
113 :
114 : // 0 <= daylight_factor <= 1000
115 : // 0 <= lightday, lightnight <= LIGHT_SUN
116 : // 0 <= return value <= LIGHT_SUN
117 214330 : inline u8 blend_light(u32 daylight_factor, u8 lightday, u8 lightnight)
118 : {
119 214330 : u32 c = 1000;
120 214330 : u32 l = ((daylight_factor * lightday + (c-daylight_factor) * lightnight))/c;
121 214330 : if(l > LIGHT_SUN)
122 0 : l = LIGHT_SUN;
123 214330 : return l;
124 : }
125 :
126 : #endif
127 :
|