X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fdaynightratio.h;h=538767cad94c33ee4d762269361e9ee3bfbb9738;hb=880c9768a9323800ca8d44cc4b73e92278e58743;hp=9b31ecddd23d776b309d2c28fcc1f530abd0d1e0;hpb=037b2591971d752e67fa7d47095b996b3f56da5a;p=dragonfireclient.git diff --git a/src/daynightratio.h b/src/daynightratio.h index 9b31ecddd..538767cad 100644 --- a/src/daynightratio.h +++ b/src/daynightratio.h @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2012 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -17,27 +17,56 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef DAYNIGHTRATIO_HEADER -#define DAYNIGHTRATIO_HEADER +#pragma once -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.0f) + t += ((int)(-t) / 24000) * 24000.0f; + if (t >= 24000.0f) + t -= ((int)(t) / 24000) * 24000.0f; + if (t > 12000.0f) + t = 24000.0f - t; + + const float values[9][2] = { + {4250.0f + 125.0f, 175.0f}, + {4500.0f + 125.0f, 175.0f}, + {4750.0f + 125.0f, 250.0f}, + {5000.0f + 125.0f, 350.0f}, + {5250.0f + 125.0f, 500.0f}, + {5500.0f + 125.0f, 675.0f}, + {5750.0f + 125.0f, 875.0f}, + {6000.0f + 125.0f, 1000.0f}, + {6250.0f + 125.0f, 1000.0f}, + }; + + if (!smooth) { + float lastt = values[0][0]; + for (u32 i = 1; i < 9; i++) { + float t0 = values[i][0]; + float switch_t = (t0 + lastt) / 2.0f; + lastt = t0; + if (switch_t <= t) + continue; + + return values[i][1]; + } return 1000; -} + } -#endif + if (t <= 4625.0f) // 4500 + 125 + return values[0][1]; + else if (t >= 6125.0f) // 6000 + 125 + return 1000; + + for (u32 i = 0; i < 9; i++) { + if (values[i][0] <= t) + continue; + float td0 = values[i][0] - values[i - 1][0]; + float f = (t - values[i - 1][0]) / td0; + return f * values[i][1] + (1.0f - f) * values[i - 1][1]; + } + return 1000; +}