mirror of
https://github.com/g-truc/glm.git
synced 2024-12-01 20:24:38 +00:00
Merge branch '0.9.5'
This commit is contained in:
commit
dec4db0b15
@ -164,8 +164,8 @@ namespace glm
|
|||||||
/// @param far
|
/// @param far
|
||||||
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
||||||
/// @see gtc_matrix_transform
|
/// @see gtc_matrix_transform
|
||||||
template <typename T, precision P>
|
template <typename T>
|
||||||
GLM_FUNC_DECL detail::tmat4x4<T, P> frustum(
|
GLM_FUNC_DECL detail::tmat4x4<T, defaultp> frustum(
|
||||||
T const & left,
|
T const & left,
|
||||||
T const & right,
|
T const & right,
|
||||||
T const & bottom,
|
T const & bottom,
|
||||||
@ -181,8 +181,8 @@ namespace glm
|
|||||||
/// @param far
|
/// @param far
|
||||||
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
||||||
/// @see gtc_matrix_transform
|
/// @see gtc_matrix_transform
|
||||||
template <typename T, precision P>
|
template <typename T>
|
||||||
GLM_FUNC_DECL detail::tmat4x4<T, P> perspective(
|
GLM_FUNC_DECL detail::tmat4x4<T, defaultp> perspective(
|
||||||
T const & fovy,
|
T const & fovy,
|
||||||
T const & aspect,
|
T const & aspect,
|
||||||
T const & near,
|
T const & near,
|
||||||
@ -197,8 +197,8 @@ namespace glm
|
|||||||
/// @param far
|
/// @param far
|
||||||
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
||||||
/// @see gtc_matrix_transform
|
/// @see gtc_matrix_transform
|
||||||
template <typename T, precision P>
|
template <typename T>
|
||||||
GLM_FUNC_DECL detail::tmat4x4<T, P> perspectiveFov(
|
GLM_FUNC_DECL detail::tmat4x4<T, defaultp> perspectiveFov(
|
||||||
T const & fov,
|
T const & fov,
|
||||||
T const & width,
|
T const & width,
|
||||||
T const & height,
|
T const & height,
|
||||||
@ -212,8 +212,8 @@ namespace glm
|
|||||||
/// @param near
|
/// @param near
|
||||||
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
||||||
/// @see gtc_matrix_transform
|
/// @see gtc_matrix_transform
|
||||||
template <typename T, precision P>
|
template <typename T>
|
||||||
GLM_FUNC_DECL detail::tmat4x4<T, P> infinitePerspective(
|
GLM_FUNC_DECL detail::tmat4x4<T, defaultp> infinitePerspective(
|
||||||
T fovy, T aspect, T near);
|
T fovy, T aspect, T near);
|
||||||
|
|
||||||
/// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.
|
/// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping.
|
||||||
@ -223,9 +223,9 @@ namespace glm
|
|||||||
/// @param near
|
/// @param near
|
||||||
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
/// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double.
|
||||||
/// @see gtc_matrix_transform
|
/// @see gtc_matrix_transform
|
||||||
template <typename T, precision P>
|
template <typename T>
|
||||||
GLM_FUNC_DECL detail::tmat4x4<T, P> tweakedInfinitePerspective(
|
GLM_FUNC_DECL detail::tmat4x4<T, defaultp> tweakedInfinitePerspective(
|
||||||
T fovy, T aspect, T near);
|
T fovy, T aspect, T near, T epsilon = epsilon<T>());
|
||||||
|
|
||||||
/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.
|
/// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.
|
||||||
///
|
///
|
||||||
|
@ -192,87 +192,87 @@ namespace glm
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename valType>
|
template <typename T>
|
||||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> frustum
|
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> frustum
|
||||||
(
|
(
|
||||||
valType const & left,
|
T const & left,
|
||||||
valType const & right,
|
T const & right,
|
||||||
valType const & bottom,
|
T const & bottom,
|
||||||
valType const & top,
|
T const & top,
|
||||||
valType const & nearVal,
|
T const & nearVal,
|
||||||
valType const & farVal
|
T const & farVal
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
detail::tmat4x4<valType, defaultp> Result(0);
|
detail::tmat4x4<T, defaultp> Result(0);
|
||||||
Result[0][0] = (valType(2) * nearVal) / (right - left);
|
Result[0][0] = (static_cast<T>(2) * nearVal) / (right - left);
|
||||||
Result[1][1] = (valType(2) * nearVal) / (top - bottom);
|
Result[1][1] = (static_cast<T>(2) * nearVal) / (top - bottom);
|
||||||
Result[2][0] = (right + left) / (right - left);
|
Result[2][0] = (right + left) / (right - left);
|
||||||
Result[2][1] = (top + bottom) / (top - bottom);
|
Result[2][1] = (top + bottom) / (top - bottom);
|
||||||
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
|
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
|
||||||
Result[2][3] = valType(-1);
|
Result[2][3] = static_cast<T>(-1);
|
||||||
Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);
|
Result[3][2] = -(static_cast<T>(2) * farVal * nearVal) / (farVal - nearVal);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename valType>
|
template <typename T>
|
||||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> perspective
|
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> perspective
|
||||||
(
|
(
|
||||||
valType const & fovy,
|
T const & fovy,
|
||||||
valType const & aspect,
|
T const & aspect,
|
||||||
valType const & zNear,
|
T const & zNear,
|
||||||
valType const & zFar
|
T const & zFar
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
assert(aspect != valType(0));
|
assert(aspect != static_cast<T>(0));
|
||||||
assert(zFar != zNear);
|
assert(zFar != zNear);
|
||||||
|
|
||||||
#ifdef GLM_FORCE_RADIANS
|
#ifdef GLM_FORCE_RADIANS
|
||||||
valType const rad = fovy;
|
T const rad = fovy;
|
||||||
#else
|
#else
|
||||||
# pragma message("GLM: perspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
|
# pragma message("GLM: perspective function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
|
||||||
valType const rad = glm::radians(fovy);
|
T const rad = glm::radians(fovy);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
valType tanHalfFovy = tan(rad / valType(2));
|
T tanHalfFovy = tan(rad / static_cast<T>(2));
|
||||||
|
|
||||||
detail::tmat4x4<valType, defaultp> Result(valType(0));
|
detail::tmat4x4<T, defaultp> Result(static_cast<T>(0));
|
||||||
Result[0][0] = valType(1) / (aspect * tanHalfFovy);
|
Result[0][0] = static_cast<T>(1) / (aspect * tanHalfFovy);
|
||||||
Result[1][1] = valType(1) / (tanHalfFovy);
|
Result[1][1] = static_cast<T>(1) / (tanHalfFovy);
|
||||||
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
||||||
Result[2][3] = - valType(1);
|
Result[2][3] = - static_cast<T>(1);
|
||||||
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
|
Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename valType>
|
template <typename T>
|
||||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType, defaultp> perspectiveFov
|
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> perspectiveFov
|
||||||
(
|
(
|
||||||
valType const & fov,
|
T const & fov,
|
||||||
valType const & width,
|
T const & width,
|
||||||
valType const & height,
|
T const & height,
|
||||||
valType const & zNear,
|
T const & zNear,
|
||||||
valType const & zFar
|
T const & zFar
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
assert(width > valType(0));
|
assert(width > static_cast<T>(0));
|
||||||
assert(height > valType(0));
|
assert(height > static_cast<T>(0));
|
||||||
assert(fov > valType(0));
|
assert(fov > static_cast<T>(0));
|
||||||
|
|
||||||
#ifdef GLM_FORCE_RADIANS
|
#ifdef GLM_FORCE_RADIANS
|
||||||
valType rad = fov;
|
T rad = fov;
|
||||||
#else
|
#else
|
||||||
# pragma message("GLM: perspectiveFov function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
|
# pragma message("GLM: perspectiveFov function taking degrees as a parameter is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
|
||||||
valType rad = glm::radians(fov);
|
T rad = glm::radians(fov);
|
||||||
#endif
|
#endif
|
||||||
valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);
|
T h = glm::cos(static_cast<T>(0.5) * rad) / glm::sin(static_cast<T>(0.5) * rad);
|
||||||
valType w = h * height / width; ///todo max(width , Height) / min(width , Height)?
|
T w = h * height / width; ///todo max(width , Height) / min(width , Height)?
|
||||||
|
|
||||||
detail::tmat4x4<valType, defaultp> Result(valType(0));
|
detail::tmat4x4<valType, defaultp> Result(static_cast<T>(0));
|
||||||
Result[0][0] = w;
|
Result[0][0] = w;
|
||||||
Result[1][1] = h;
|
Result[1][1] = h;
|
||||||
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
||||||
Result[2][3] = - valType(1);
|
Result[2][3] = - static_cast<T>(1);
|
||||||
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
|
Result[3][2] = - (static_cast<T>(2) * zFar * zNear) / (zFar - zNear);
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,12 +304,14 @@ namespace glm
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Infinite projection matrix: http://www.terathon.com/gdc07_lengyel.pdf
|
||||||
template <typename T>
|
template <typename T>
|
||||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> tweakedInfinitePerspective
|
GLM_FUNC_QUALIFIER detail::tmat4x4<T, defaultp> tweakedInfinitePerspective
|
||||||
(
|
(
|
||||||
T fovy,
|
T fovy,
|
||||||
T aspect,
|
T aspect,
|
||||||
T zNear
|
T zNear,
|
||||||
|
T epsilon
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
#ifdef GLM_FORCE_RADIANS
|
#ifdef GLM_FORCE_RADIANS
|
||||||
@ -324,11 +326,11 @@ namespace glm
|
|||||||
T top = range;
|
T top = range;
|
||||||
|
|
||||||
detail::tmat4x4<T, defaultp> Result(T(0));
|
detail::tmat4x4<T, defaultp> Result(T(0));
|
||||||
Result[0][0] = (T(2) * zNear) / (right - left);
|
Result[0][0] = (static_cast<T>(2) * zNear) / (right - left);
|
||||||
Result[1][1] = (T(2) * zNear) / (top - bottom);
|
Result[1][1] = (static_cast<T>(2) * zNear) / (top - bottom);
|
||||||
Result[2][2] = static_cast<T>(0.0001) - T(1);
|
Result[2][2] = epsilon - static_cast<T>(1);
|
||||||
Result[2][3] = static_cast<T>(-1);
|
Result[2][3] = static_cast<T>(-1);
|
||||||
Result[3][2] = - (T(0.0001) - T(2)) * zNear;
|
Result[3][2] = (epsilon - static_cast<T>(2)) * zNear;
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +59,9 @@ GLM 0.9.5.4: 2014-0X-XX
|
|||||||
- Fixed lerp when cosTheta is close to 1 in quaternion slerp #210
|
- Fixed lerp when cosTheta is close to 1 in quaternion slerp #210
|
||||||
- Added GTX_io for io with <iostream> #144
|
- Added GTX_io for io with <iostream> #144
|
||||||
- Fixed fastDistance ambiguity #215
|
- Fixed fastDistance ambiguity #215
|
||||||
|
- Fixed tweakedInfinitePerspective #208 and added user-defined epsilon to
|
||||||
|
tweakedInfinitePerspective
|
||||||
|
- Fixed std::copy and std::vector with GLM types #214
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
GLM 0.9.5.3: 2014-04-02
|
GLM 0.9.5.3: 2014-04-02
|
||||||
|
@ -93,29 +93,42 @@ int test_std_copy()
|
|||||||
{
|
{
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::vector<int> High;
|
||||||
|
High.resize(64);
|
||||||
|
std::vector<int> Medium(High.size());
|
||||||
|
|
||||||
|
std::copy(High.begin(), High.end(), Medium.begin());
|
||||||
|
|
||||||
|
*Medium.begin() = *High.begin();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::vector<glm::dvec4> High4;
|
std::vector<glm::dvec4> High4;
|
||||||
|
High4.resize(64);
|
||||||
std::vector<glm::vec4> Medium4(High4.size());
|
std::vector<glm::vec4> Medium4(High4.size());
|
||||||
|
|
||||||
std::copy(&High4.begin()[0], &High4.end()[0], Medium4.begin());
|
std::copy(High4.begin(), High4.end(), Medium4.begin());
|
||||||
|
|
||||||
*Medium4.begin() = *High4.begin();
|
*Medium4.begin() = *High4.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::vector<glm::dvec3> High3;
|
std::vector<glm::dvec3> High3;
|
||||||
|
High3.resize(64);
|
||||||
std::vector<glm::vec3> Medium3(High3.size());
|
std::vector<glm::vec3> Medium3(High3.size());
|
||||||
|
|
||||||
std::copy(&High3.begin()[0], &High3.end()[0], Medium3.begin());
|
std::copy(High3.begin(), High3.end(), Medium3.begin());
|
||||||
|
|
||||||
*Medium3.begin() = *High3.begin();
|
*Medium3.begin() = *High3.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::vector<glm::dvec2> High2;
|
std::vector<glm::dvec2> High2;
|
||||||
|
High2.resize(64);
|
||||||
std::vector<glm::vec2> Medium2(High2.size());
|
std::vector<glm::vec2> Medium2(High2.size());
|
||||||
|
|
||||||
std::copy(&High2.begin()[0], &High2.end()[0], Medium2.begin());
|
std::copy(High2.begin(), High2.end(), Medium2.begin());
|
||||||
|
|
||||||
*Medium2.begin() = *High2.begin();
|
*Medium2.begin() = *High2.begin();
|
||||||
}
|
}
|
||||||
|
@ -11,16 +11,54 @@
|
|||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
#include <glm/gtc/constants.hpp>
|
#include <glm/gtc/constants.hpp>
|
||||||
|
|
||||||
int main()
|
int test_perspective()
|
||||||
{
|
{
|
||||||
int Error = 0;
|
int Error = 0;
|
||||||
|
|
||||||
glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.0f);
|
glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, 4.0f / 3.0f, 0.1f, 100.0f);
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_pick()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
glm::mat4 Pick = glm::pickMatrix(glm::vec2(1, 2), glm::vec2(3, 4), glm::ivec4(0, 0, 320, 240));
|
glm::mat4 Pick = glm::pickMatrix(glm::vec2(1, 2), glm::vec2(3, 4), glm::ivec4(0, 0, 320, 240));
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_tweakedInfinitePerspective()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
glm::mat4 ProjectionA = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f);
|
||||||
|
glm::mat4 ProjectionB = glm::tweakedInfinitePerspective(45.f, 640.f/480.f, 1.0f, 0.001f);
|
||||||
|
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_translate()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
glm::lowp_vec3 v(1.0);
|
glm::lowp_vec3 v(1.0);
|
||||||
glm::lowp_mat4 m(0);
|
glm::lowp_mat4 m(0);
|
||||||
glm::lowp_mat4 t = glm::translate(m, v);
|
glm::lowp_mat4 t = glm::translate(m, v);
|
||||||
|
|
||||||
return Error;
|
return Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int Error = 0;
|
||||||
|
|
||||||
|
Error += test_translate();
|
||||||
|
Error += test_tweakedInfinitePerspective();
|
||||||
|
Error += test_pick();
|
||||||
|
Error += test_perspective();
|
||||||
|
|
||||||
|
return Error;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user