|
|
|
@ -95,6 +95,60 @@ namespace glm |
|
|
|
|
return m * Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear(mat<4, 4, T, Q> const &m, vec<3, T, Q> const& p, vec<2, T, Q> const &l_x, vec<2, T, Q> const &l_y, vec<2, T, Q> const &l_z) |
|
|
|
|
{ |
|
|
|
|
T const lambda_xy = l_x[0]; |
|
|
|
|
T const lambda_xz = l_x[1]; |
|
|
|
|
T const lambda_yx = l_y[0]; |
|
|
|
|
T const lambda_yz = l_y[1]; |
|
|
|
|
T const lambda_zx = l_z[0]; |
|
|
|
|
T const lambda_zy = l_z[1]; |
|
|
|
|
|
|
|
|
|
vec<3, T, Q> point_lambda = vec<3, T, Q>( |
|
|
|
|
(lambda_xy + lambda_xz), (lambda_yx + lambda_yz), (lambda_zx + lambda_zy) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
mat<4, 4, T, Q> Shear = mat<4, 4, T, Q>( |
|
|
|
|
1 , lambda_yx , lambda_zx , 0, |
|
|
|
|
lambda_xy , 1 , lambda_zy , 0, |
|
|
|
|
lambda_xz , lambda_yz , 1 , 0, |
|
|
|
|
-point_lambda[0] * p[0], -point_lambda[1] * p[1], -point_lambda[2] * p[2], 1 |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
mat<4, 4, T, Q> Result; |
|
|
|
|
Result[0] = Shear[0] * m[0][0] + Shear[1] * m[0][1] + Shear[2] * m[0][2] + Shear[3] * m[0][3]; |
|
|
|
|
Result[1] = Shear[0] * m[1][0] + Shear[1] * m[1][1] + Shear[2] * m[1][2] + Shear[3] * m[1][3]; |
|
|
|
|
Result[2] = Shear[0] * m[2][0] + Shear[1] * m[2][1] + Shear[2] * m[2][2] + Shear[3] * m[2][3]; |
|
|
|
|
Result[3] = Shear[0] * m[3][0] + Shear[1] * m[3][1] + Shear[2] * m[3][2] + Shear[3] * m[3][3]; |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> shear_slow(mat<4, 4, T, Q> const &m, vec<3, T, Q> const& p, vec<2, T, Q> const &l_x, vec<2, T, Q> const &l_y, vec<2, T, Q> const &l_z) |
|
|
|
|
{ |
|
|
|
|
T const lambda_xy = static_cast<T>(l_x[0]); |
|
|
|
|
T const lambda_xz = static_cast<T>(l_x[1]); |
|
|
|
|
T const lambda_yx = static_cast<T>(l_y[0]); |
|
|
|
|
T const lambda_yz = static_cast<T>(l_y[1]); |
|
|
|
|
T const lambda_zx = static_cast<T>(l_z[0]); |
|
|
|
|
T const lambda_zy = static_cast<T>(l_z[1]); |
|
|
|
|
|
|
|
|
|
vec<3, T, Q> point_lambda = vec<3, T, Q>( |
|
|
|
|
static_cast<T>(lambda_xy + lambda_xz), |
|
|
|
|
static_cast<T>(lambda_yx + lambda_yz), |
|
|
|
|
static_cast<T>(lambda_zx + lambda_zy) |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
mat<4, 4, T, Q> Shear = mat<4, 4, T, Q>( |
|
|
|
|
1 , lambda_yx , lambda_zx , 0, |
|
|
|
|
lambda_xy , 1 , lambda_zy , 0, |
|
|
|
|
lambda_xz , lambda_yz , 1 , 0, |
|
|
|
|
-point_lambda[0] * p[0], -point_lambda[1] * p[1], -point_lambda[2] * p[2], 1 |
|
|
|
|
); |
|
|
|
|
return m * Shear; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<typename T, qualifier Q> |
|
|
|
|
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up) |
|
|
|
|
{ |
|
|
|
|