maths: add smoothstep

This commit is contained in:
Danny Robson 2015-02-05 20:30:33 +11:00
parent b12d0b95fc
commit 8487f700f6
2 changed files with 23 additions and 0 deletions

View File

@ -19,6 +19,8 @@
#include "maths.hpp" #include "maths.hpp"
#include "debug.hpp"
#include "float.hpp" #include "float.hpp"
#include <cmath> #include <cmath>
@ -174,3 +176,11 @@ sign (double val) {
template int sign (int); template int sign (int);
//-----------------------------------------------------------------------------
// Simple instantiations. Some functions aren't used internally to the library
// so it's easier to instantiate early and check for broken code at library
// build time.
template float smoothstep (float, float, float);
template double smoothstep (double, double, double);

View File

@ -20,6 +20,8 @@
#ifndef __MATHS_HPP #ifndef __MATHS_HPP
#define __MATHS_HPP #define __MATHS_HPP
#include "debug.hpp"
#include <cstdint> #include <cstdint>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
@ -284,6 +286,17 @@ limit [[gnu::pure]] (const T val, const U hi, const V lo)
} }
// clamped cubic hermite interpolation
template <typename T>
T
smoothstep [[gnu::pure]] (T a, T b, T x)
{
CHECK_LE(a, b);
x = limit ((x - a) / (b - a), T{0}, T{1});
return x * x * (3 - 2 * x);
}
#include "maths.ipp" #include "maths.ipp"
#endif // __MATHS_HPP #endif // __MATHS_HPP