diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-12-02 18:02:04 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-12-02 18:02:45 +0200 |
commit | 804a7875a2018f3d8cb3fbe917c11ecc1666d25a (patch) | |
tree | 8f730c91a9461d512e785e76a3a5f99e52e910d3 /src/daynightratio.h | |
parent | 041585a78e7eeabd23d92435a8dd6fd39d329b07 (diff) | |
download | minetest-804a7875a2018f3d8cb3fbe917c11ecc1666d25a.tar.gz minetest-804a7875a2018f3d8cb3fbe917c11ecc1666d25a.tar.bz2 minetest-804a7875a2018f3d8cb3fbe917c11ecc1666d25a.zip |
Smooth day-night transitions
Diffstat (limited to 'src/daynightratio.h')
-rw-r--r-- | src/daynightratio.h | 56 |
1 files changed, 41 insertions, 15 deletions
diff --git a/src/daynightratio.h b/src/daynightratio.h index 9b31ecddd..96c6729eb 100644 --- a/src/daynightratio.h +++ b/src/daynightratio.h @@ -20,23 +20,49 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef DAYNIGHTRATIO_HEADER #define DAYNIGHTRATIO_HEADER -inline u32 time_to_daynight_ratio(u32 time_of_day) +inline u32 time_to_daynight_ratio(float time_of_day, bool smooth) { - s32 t = time_of_day%24000; - if(t < 4500 || t >= 19500) - return 150; - else if(t < 4750 || t >= 19250) - return 250; - else if(t < 5000 || t >= 19000) - return 350; - else if(t < 5250 || t >= 18750) - return 500; - else if(t < 5500 || t >= 18500) - return 675; - else if(t < 5750 || t >= 18250) - return 875; - else + float t = time_of_day; + if(t < 0) + t += ((int)(-t)/24000)*24000; + if(t >= 24000) + t -= ((int)(t)/24000)*24000; + if(t > 12000) + t = 24000 - t; + float values[][2] = { + {4250+125, 150}, + {4500+125, 150}, + {4750+125, 250}, + {5000+125, 350}, + {5250+125, 500}, + {5500+125, 675}, + {5750+125, 875}, + {6000+125, 1000}, + {6250+125, 1000}, + }; + if(!smooth){ + float lastt = values[0][0]; + for(u32 i=1; i<sizeof(values)/sizeof(*values); i++){ + float t0 = values[i][0]; + float switch_t = (t0 + lastt) / 2; + lastt = t0; + if(switch_t <= t) + continue; + return values[i][1]; + } return 1000; + } else { + for(u32 i=0; i<sizeof(values)/sizeof(*values); i++){ + if(values[i][0] <= t) + continue; + if(i == 0) + return values[i][1]; + float td0 = values[i][0] - values[i-1][0]; + float f = (t - values[i-1][0]) / td0; + return f * values[i][1] + (1.0 - f) * values[i-1][1]; + } + return 1000; + } } #endif |