diff --git a/apps/openmw/mwworld/weather.cpp b/apps/openmw/mwworld/weather.cpp index dcc60618e4..0528134e52 100644 --- a/apps/openmw/mwworld/weather.cpp +++ b/apps/openmw/mwworld/weather.cpp @@ -423,9 +423,9 @@ namespace MWWorld float moonRiseHourYesterday = moonRiseHourToday - mDailyIncrement; if (moonRiseHourYesterday < 24.0f) { - // Morrowind offsets the increment by -1 when the previous day's visible point crosses into the next day. - // The offset lasts from this point until the next 24-day loop starts. - // To find this point we add mDailyIncrement to the previous visible point and check the result. + // Morrowind offsets the increment by -1 when the previous day's visible point crosses into the next + // day. The offset lasts from this point until the next 24-day loop starts. To find this point we add + // mDailyIncrement to the previous visible point and check the result. float moonShadowEarlyFadeAngle1 = mFadeEndAngle - mMoonShadowEarlyFadeAngle; float timeToVisible = moonShadowEarlyFadeAngle1 / rotation(1.0f); float cycleOffset = (((moonRiseHourToday >= 24.0f) || (moonRiseHourYesterday + timeToVisible > 24.0f)) @@ -491,8 +491,7 @@ namespace MWWorld // Note that we don't modulo after adding the latest daily increment because other calculations need to // know if doing so would cause the moon rise to be postponed until the next day (which happens when // the moon rise hour is >= 24 in Morrowind). - return mDailyIncrement - + std::fmod((gameDay - 1 + startDay - incrementOffset) * mDailyIncrement, 24.0f); + return mDailyIncrement + std::fmod((gameDay - 1 + startDay - incrementOffset) * mDailyIncrement, 24.0f); } else { diff --git a/apps/openmw/mwworld/weather.hpp b/apps/openmw/mwworld/weather.hpp index fe47722f85..3666496916 100644 --- a/apps/openmw/mwworld/weather.hpp +++ b/apps/openmw/mwworld/weather.hpp @@ -251,9 +251,8 @@ namespace MWWorld { public: MoonModel(const std::string& name); - MoonModel(const std::string& name, float fadeInStart, - float fadeInFinish, float fadeOutStart, float fadeOutFinish, - float axisOffset, float speed, float dailyIncrement, float fadeStartAngle, + MoonModel(const std::string& name, float fadeInStart, float fadeInFinish, float fadeOutStart, + float fadeOutFinish, float axisOffset, float speed, float dailyIncrement, float fadeStartAngle, float fadeEndAngle, float moonShadowEarlyFadeAngle); MWRender::MoonState calculateState(const TimeStamp& gameTime) const; diff --git a/apps/openmw_tests/mwworld/testweather.cpp b/apps/openmw_tests/mwworld/testweather.cpp index 2f51ad48e1..5d055d21e5 100644 --- a/apps/openmw_tests/mwworld/testweather.cpp +++ b/apps/openmw_tests/mwworld/testweather.cpp @@ -65,9 +65,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 28 + 23.0f + 59.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 29 + 0.0f + 1.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -100,9 +99,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 31 + 23.0f + 59.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 32 + 0.0f + 1.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -135,9 +133,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 34 + 23.0f + 59.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 35 + 0.0f + 1.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -170,9 +167,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 37 + 23.0f + 59.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 38 + 0.0f + 1.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -205,9 +201,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 41 + 2.0f + 56.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 41 + 2.0f + 58.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -240,9 +235,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 44 + 5.0f + 56.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 44 + 5.0f + 58.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -275,9 +269,8 @@ namespace MWWorld timeStampBeforePostLoop += (24.0f * 47 + 8.0f + 56.0f / 60.0f); timeStampAfterPostLoop += (24.0f * 47 + 8.0f + 58.0f / 60.0f); - MWWorld::MoonModel moon - = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, axisOffset, - speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); MWRender::MoonState afterState = moon.calculateState(timeStampAfter); @@ -289,451 +282,451 @@ namespace MWWorld EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(7)); EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(0)); } - } - // SECUNDA PHASES + // SECUNDA PHASES TEST(MWWorldWeatherTest, secundaPhasesFullToWaningGibbousAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 2 and 26, 14:19 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 2 + 14.0f + 18.0f / 60.0f); - timeStampAfter += (24.0f * 2 + 14.0f + 20.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 26 + 14.0f + 18.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 26 + 14.0f + 20.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(0)); - EXPECT_EQ(afterState.mPhase, static_cast(1)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(0)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(1)); - } - - TEST(MWWorldWeatherTest, secundaPhasesWaningGibbousToThirdQuarterAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 5 and 29, 0:00 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 4 + 23.0f + 59.0f / 60.0f); - timeStampAfter += (24.0f * 5 + 0.0f + 1.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 28 + 23.0f + 59.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 29 + 0.0f + 1.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(1)); - EXPECT_EQ(afterState.mPhase, static_cast(2)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(1)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(2)); - } - - TEST(MWWorldWeatherTest, secundaPhasesThirdQuarterToWaningCrescentAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 8 and 32, 0:00 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 7 + 23.0f + 59.0f / 60.0f); - timeStampAfter += (24.0f * 8 + 0.0f + 1.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 31 + 23.0f + 59.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 32 + 0.0f + 1.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(2)); - EXPECT_EQ(afterState.mPhase, static_cast(3)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(2)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(3)); - } - - TEST(MWWorldWeatherTest, secundaPhasesWaningCrescentToNewAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 11 and 35, 0:00 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 10 + 23.0f + 59.0f / 60.0f); - timeStampAfter += (24.0f * 11 + 0.0f + 1.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 34 + 23.0f + 59.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 35 + 0.0f + 1.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(3)); - EXPECT_EQ(afterState.mPhase, static_cast(4)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(3)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(4)); - } - - TEST(MWWorldWeatherTest, secundaPhasesNewToWaxingCrescentAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 14 and 38, 0:00 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 13 + 23.0f + 59.0f / 60.0f); - timeStampAfter += (24.0f * 14 + 0.0f + 1.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 37 + 23.0f + 59.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 38 + 0.0f + 1.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(4)); - EXPECT_EQ(afterState.mPhase, static_cast(5)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(4)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(5)); - } - - TEST(MWWorldWeatherTest, secundaPhasesWaxingCrescentToFirstQuarterAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 17 and 41, 3:31 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 17 + 3.0f + 30.0f / 60.0f); - timeStampAfter += (24.0f * 17 + 3.0f + 32.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 41 + 3.0f + 30.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 41 + 3.0f + 32.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(5)); - EXPECT_EQ(afterState.mPhase, static_cast(6)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(5)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(6)); - } - - TEST(MWWorldWeatherTest, secundaPhasesFirstQuarterToWaxingGibbousAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 20 and 44, 7:07 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 20 + 7.0f + 6.0f / 60.0f); - timeStampAfter += (24.0f * 20 + 7.0f + 8.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 44 + 7.0f + 6.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 44 + 7.0f + 8.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(6)); - EXPECT_EQ(afterState.mPhase, static_cast(7)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(6)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(7)); - } - - TEST(MWWorldWeatherTest, secundaPhasesWaxingGibbousToFullAtCorrectTimes) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 23 and 47, 10:43 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 23 + 10.0f + 42.0f / 60.0f); - timeStampAfter += (24.0f * 23 + 10.0f + 44.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 47 + 10.0f + 42.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 47 + 10.0f + 44.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_EQ(beforeState.mPhase, static_cast(7)); - EXPECT_EQ(afterState.mPhase, static_cast(0)); - EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(7)); - EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(0)); - } - - // OFFSETS - - TEST(MWWorldWeatherTest, secundaShouldApplyIncrementOffsetAfterFirstLoop) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 14.0f; - float fadeInFinish = 15.0f; - float fadeOutStart = 7.0f; - float fadeOutFinish = 10.0f; - float axisOffset = 50.0f; - - // Days 8 and 32, 3:16 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 8 + 3.0f + 15.0f / 60.0f); - timeStampAfter += (24.0f * 8 + 3.0f + 17.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 32 + 3.0f + 15.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 32 + 3.0f + 17.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_LE(beforeState.mMoonAlpha, 0.0f); - EXPECT_GT(afterState.mMoonAlpha, 0.0f); - EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); - EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); - } - - TEST(MWWorldWeatherTest, moonWithLowIncrementShouldApplyIncrementOffsetAfterCycle) - { - float dailyIncrement = 0.9f; - float speed = 0.5f; - float fadeEndAngle = 40.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 0.0f; - float fadeInFinish = 0.0f; - float fadeOutStart = 0.0f; - float fadeOutFinish = 0.0f; - float axisOffset = 35.0f; - - // Days 7 and 31, 1:44 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 7 + 1.0f + 43.0f / 60.0f); - timeStampAfter += (24.0f * 7 + 1.0f + 45.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 31 + 1.0f + 43.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 31 + 1.0f + 45.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_LE(beforeState.mMoonAlpha, 0.0f); - EXPECT_GT(afterState.mMoonAlpha, 0.0f); - EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); - EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); - } - - TEST(MWWorldWeatherTest, masserShouldApplyIncrementOffsetAfterCycle) - { - float dailyIncrement = 1.0f; - float speed = 0.5f; - float fadeEndAngle = 40.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 0.0f; - float fadeInFinish = 0.0f; - float fadeOutStart = 0.0f; - float fadeOutFinish = 0.0f; - float axisOffset = 35.0f; - - // Days 4 and 28, 1:02 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 4 + 1.0f + 1.0f / 60.0f); - timeStampAfter += (24.0f * 4 + 1.0f + 3.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 28 + 1.0f + 1.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 28 + 1.0f + 3.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_LE(beforeState.mMoonAlpha, 0.0f); - EXPECT_GT(afterState.mMoonAlpha, 0.0f); - EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); - EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); - } - - TEST(MWWorldWeatherTest, secundaShouldApplyIncrementOffsetAfterCycle) - { - float dailyIncrement = 1.2f; - float speed = 0.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 0.0f; - float fadeInFinish = 0.0f; - float fadeOutStart = 0.0f; - float fadeOutFinish = 0.0f; - float axisOffset = 50.0f; - - // Days 3 and 27, 2:04 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 3 + 2.0f + 3.0f / 60.0f); - timeStampAfter += (24.0f * 3 + 2.0f + 5.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 27 + 2.0f + 3.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 27 + 2.0f + 5.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_LE(beforeState.mMoonAlpha, 0.0f); - EXPECT_GT(afterState.mMoonAlpha, 0.0f); - EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); - EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); - } - - TEST(MWWorldWeatherTest, moonWithIncreasedSpeedShouldApplyIncrementOffsetAfterCycle) - { - float dailyIncrement = 1.2f; - float speed = 1.6f; - float fadeEndAngle = 30.0f; - float fadeStartAngle = 50.0f; - float moonShadowEarlyFadeAngle = 0.5f; - float fadeInStart = 0.0f; - float fadeInFinish = 0.0f; - float fadeOutStart = 0.0f; - float fadeOutFinish = 0.0f; - float axisOffset = 50.0f; - - // Days 4 and 28, 1:13 - TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; - timeStampBefore += (24.0f * 4 + 1.0f + 12.0f / 60.0f); - timeStampAfter += (24.0f * 4 + 1.0f + 14.0f / 60.0f); - timeStampBeforePostLoop += (24.0f * 28 + 1.0f + 12.0f / 60.0f); - timeStampAfterPostLoop += (24.0f * 28 + 1.0f + 14.0f / 60.0f); - - MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, - axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); - - MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); - MWRender::MoonState afterState = moon.calculateState(timeStampAfter); - MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); - MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); - - EXPECT_LE(beforeState.mMoonAlpha, 0.0f); - EXPECT_GT(afterState.mMoonAlpha, 0.0f); - EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); - EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 2 and 26, 14:19 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 2 + 14.0f + 18.0f / 60.0f); + timeStampAfter += (24.0f * 2 + 14.0f + 20.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 26 + 14.0f + 18.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 26 + 14.0f + 20.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(0)); + EXPECT_EQ(afterState.mPhase, static_cast(1)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(0)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(1)); + } + + TEST(MWWorldWeatherTest, secundaPhasesWaningGibbousToThirdQuarterAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 5 and 29, 0:00 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 4 + 23.0f + 59.0f / 60.0f); + timeStampAfter += (24.0f * 5 + 0.0f + 1.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 28 + 23.0f + 59.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 29 + 0.0f + 1.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(1)); + EXPECT_EQ(afterState.mPhase, static_cast(2)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(1)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(2)); + } + + TEST(MWWorldWeatherTest, secundaPhasesThirdQuarterToWaningCrescentAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 8 and 32, 0:00 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 7 + 23.0f + 59.0f / 60.0f); + timeStampAfter += (24.0f * 8 + 0.0f + 1.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 31 + 23.0f + 59.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 32 + 0.0f + 1.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(2)); + EXPECT_EQ(afterState.mPhase, static_cast(3)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(2)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(3)); + } + + TEST(MWWorldWeatherTest, secundaPhasesWaningCrescentToNewAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 11 and 35, 0:00 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 10 + 23.0f + 59.0f / 60.0f); + timeStampAfter += (24.0f * 11 + 0.0f + 1.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 34 + 23.0f + 59.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 35 + 0.0f + 1.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(3)); + EXPECT_EQ(afterState.mPhase, static_cast(4)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(3)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(4)); + } + + TEST(MWWorldWeatherTest, secundaPhasesNewToWaxingCrescentAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 14 and 38, 0:00 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 13 + 23.0f + 59.0f / 60.0f); + timeStampAfter += (24.0f * 14 + 0.0f + 1.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 37 + 23.0f + 59.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 38 + 0.0f + 1.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(4)); + EXPECT_EQ(afterState.mPhase, static_cast(5)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(4)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(5)); + } + + TEST(MWWorldWeatherTest, secundaPhasesWaxingCrescentToFirstQuarterAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 17 and 41, 3:31 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 17 + 3.0f + 30.0f / 60.0f); + timeStampAfter += (24.0f * 17 + 3.0f + 32.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 41 + 3.0f + 30.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 41 + 3.0f + 32.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(5)); + EXPECT_EQ(afterState.mPhase, static_cast(6)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(5)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(6)); + } + + TEST(MWWorldWeatherTest, secundaPhasesFirstQuarterToWaxingGibbousAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 20 and 44, 7:07 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 20 + 7.0f + 6.0f / 60.0f); + timeStampAfter += (24.0f * 20 + 7.0f + 8.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 44 + 7.0f + 6.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 44 + 7.0f + 8.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(6)); + EXPECT_EQ(afterState.mPhase, static_cast(7)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(6)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(7)); + } + + TEST(MWWorldWeatherTest, secundaPhasesWaxingGibbousToFullAtCorrectTimes) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 23 and 47, 10:43 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 23 + 10.0f + 42.0f / 60.0f); + timeStampAfter += (24.0f * 23 + 10.0f + 44.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 47 + 10.0f + 42.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 47 + 10.0f + 44.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_EQ(beforeState.mPhase, static_cast(7)); + EXPECT_EQ(afterState.mPhase, static_cast(0)); + EXPECT_EQ(beforeStatePostLoop.mPhase, static_cast(7)); + EXPECT_EQ(afterStatePostLoop.mPhase, static_cast(0)); + } + + // OFFSETS + + TEST(MWWorldWeatherTest, secundaShouldApplyIncrementOffsetAfterFirstLoop) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 14.0f; + float fadeInFinish = 15.0f; + float fadeOutStart = 7.0f; + float fadeOutFinish = 10.0f; + float axisOffset = 50.0f; + + // Days 8 and 32, 3:16 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 8 + 3.0f + 15.0f / 60.0f); + timeStampAfter += (24.0f * 8 + 3.0f + 17.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 32 + 3.0f + 15.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 32 + 3.0f + 17.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_LE(beforeState.mMoonAlpha, 0.0f); + EXPECT_GT(afterState.mMoonAlpha, 0.0f); + EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); + EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + } + + TEST(MWWorldWeatherTest, moonWithLowIncrementShouldApplyIncrementOffsetAfterCycle) + { + float dailyIncrement = 0.9f; + float speed = 0.5f; + float fadeEndAngle = 40.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 0.0f; + float fadeInFinish = 0.0f; + float fadeOutStart = 0.0f; + float fadeOutFinish = 0.0f; + float axisOffset = 35.0f; + + // Days 7 and 31, 1:44 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 7 + 1.0f + 43.0f / 60.0f); + timeStampAfter += (24.0f * 7 + 1.0f + 45.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 31 + 1.0f + 43.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 31 + 1.0f + 45.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_LE(beforeState.mMoonAlpha, 0.0f); + EXPECT_GT(afterState.mMoonAlpha, 0.0f); + EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); + EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + } + + TEST(MWWorldWeatherTest, masserShouldApplyIncrementOffsetAfterCycle) + { + float dailyIncrement = 1.0f; + float speed = 0.5f; + float fadeEndAngle = 40.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 0.0f; + float fadeInFinish = 0.0f; + float fadeOutStart = 0.0f; + float fadeOutFinish = 0.0f; + float axisOffset = 35.0f; + + // Days 4 and 28, 1:02 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 4 + 1.0f + 1.0f / 60.0f); + timeStampAfter += (24.0f * 4 + 1.0f + 3.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 28 + 1.0f + 1.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 28 + 1.0f + 3.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_LE(beforeState.mMoonAlpha, 0.0f); + EXPECT_GT(afterState.mMoonAlpha, 0.0f); + EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); + EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + } + + TEST(MWWorldWeatherTest, secundaShouldApplyIncrementOffsetAfterCycle) + { + float dailyIncrement = 1.2f; + float speed = 0.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 0.0f; + float fadeInFinish = 0.0f; + float fadeOutStart = 0.0f; + float fadeOutFinish = 0.0f; + float axisOffset = 50.0f; + + // Days 3 and 27, 2:04 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 3 + 2.0f + 3.0f / 60.0f); + timeStampAfter += (24.0f * 3 + 2.0f + 5.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 27 + 2.0f + 3.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 27 + 2.0f + 5.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_LE(beforeState.mMoonAlpha, 0.0f); + EXPECT_GT(afterState.mMoonAlpha, 0.0f); + EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); + EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + } + + TEST(MWWorldWeatherTest, moonWithIncreasedSpeedShouldApplyIncrementOffsetAfterCycle) + { + float dailyIncrement = 1.2f; + float speed = 1.6f; + float fadeEndAngle = 30.0f; + float fadeStartAngle = 50.0f; + float moonShadowEarlyFadeAngle = 0.5f; + float fadeInStart = 0.0f; + float fadeInFinish = 0.0f; + float fadeOutStart = 0.0f; + float fadeOutFinish = 0.0f; + float axisOffset = 50.0f; + + // Days 4 and 28, 1:13 + TimeStamp timeStampBefore, timeStampAfter, timeStampBeforePostLoop, timeStampAfterPostLoop; + timeStampBefore += (24.0f * 4 + 1.0f + 12.0f / 60.0f); + timeStampAfter += (24.0f * 4 + 1.0f + 14.0f / 60.0f); + timeStampBeforePostLoop += (24.0f * 28 + 1.0f + 12.0f / 60.0f); + timeStampAfterPostLoop += (24.0f * 28 + 1.0f + 14.0f / 60.0f); + + MWWorld::MoonModel moon = MWWorld::MoonModel("", fadeInStart, fadeInFinish, fadeOutStart, fadeOutFinish, + axisOffset, speed, dailyIncrement, fadeStartAngle, fadeEndAngle, moonShadowEarlyFadeAngle); + + MWRender::MoonState beforeState = moon.calculateState(timeStampBefore); + MWRender::MoonState afterState = moon.calculateState(timeStampAfter); + MWRender::MoonState beforeStatePostLoop = moon.calculateState(timeStampBeforePostLoop); + MWRender::MoonState afterStatePostLoop = moon.calculateState(timeStampAfterPostLoop); + + EXPECT_LE(beforeState.mMoonAlpha, 0.0f); + EXPECT_GT(afterState.mMoonAlpha, 0.0f); + EXPECT_LE(beforeStatePostLoop.mMoonAlpha, 0.0f); + EXPECT_GT(afterStatePostLoop.mMoonAlpha, 0.0f); + } } }