1/// @ref gtx_spline
2/// @file glm/gtx/spline.inl
3
4namespace glm
5{
6	template <typename genType>
7	GLM_FUNC_QUALIFIER genType catmullRom
8	(
9		genType const & v1,
10		genType const & v2,
11		genType const & v3,
12		genType const & v4,
13		typename genType::value_type const & s
14	)
15	{
16		typename genType::value_type s1 = s;
17		typename genType::value_type s2 = pow2(s);
18		typename genType::value_type s3 = pow3(s);
19
20		typename genType::value_type f1 = -s3 + typename genType::value_type(2) * s2 - s;
21		typename genType::value_type f2 = typename genType::value_type(3) * s3 - typename genType::value_type(5) * s2 + typename genType::value_type(2);
22		typename genType::value_type f3 = typename genType::value_type(-3) * s3 + typename genType::value_type(4) * s2 + s;
23		typename genType::value_type f4 = s3 - s2;
24
25		return (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) / typename genType::value_type(2);
26
27	}
28
29	template <typename genType>
30	GLM_FUNC_QUALIFIER genType hermite
31	(
32		genType const & v1,
33		genType const & t1,
34		genType const & v2,
35		genType const & t2,
36		typename genType::value_type const & s
37	)
38	{
39		typename genType::value_type s1 = s;
40		typename genType::value_type s2 = pow2(s);
41		typename genType::value_type s3 = pow3(s);
42
43		typename genType::value_type f1 = typename genType::value_type(2) * s3 - typename genType::value_type(3) * s2 + typename genType::value_type(1);
44		typename genType::value_type f2 = typename genType::value_type(-2) * s3 + typename genType::value_type(3) * s2;
45		typename genType::value_type f3 = s3 - typename genType::value_type(2) * s2 + s;
46		typename genType::value_type f4 = s3 - s2;
47
48		return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2;
49	}
50
51	template <typename genType>
52	GLM_FUNC_QUALIFIER genType cubic
53	(
54		genType const & v1,
55		genType const & v2,
56		genType const & v3,
57		genType const & v4,
58		typename genType::value_type const & s
59	)
60	{
61		return ((v1 * s + v2) * s + v3) * s + v4;
62	}
63}//namespace glm
64