From d57287cf7577dc56d95ea77a87357299e4c61388 Mon Sep 17 00:00:00 2001 From: Azaezel Date: Tue, 16 Jan 2018 13:40:09 -0600 Subject: [PATCH] adds an mWrap and mWrapF method for cycling values to within a given range. examples of usage would be say, keeping a rotation within 360 degrees, or hitting a tile boundary and resetting the offset --- Engine/source/math/mConsoleFunctions.cpp | 23 +++++++++++++++++++++++ Engine/source/math/mMathFn.h | 13 +++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Engine/source/math/mConsoleFunctions.cpp b/Engine/source/math/mConsoleFunctions.cpp index 651889539..c9a1f4622 100644 --- a/Engine/source/math/mConsoleFunctions.cpp +++ b/Engine/source/math/mConsoleFunctions.cpp @@ -288,6 +288,29 @@ DefineConsoleFunction( mSaturate, F32, ( F32 v ),, return mClampF( v, 0.0f, 1.0f ); } +DefineConsoleFunction(mWrapF, F32, (F32 v, F32 min, F32 max), , + "Wrap the specified value between two bounds.\n" + "@param v Input value." + "@param min Minimum Bound." + "@param max Maximum Bound." + "@returns The specified value wrapped to the specified bounds." + "@ingroup Math") +{ + return mWrapF(v, min, max); +} + +DefineConsoleFunction(mWrap, S32, (S32 v, S32 min, S32 max), , + "Wrap the specified value between two bounds.\n" + "@param v Input value." + "@param min Minimum Bound." + "@param max Maximum Bound." + "@returns The specified value wrapped to the specified bounds." + "@ingroup Math") +{ + return mWrap(v, min, max); +} + + DefineConsoleFunction( getMax, F32, ( F32 v1, F32 v2 ),, "Calculate the greater of two specified numbers.\n" "@param v1 Input value." diff --git a/Engine/source/math/mMathFn.h b/Engine/source/math/mMathFn.h index 93596f63f..a5d2b6ebb 100644 --- a/Engine/source/math/mMathFn.h +++ b/Engine/source/math/mMathFn.h @@ -237,6 +237,19 @@ inline F32 mClampF(F32 val, F32 low, F32 high) return (F32) getMax(getMin(val, high), low); } +inline S32 mWrap(S32 val, S32 low, S32 high) +{ + int len = high - low; + return low + (val >= 0 ? val % len : -val % len ? len - (-val % len) : 0); + +} + +inline F32 mWrapF(F32 val, F32 low, F32 high) +{ + F32 t = fmod(val - low, high - low); + return t < 0 ? t + high : t + low; +} + /// Template function for doing a linear interpolation between any two /// types which implement operators for scalar multiply and addition. template