|
|
|
@ -8,11 +8,7 @@ |
|
|
|
|
namespace glm |
|
|
|
|
{ |
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate |
|
|
|
|
( |
|
|
|
|
tmat4x4<T, P> const & m, |
|
|
|
|
tvec3<T, P> const & v |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> translate(tmat4x4<T, P> const & m, tvec3<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
tmat4x4<T, P> Result(m); |
|
|
|
|
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; |
|
|
|
@ -20,12 +16,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate |
|
|
|
|
( |
|
|
|
|
tmat4x4<T, P> const & m, |
|
|
|
|
T angle, |
|
|
|
|
tvec3<T, P> const & v |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate(tmat4x4<T, P> const & m, T angle, tvec3<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
T const a = angle; |
|
|
|
|
T const c = cos(a); |
|
|
|
@ -36,15 +27,15 @@ namespace glm |
|
|
|
|
|
|
|
|
|
tmat4x4<T, P> Rotate(uninitialize); |
|
|
|
|
Rotate[0][0] = c + temp[0] * axis[0]; |
|
|
|
|
Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; |
|
|
|
|
Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; |
|
|
|
|
Rotate[0][1] = temp[0] * axis[1] + s * axis[2]; |
|
|
|
|
Rotate[0][2] = temp[0] * axis[2] - s * axis[1]; |
|
|
|
|
|
|
|
|
|
Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; |
|
|
|
|
Rotate[1][0] = temp[1] * axis[0] - s * axis[2]; |
|
|
|
|
Rotate[1][1] = c + temp[1] * axis[1]; |
|
|
|
|
Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; |
|
|
|
|
Rotate[1][2] = temp[1] * axis[2] + s * axis[0]; |
|
|
|
|
|
|
|
|
|
Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; |
|
|
|
|
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; |
|
|
|
|
Rotate[2][0] = temp[2] * axis[0] + s * axis[1]; |
|
|
|
|
Rotate[2][1] = temp[2] * axis[1] - s * axis[0]; |
|
|
|
|
Rotate[2][2] = c + temp[2] * axis[2]; |
|
|
|
|
|
|
|
|
|
tmat4x4<T, P> Result(uninitialize); |
|
|
|
@ -56,12 +47,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate_slow |
|
|
|
|
( |
|
|
|
|
tmat4x4<T, P> const & m, |
|
|
|
|
T angle, |
|
|
|
|
tvec3<T, P> const & v |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> rotate_slow(tmat4x4<T, P> const & m, T angle, tvec3<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
T const a = angle; |
|
|
|
|
T const c = cos(a); |
|
|
|
@ -70,31 +56,27 @@ namespace glm |
|
|
|
|
|
|
|
|
|
tvec3<T, P> axis = normalize(v); |
|
|
|
|
|
|
|
|
|
Result[0][0] = c + (1 - c) * axis.x * axis.x; |
|
|
|
|
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z; |
|
|
|
|
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y; |
|
|
|
|
Result[0][3] = 0; |
|
|
|
|
Result[0][0] = c + (static_cast<T>(1) - c) * axis.x * axis.x; |
|
|
|
|
Result[0][1] = (static_cast<T>(1) - c) * axis.x * axis.y + s * axis.z; |
|
|
|
|
Result[0][2] = (static_cast<T>(1) - c) * axis.x * axis.z - s * axis.y; |
|
|
|
|
Result[0][3] = static_cast<T>(0); |
|
|
|
|
|
|
|
|
|
Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z; |
|
|
|
|
Result[1][1] = c + (1 - c) * axis.y * axis.y; |
|
|
|
|
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x; |
|
|
|
|
Result[1][3] = 0; |
|
|
|
|
Result[1][0] = (static_cast<T>(1) - c) * axis.y * axis.x - s * axis.z; |
|
|
|
|
Result[1][1] = c + (static_cast<T>(1) - c) * axis.y * axis.y; |
|
|
|
|
Result[1][2] = (static_cast<T>(1) - c) * axis.y * axis.z + s * axis.x; |
|
|
|
|
Result[1][3] = static_cast<T>(0); |
|
|
|
|
|
|
|
|
|
Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y; |
|
|
|
|
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x; |
|
|
|
|
Result[2][2] = c + (1 - c) * axis.z * axis.z; |
|
|
|
|
Result[2][3] = 0; |
|
|
|
|
Result[2][0] = (static_cast<T>(1) - c) * axis.z * axis.x + s * axis.y; |
|
|
|
|
Result[2][1] = (static_cast<T>(1) - c) * axis.z * axis.y - s * axis.x; |
|
|
|
|
Result[2][2] = c + (static_cast<T>(1) - c) * axis.z * axis.z; |
|
|
|
|
Result[2][3] = static_cast<T>(0); |
|
|
|
|
|
|
|
|
|
Result[3] = tvec4<T, P>(0, 0, 0, 1); |
|
|
|
|
return m * Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> scale |
|
|
|
|
( |
|
|
|
|
tmat4x4<T, P> const & m, |
|
|
|
|
tvec3<T, P> const & v |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> scale(tmat4x4<T, P> const & m, tvec3<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
tmat4x4<T, P> Result(uninitialize); |
|
|
|
|
Result[0] = m[0] * v[0]; |
|
|
|
@ -105,11 +87,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> scale_slow |
|
|
|
|
( |
|
|
|
|
tmat4x4<T, P> const & m, |
|
|
|
|
tvec3<T, P> const & v |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> scale_slow(tmat4x4<T, P> const & m, tvec3<T, P> const & v) |
|
|
|
|
{ |
|
|
|
|
tmat4x4<T, P> Result(T(1)); |
|
|
|
|
Result[0][0] = v.x; |
|
|
|
@ -267,13 +245,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspective |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear, |
|
|
|
|
T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspective(T fovy, T aspect, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED |
|
|
|
|
return perspectiveLH(fovy, aspect, zNear, zFar); |
|
|
|
@ -283,12 +255,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveRH |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear, T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveRH(T fovy, T aspect, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); |
|
|
|
|
|
|
|
|
@ -311,12 +278,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveLH |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear, T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveLH(T fovy, T aspect, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
assert(abs(aspect - std::numeric_limits<T>::epsilon()) > static_cast<T>(0)); |
|
|
|
|
|
|
|
|
@ -339,12 +301,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFov |
|
|
|
|
( |
|
|
|
|
T fov, |
|
|
|
|
T width, T height, |
|
|
|
|
T zNear, T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFov(T fov, T width, T height, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED |
|
|
|
|
return perspectiveFovLH(fov, width, height, zNear, zFar); |
|
|
|
@ -354,12 +311,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovRH |
|
|
|
|
( |
|
|
|
|
T fov, |
|
|
|
|
T width, T height, |
|
|
|
|
T zNear, T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovRH(T fov, T width, T height, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
assert(width > static_cast<T>(0)); |
|
|
|
|
assert(height > static_cast<T>(0)); |
|
|
|
@ -386,12 +338,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovLH |
|
|
|
|
( |
|
|
|
|
T fov, |
|
|
|
|
T width, T height, |
|
|
|
|
T zNear, T zFar |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> perspectiveFovLH(T fov, T width, T height, T zNear, T zFar) |
|
|
|
|
{ |
|
|
|
|
assert(width > static_cast<T>(0)); |
|
|
|
|
assert(height > static_cast<T>(0)); |
|
|
|
@ -418,12 +365,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspective |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspective(T fovy, T aspect, T zNear) |
|
|
|
|
{ |
|
|
|
|
# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED |
|
|
|
|
return infinitePerspectiveLH(fovy, aspect, zNear); |
|
|
|
@ -433,68 +375,52 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveRH |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveRH(T fovy, T aspect, T zNear) |
|
|
|
|
{ |
|
|
|
|
T const range = tan(fovy / T(2)) * zNear; |
|
|
|
|
T const range = tan(fovy / static_cast<T>(2)) * zNear; |
|
|
|
|
T const left = -range * aspect; |
|
|
|
|
T const right = range * aspect; |
|
|
|
|
T const bottom = -range; |
|
|
|
|
T const top = range; |
|
|
|
|
|
|
|
|
|
tmat4x4<T, defaultp> Result(T(0)); |
|
|
|
|
Result[0][0] = (T(2) * zNear) / (right - left); |
|
|
|
|
Result[1][1] = (T(2) * zNear) / (top - bottom); |
|
|
|
|
Result[2][2] = - T(1); |
|
|
|
|
Result[2][3] = - T(1); |
|
|
|
|
Result[3][2] = - T(2) * zNear; |
|
|
|
|
tmat4x4<T, defaultp> Result(static_cast<T>(0)); |
|
|
|
|
Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); |
|
|
|
|
Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); |
|
|
|
|
Result[2][2] = - static_cast<T>(1); |
|
|
|
|
Result[2][3] = - static_cast<T>(1); |
|
|
|
|
Result[3][2] = - static_cast<T>(2) * zNear; |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveLH |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> infinitePerspectiveLH(T fovy, T aspect, T zNear) |
|
|
|
|
{ |
|
|
|
|
T const range = tan(fovy / T(2)) * zNear; |
|
|
|
|
T const range = tan(fovy / static_cast<T>(2)) * zNear; |
|
|
|
|
T const left = -range * aspect; |
|
|
|
|
T const right = range * aspect; |
|
|
|
|
T const bottom = -range; |
|
|
|
|
T const top = range; |
|
|
|
|
|
|
|
|
|
tmat4x4<T, defaultp> Result(T(0)); |
|
|
|
|
Result[0][0] = (T(2) * zNear) / (right - left); |
|
|
|
|
Result[1][1] = (T(2) * zNear) / (top - bottom); |
|
|
|
|
Result[2][2] = T(1); |
|
|
|
|
Result[2][3] = T(1); |
|
|
|
|
Result[3][2] = - T(2) * zNear; |
|
|
|
|
Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); |
|
|
|
|
Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); |
|
|
|
|
Result[2][2] = static_cast<T>(1); |
|
|
|
|
Result[2][3] = static_cast<T>(1); |
|
|
|
|
Result[3][2] = - static_cast<T>(2) * zNear; |
|
|
|
|
return Result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf |
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear, |
|
|
|
|
T ep |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear, T ep) |
|
|
|
|
{ |
|
|
|
|
T const range = tan(fovy / T(2)) * zNear; |
|
|
|
|
T const range = tan(fovy / static_cast<T>(2)) * zNear; |
|
|
|
|
T const left = -range * aspect; |
|
|
|
|
T const right = range * aspect; |
|
|
|
|
T const bottom = -range; |
|
|
|
|
T const top = range; |
|
|
|
|
|
|
|
|
|
tmat4x4<T, defaultp> Result(T(0)); |
|
|
|
|
tmat4x4<T, defaultp> Result(static_cast<T>(0)); |
|
|
|
|
Result[0][0] = (static_cast<T>(2) * zNear) / (right - left); |
|
|
|
|
Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom); |
|
|
|
|
Result[2][2] = ep - static_cast<T>(1); |
|
|
|
@ -504,12 +430,7 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective |
|
|
|
|
( |
|
|
|
|
T fovy, |
|
|
|
|
T aspect, |
|
|
|
|
T zNear |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> tweakedInfinitePerspective(T fovy, T aspect, T zNear) |
|
|
|
|
{ |
|
|
|
|
return tweakedInfinitePerspective(fovy, aspect, zNear, epsilon<T>()); |
|
|
|
|
} |
|
|
|
@ -523,16 +444,16 @@ namespace glm |
|
|
|
|
tvec4<U, P> const & viewport |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
tvec4<T, P> tmp = tvec4<T, P>(obj, T(1)); |
|
|
|
|
tvec4<T, P> tmp = tvec4<T, P>(obj, static_cast<T>(1)); |
|
|
|
|
tmp = model * tmp; |
|
|
|
|
tmp = proj * tmp; |
|
|
|
|
|
|
|
|
|
tmp /= tmp.w; |
|
|
|
|
# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE |
|
|
|
|
tmp.x = tmp.x * T(0.5) + T(0.5); |
|
|
|
|
tmp.y = tmp.y * T(0.5) + T(0.5); |
|
|
|
|
tmp.x = tmp.x * static_cast<T>(0.5) + static_cast<T>(0.5); |
|
|
|
|
tmp.y = tmp.y * static_cast<T>(0.5) + static_cast<T>(0.5); |
|
|
|
|
# else |
|
|
|
|
tmp = tmp * T(0.5) + T(0.5); |
|
|
|
|
tmp = tmp * static_cast<T>(0.5) + static_cast<T>(0.5); |
|
|
|
|
# endif |
|
|
|
|
tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); |
|
|
|
|
tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); |
|
|
|
@ -555,10 +476,10 @@ namespace glm |
|
|
|
|
tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); |
|
|
|
|
tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); |
|
|
|
|
# if GLM_DEPTH_CLIP_SPACE == GLM_DEPTH_ZERO_TO_ONE |
|
|
|
|
tmp.x = tmp.x * T(2) - T(1); |
|
|
|
|
tmp.y = tmp.y * T(2) - T(1); |
|
|
|
|
tmp.x = tmp.x * static_cast<T>(2) - static_cast<T>(1); |
|
|
|
|
tmp.y = tmp.y * static_cast<T>(2) - static_cast<T>(1); |
|
|
|
|
# else |
|
|
|
|
tmp = tmp * T(2) - T(1); |
|
|
|
|
tmp = tmp * static_cast<T>(2) - static_cast<T>(1); |
|
|
|
|
# endif |
|
|
|
|
|
|
|
|
|
tvec4<T, P> obj = Inverse * tmp; |
|
|
|
@ -568,36 +489,26 @@ namespace glm |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P, typename U> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> pickMatrix |
|
|
|
|
( |
|
|
|
|
tvec2<T, P> const & center, |
|
|
|
|
tvec2<T, P> const & delta, |
|
|
|
|
tvec4<U, P> const & viewport |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> pickMatrix(tvec2<T, P> const & center, tvec2<T, P> const & delta, tvec4<U, P> const & viewport) |
|
|
|
|
{ |
|
|
|
|
assert(delta.x > T(0) && delta.y > T(0)); |
|
|
|
|
tmat4x4<T, P> Result(1.0f); |
|
|
|
|
assert(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0)); |
|
|
|
|
tmat4x4<T, P> Result(static_cast<T>(1)); |
|
|
|
|
|
|
|
|
|
if(!(delta.x > T(0) && delta.y > T(0))) |
|
|
|
|
if(!(delta.x > static_cast<T>(0) && delta.y > static_cast<T>(0))) |
|
|
|
|
return Result; // Error |
|
|
|
|
|
|
|
|
|
tvec3<T, P> Temp( |
|
|
|
|
(T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x, |
|
|
|
|
(T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y, |
|
|
|
|
T(0)); |
|
|
|
|
(static_cast<T>(viewport[2]) - static_cast<T>(2) * (center.x - static_cast<T>(viewport[0]))) / delta.x, |
|
|
|
|
(static_cast<T>(viewport[3]) - static_cast<T>(2) * (center.y - static_cast<T>(viewport[1]))) / delta.y, |
|
|
|
|
static_cast<T>(0)); |
|
|
|
|
|
|
|
|
|
// Translate and scale the picked region to the entire window |
|
|
|
|
Result = translate(Result, Temp); |
|
|
|
|
return scale(Result, tvec3<T, P>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1))); |
|
|
|
|
return scale(Result, tvec3<T, P>(static_cast<T>(viewport[2]) / delta.x, static_cast<T>(viewport[3]) / delta.y, static_cast<T>(1))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename T, precision P> |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAt |
|
|
|
|
( |
|
|
|
|
tvec3<T, P> const & eye, |
|
|
|
|
tvec3<T, P> const & center, |
|
|
|
|
tvec3<T, P> const & up |
|
|
|
|
) |
|
|
|
|
GLM_FUNC_QUALIFIER tmat4x4<T, P> lookAt(tvec3<T, P> const & eye, tvec3<T, P> const & center, tvec3<T, P> const & up) |
|
|
|
|
{ |
|
|
|
|
# if GLM_COORDINATE_SYSTEM == GLM_LEFT_HANDED |
|
|
|
|
return lookAtLH(eye, center, up); |
|
|
|
|