15#include <vsg/maths/common.h>
33 const T zero(numbers<T>::zero());
34 const T one(numbers<T>::one());
35 const T two(numbers<T>::two());
37 return t_mat4<T>(one - two * (qyy + qzz), two * (qxy + qwz), two * (qxz - qwy), zero,
38 two * (qxy - qwz), one - two * (qxx + qzz), two * (qyz + qwx), zero,
39 two * (qxz + qwy), two * (qyz - qwx), one - two * (qxx + qyy), zero,
40 zero, zero, zero, one);
45 t_mat4<T> rotate(T angle_radians, T x, T y, T z)
47 const T zero(numbers<T>::zero());
48 const T one(numbers<T>::one());
49 const T c = std::cos(angle_radians);
50 const T s = std::sin(angle_radians);
51 const T one_minus_c = one - c;
52 return t_mat4<T>(x * x * one_minus_c + c, y * x * one_minus_c + z * s, x * z * one_minus_c - y * s, zero,
53 x * y * one_minus_c - z * s, y * y * one_minus_c + c, y * z * one_minus_c + x * s, zero,
54 x * z * one_minus_c + y * s, y * z * one_minus_c - x * s, z * z * one_minus_c + c, zero,
55 zero, zero, zero, one);
62 return rotate(angle_radians, v.value[0], v.value[1], v.value[2]);
67 constexpr t_mat4<T> translate(T x, T y, T z)
69 const T zero(numbers<T>::zero());
70 const T one(numbers<T>::one());
72 zero, one, zero, zero,
73 zero, zero, one, zero,
81 return translate(v.value[0], v.value[1], v.value[2]);
88 const T zero(numbers<T>::zero());
89 const T one(numbers<T>::one());
93 zero, zero, zero, one);
98 constexpr t_mat4<T> scale(T sx, T sy, T sz)
100 const T zero(numbers<T>::zero());
101 const T one(numbers<T>::one());
103 zero, sy, zero, zero,
104 zero, zero, sz, zero,
105 zero, zero, zero, one);
112 return scale(v.value[0], v.value[1], v.value[2]);
119 return t_mat3<T>(m[0][0], m[1][0], m[2][0],
120 m[0][1], m[1][1], m[2][1],
121 m[0][2], m[1][2], m[2][2]);
128 return t_mat4<T>(m[0][0], m[1][0], m[2][0], m[3][0],
129 m[0][1], m[1][1], m[2][1], m[3][1],
130 m[0][2], m[1][2], m[2][2], m[3][2],
131 m[0][3], m[1][3], m[2][3], m[3][3]);
140 constexpr t_mat4<T> perspective(T fovy_radians, T aspectRatio, T zNear, T zFar)
142 const T zero(numbers<T>::zero());
143 const T one(numbers<T>::one());
144 T f =
static_cast<T
>(one / std::tan(fovy_radians * numbers<T>::half()));
145 T r =
static_cast<T
>(one / (zFar - zNear));
146 return t_mat4<T>(f / aspectRatio, zero, zero, zero,
147 zero, -f, zero, zero,
148 zero, zero, zNear * r, -one,
149 zero, zero, (zFar * zNear) * r, zero);
154 constexpr t_mat4<T> perspective(T left, T right, T bottom, T top, T zNear, T zFar)
156 const T zero(numbers<T>::zero());
157 const T one(numbers<T>::one());
158 const T two(numbers<T>::two());
159 return t_mat4<T>(two * zNear / (right - left), zero, zero, zero,
160 zero, two * zNear / (bottom - top), zero, zero,
161 (right + left) / (right - left), (bottom + top) / (bottom - top), zNear / (zFar - zNear), -one,
162 zero, zero, zNear * zFar / (zFar - zNear), zero);
167 constexpr t_mat4<T> orthographic(T left, T right, T bottom, T top, T zNear, T zFar)
169 const T zero(numbers<T>::zero());
170 const T one(numbers<T>::one());
171 const T two(numbers<T>::two());
172 return t_mat4<T>(two / (right - left), zero, zero, zero,
173 zero, two / (bottom - top), zero, zero,
174 zero, zero, one / (zFar - zNear), zero,
175 -(right + left) / (right - left), -(bottom + top) / (bottom - top), zFar / (zFar - zNear), one);
183 const T zero(numbers<T>::zero());
184 const T one(numbers<T>::one());
186 vec_type forward = normalize(center - eye);
187 vec_type up_normal = normalize(up);
188 vec_type side = normalize(cross(forward, up_normal));
189 vec_type u = normalize(cross(side, forward));
191 return t_mat4<T>(side[0], u[0], -forward[0], zero,
192 side[1], u[1], -forward[1], zero,
193 side[2], u[2], -forward[2], zero,
194 zero, zero, zero, one) *
195 vsg::translate(-eye.x, -eye.y, -eye.z);
199 constexpr t_mat4<T> computeBillboardMatrix(
const t_vec3<T>& centerEye, T autoscaleDistance)
201 const T zero(numbers<T>::zero());
202 const T one(numbers<T>::one());
204 auto distance = -centerEye.z;
205 auto scale = (distance < autoscaleDistance) ? distance / autoscaleDistance : one;
207 zero, scale, zero, zero,
208 zero, zero, scale, zero,
209 zero, zero, zero, one);
212 zero, one, zero, zero,
213 zero, zero, one, zero,
214 centerEye.x, centerEye.y, centerEye.z, one);
220 enum class CoordinateConvention
230 extern VSG_DECLSPEC
bool transform(CoordinateConvention source, CoordinateConvention destination, dmat4& matrix);
233 extern VSG_DECLSPEC mat3 inverse_3x3(
const mat4& m);
236 extern VSG_DECLSPEC dmat3 inverse_3x3(
const dmat4& m);
239 extern VSG_DECLSPEC mat4 inverse_4x3(
const mat4& m);
242 extern VSG_DECLSPEC dmat4 inverse_4x3(
const dmat4& m);
245 extern VSG_DECLSPEC mat4 inverse_4x4(
const mat4& m);
248 extern VSG_DECLSPEC dmat4 inverse_4x4(
const dmat4& m);
251 extern VSG_DECLSPEC mat4 inverse(
const mat4& m);
254 extern VSG_DECLSPEC dmat4 inverse(
const dmat4& m);
257 extern VSG_DECLSPEC
float determinant(
const mat4& m);
260 extern VSG_DECLSPEC
double determinant(
const dmat4& m);
265 extern VSG_DECLSPEC
bool decompose(
const mat4& m, vec3& translation, quat& rotation, vec3& scale);
270 extern VSG_DECLSPEC
bool decompose(
const dmat4& m, dvec3& translation, dquat& rotation, dvec3& scale);
275 extern VSG_DECLSPEC
bool decompose(
const ldmat4& m, ldvec3& translation, ldquat& rotation, ldvec3& scale);
278 extern VSG_DECLSPEC sphere computeFrustumBound(
const mat4& m);
281 extern VSG_DECLSPEC dsphere computeFrustumBound(
const dmat4& m);
290 void apply(
const Transform& transform)
override;
293 void apply(
const Camera& camera)
override;
298 dmat4 computeTransform(
const T& nodePath)
300 return visit<ComputeTransform>(nodePath).matrix;
CoordinateFrame provides support for astronomically large coordinates.
Definition CoordinateFrame.h:22
t_mat3 template class that represents a 3x3 matrix.
Definition mat3.h:23
t_mat4 template class that represents a 4x4 matrix.
Definition mat4.h:25
t_quat template class that represents a quaternion
Definition quat.h:35
t_vec3 template class that represents a 3D vector
Definition vec3.h:34