|
@@ -9,6 +9,28 @@
|
|
|
|
|
|
|
|
namespace glm
|
|
namespace glm
|
|
|
{
|
|
{
|
|
|
|
|
+ template <typename T, precision P>
|
|
|
|
|
+ GLM_FUNC_QUALIFIER detail::tvec3<T, P> slerp
|
|
|
|
|
+ (
|
|
|
|
|
+ detail::tvec3<T, P> const & x,
|
|
|
|
|
+ detail::tvec3<T, P> const & y,
|
|
|
|
|
+ T const & a
|
|
|
|
|
+ )
|
|
|
|
|
+ {
|
|
|
|
|
+ // get cosine of angle between vectors (-1 -> 1)
|
|
|
|
|
+ T CosAlpha = dot(x, y);
|
|
|
|
|
+ // get angle (0 -> pi)
|
|
|
|
|
+ T Alpha = acos(CosAlpha);
|
|
|
|
|
+ // get sine of angle between vectors (0 -> 1)
|
|
|
|
|
+ T SinAlpha = sin(Alpha);
|
|
|
|
|
+ // this breaks down when SinAlpha = 0, i.e. Alpha = 0 or pi
|
|
|
|
|
+ T t1 = sin((static_cast<T>(1) - a) * Alpha) / SinAlpha;
|
|
|
|
|
+ T t2 = sin(a * Alpha) / sinAlpha;
|
|
|
|
|
+
|
|
|
|
|
+ // interpolate src vectors
|
|
|
|
|
+ return x * t1 + y * t2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
template <typename T, precision P>
|
|
template <typename T, precision P>
|
|
|
GLM_FUNC_QUALIFIER detail::tvec2<T, P> rotate
|
|
GLM_FUNC_QUALIFIER detail::tvec2<T, P> rotate
|
|
|
(
|
|
(
|