Move and rework pow to math/SGMisc
This commit is contained in:
@@ -58,6 +58,22 @@ public:
|
|||||||
return var = max(var - rate * dt, target);
|
return var = max(var - rate * dt, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get @c base raised to the power of @c N
|
||||||
|
*
|
||||||
|
* @tparam N Exponent
|
||||||
|
* @param base Base
|
||||||
|
*/
|
||||||
|
template<int N>
|
||||||
|
static T pow(T base)
|
||||||
|
{
|
||||||
|
return (N < 0)
|
||||||
|
? (1. / pow<-N>(base))
|
||||||
|
: ( ((N & 1) ? base : 1)
|
||||||
|
* ((N > 1) ? pow<N / 2>(base * base) : 1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static int sign(const T& a)
|
static int sign(const T& a)
|
||||||
{
|
{
|
||||||
if (a < -SGLimits<T>::min())
|
if (a < -SGLimits<T>::min())
|
||||||
|
|||||||
@@ -21,23 +21,11 @@
|
|||||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
#include "easing_functions.hxx"
|
#include "easing_functions.hxx"
|
||||||
#include <cmath>
|
#include <simgear/math/SGMath.hxx>
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
namespace simgear
|
namespace simgear
|
||||||
{
|
{
|
||||||
// TODO move somewhere to math
|
|
||||||
template<size_t N>
|
|
||||||
double pow(double base)
|
|
||||||
{
|
|
||||||
return base * pow<N - 1>(base);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
double pow<0>(double)
|
|
||||||
{
|
|
||||||
return 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Simple linear easing.
|
/// Simple linear easing.
|
||||||
double easingLinear(double t)
|
double easingLinear(double t)
|
||||||
@@ -82,7 +70,7 @@ namespace simgear
|
|||||||
{
|
{
|
||||||
static double calc(double t)
|
static double calc(double t)
|
||||||
{
|
{
|
||||||
return pow<N>(t - 1) + 1;
|
return SGMiscd::pow<N>(t - 1) + 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -93,7 +81,7 @@ namespace simgear
|
|||||||
{
|
{
|
||||||
static double calc(double t)
|
static double calc(double t)
|
||||||
{
|
{
|
||||||
return -pow<N>(t - 1) + 1;
|
return -SGMiscd::pow<N>(t - 1) + 1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -114,7 +102,7 @@ namespace simgear
|
|||||||
template<size_t N>
|
template<size_t N>
|
||||||
double easeInOutPow(double t)
|
double easeInOutPow(double t)
|
||||||
{
|
{
|
||||||
return easeInOut<&pow<N>, &easeOutPow<N> >(t);
|
return easeInOut<&SGMiscd::pow<N>, &easeOutPow<N> >(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// http://easings.net/#easeInExpo
|
/// http://easings.net/#easeInExpo
|
||||||
@@ -132,13 +120,13 @@ namespace simgear
|
|||||||
/// http://easings.net/#easeInCirc
|
/// http://easings.net/#easeInCirc
|
||||||
double easeInCirc(double t)
|
double easeInCirc(double t)
|
||||||
{
|
{
|
||||||
return 1 - std::sqrt(1 - pow<2>(t));
|
return 1 - std::sqrt(1 - SGMiscd::pow<2>(t));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// http://easings.net/#easeOutCirc
|
/// http://easings.net/#easeOutCirc
|
||||||
double easeOutCirc(double t)
|
double easeOutCirc(double t)
|
||||||
{
|
{
|
||||||
return std::sqrt(1 - pow<2>(t - 1));
|
return std::sqrt(1 - SGMiscd::pow<2>(t - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const double ease_s = 1.70158;
|
static const double ease_s = 1.70158;
|
||||||
@@ -147,14 +135,14 @@ namespace simgear
|
|||||||
double easeInBack(double t)
|
double easeInBack(double t)
|
||||||
{
|
{
|
||||||
|
|
||||||
return pow<2>(t) * ((ease_s + 1) * t - ease_s);
|
return SGMiscd::pow<2>(t) * ((ease_s + 1) * t - ease_s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// http://easings.net/#easeOutBack
|
/// http://easings.net/#easeOutBack
|
||||||
double easeOutBack(double t)
|
double easeOutBack(double t)
|
||||||
{
|
{
|
||||||
t -= 1;
|
t -= 1;
|
||||||
return pow<2>(t) * ((ease_s + 1) * t + ease_s) + 1;
|
return SGMiscd::pow<2>(t) * ((ease_s + 1) * t + ease_s) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// http://easings.net/#easeOutBack
|
/// http://easings.net/#easeOutBack
|
||||||
@@ -190,13 +178,13 @@ namespace simgear
|
|||||||
double easeOutBounce(double t)
|
double easeOutBounce(double t)
|
||||||
{
|
{
|
||||||
if( t < 1/2.75 )
|
if( t < 1/2.75 )
|
||||||
return 7.5625 * pow<2>(t);
|
return 7.5625 * SGMiscd::pow<2>(t);
|
||||||
else if( t < 2/2.75 )
|
else if( t < 2/2.75 )
|
||||||
return 7.5625 * pow<2>(t - 1.5/2.75) + .75;
|
return 7.5625 * SGMiscd::pow<2>(t - 1.5/2.75) + .75;
|
||||||
else if( t < 2.5/2.75 )
|
else if( t < 2.5/2.75 )
|
||||||
return 7.5625 * pow<2>(t - 2.25/2.75) + .9375;
|
return 7.5625 * SGMiscd::pow<2>(t - 2.25/2.75) + .9375;
|
||||||
else
|
else
|
||||||
return 7.5625 * pow<2>(t - 2.625/2.75) + .984375;
|
return 7.5625 * SGMiscd::pow<2>(t - 2.625/2.75) + .984375;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// http://easings.net/#easeInBounce
|
/// http://easings.net/#easeInBounce
|
||||||
@@ -216,10 +204,10 @@ namespace simgear
|
|||||||
{"linear", &easingLinear},
|
{"linear", &easingLinear},
|
||||||
{"swing", &easeInOutSine},
|
{"swing", &easeInOutSine},
|
||||||
SG_ADD_EASING_IN_OUT(Sine)
|
SG_ADD_EASING_IN_OUT(Sine)
|
||||||
{"easeInQuad", &pow<2>},
|
{"easeInQuad", &SGMiscd::pow<2>},
|
||||||
{"easeInCubic", &pow<3>},
|
{"easeInCubic", &SGMiscd::pow<3>},
|
||||||
{"easeInQuart", &pow<4>},
|
{"easeInQuart", &SGMiscd::pow<4>},
|
||||||
{"easeInQuint", &pow<5>},
|
{"easeInQuint", &SGMiscd::pow<5>},
|
||||||
{"easeOutQuad", &easeOutPow<2>},
|
{"easeOutQuad", &easeOutPow<2>},
|
||||||
{"easeOutCubic", &easeOutPow<3>},
|
{"easeOutCubic", &easeOutPow<3>},
|
||||||
{"easeOutQuart", &easeOutPow<4>},
|
{"easeOutQuart", &easeOutPow<4>},
|
||||||
|
|||||||
Reference in New Issue
Block a user