mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-30 20:13:22 +08:00
Update GLM to latest version (0.9.9.3). This includes GLM's change of matrices no longer default initializing to the identity matrix. This commit thus also includes the update of all of LearnOpenGL's code to reflect this: all matrices are now constructor-initialized to the identity matrix where relevant.
This commit is contained in:
@@ -1,50 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_associated_min_max
|
||||
/// @file glm/gtx/associated_min_max.hpp
|
||||
/// @date 2008-03-10 / 2014-10-11
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max
|
||||
/// @ingroup gtx
|
||||
///
|
||||
///
|
||||
/// Include <glm/gtx/associated_min_max.hpp> to use the features of this extension.
|
||||
///
|
||||
/// @brief Min and max functions that return associated values not the compared onces.
|
||||
/// <glm/gtx/associated_min_max.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GTX_associated_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_associated_min_max extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,29 +31,29 @@ namespace glm
|
||||
|
||||
/// Minimum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P>
|
||||
template<typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL U associatedMin(T x, U a, T y, U b);
|
||||
|
||||
/// Minimum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL tvec2<U, P> associatedMin(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<2, U, Q> associatedMin(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b);
|
||||
|
||||
/// Minimum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
T x, const vecType<U, P>& a,
|
||||
T y, const vecType<U, P>& b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
T x, const vec<L, U, Q>& a,
|
||||
T y, const vec<L, U, Q>& b);
|
||||
|
||||
/// Minimum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b);
|
||||
|
||||
/// Minimum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
@@ -89,11 +65,11 @@ namespace glm
|
||||
|
||||
/// Minimum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c);
|
||||
|
||||
/// Minimum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
@@ -106,30 +82,30 @@ namespace glm
|
||||
|
||||
/// Minimum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c,
|
||||
vecType<T, P> const & w, vecType<U, P> const & d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c,
|
||||
vec<L, T, Q> const& w, vec<L, U, Q> const& d);
|
||||
|
||||
/// Minimum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c,
|
||||
T w, vecType<U, P> const & d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c,
|
||||
T w, vec<L, U, Q> const& d);
|
||||
|
||||
/// Minimum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMin(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c,
|
||||
vecType<T, P> const & w, U d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMin(
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c,
|
||||
vec<L, T, Q> const& w, U d);
|
||||
|
||||
/// Maximum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
@@ -138,24 +114,24 @@ namespace glm
|
||||
|
||||
/// Maximum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL tvec2<U, P> associatedMax(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<2, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b);
|
||||
|
||||
/// Maximum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> associatedMax(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> associatedMax(
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b);
|
||||
|
||||
/// Maximum comparison between 2 variables and returns 2 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b);
|
||||
|
||||
/// Maximum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
@@ -167,27 +143,27 @@ namespace glm
|
||||
|
||||
/// Maximum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c);
|
||||
|
||||
/// Maximum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> associatedMax(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> associatedMax(
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c);
|
||||
|
||||
/// Maximum comparison between 3 variables and returns 3 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c);
|
||||
|
||||
/// Maximum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
@@ -200,30 +176,30 @@ namespace glm
|
||||
|
||||
/// Maximum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c,
|
||||
vecType<T, P> const & w, vecType<U, P> const & d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c,
|
||||
vec<L, T, Q> const& w, vec<L, U, Q> const& d);
|
||||
|
||||
/// Maximum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c,
|
||||
T w, vecType<U, P> const & d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c,
|
||||
T w, vec<L, U, Q> const& d);
|
||||
|
||||
/// Maximum comparison between 4 variables and returns 4 associated variable values
|
||||
/// @see gtx_associated_min_max
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<U, P> associatedMax(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c,
|
||||
vecType<T, P> const & w, U d);
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, U, Q> associatedMax(
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c,
|
||||
vec<L, T, Q> const& w, U d);
|
||||
|
||||
/// @}
|
||||
} //namespace glm
|
||||
|
||||
@@ -1,79 +1,49 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_associated_min_max
|
||||
/// @file glm/gtx/associated_min_max.inl
|
||||
/// @date 2008-03-10 / 2014-10-11
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
// Min comparison between 2 variables
|
||||
template<typename T, typename U, precision P>
|
||||
template<typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b)
|
||||
{
|
||||
return x < y ? a : b;
|
||||
}
|
||||
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER tvec2<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMin
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] < y[i] ? a[i] : b[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
T x, const vecType<U, P>& a,
|
||||
T y, const vecType<U, P>& b
|
||||
T x, const vec<L, U, Q>& a,
|
||||
T y, const vec<L, U, Q>& b
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x < y ? a[i] : b[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] < y[i] ? a : b;
|
||||
return Result;
|
||||
}
|
||||
@@ -91,16 +61,16 @@ GLM_FUNC_QUALIFIER U associatedMin
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
|
||||
return Result;
|
||||
}
|
||||
@@ -124,17 +94,17 @@ GLM_FUNC_QUALIFIER U associatedMin
|
||||
}
|
||||
|
||||
// Min comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c,
|
||||
vecType<T, P> const & w, vecType<U, P> const & d
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c,
|
||||
vec<L, T, Q> const& w, vec<L, U, Q> const& d
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
T Test1 = min(x[i], y[i]);
|
||||
T Test2 = min(z[i], w[i]);
|
||||
@@ -146,20 +116,20 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
}
|
||||
|
||||
// Min comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c,
|
||||
T w, vecType<U, P> const & d
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c,
|
||||
T w, vec<L, U, Q> const& d
|
||||
)
|
||||
{
|
||||
T Test1 = min(x, y);
|
||||
T Test2 = min(z, w);
|
||||
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
U Result1 = x < y ? a[i] : b[i];
|
||||
U Result2 = z < w ? c[i] : d[i];
|
||||
@@ -169,17 +139,17 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
}
|
||||
|
||||
// Min comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMin
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMin
|
||||
(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c,
|
||||
vecType<T, P> const & w, U d
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c,
|
||||
vec<L, T, Q> const& w, U d
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
T Test1 = min(x[i], y[i]);
|
||||
T Test2 = min(z[i], w[i]);;
|
||||
@@ -198,43 +168,43 @@ GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b)
|
||||
}
|
||||
|
||||
// Max comparison between 2 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER tvec2<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] > y[i] ? a[i] : b[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Max comparison between 2 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax
|
||||
(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x > y ? a[i] : b[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Max comparison between 2 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b
|
||||
)
|
||||
{
|
||||
vecType<T, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, T, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] > y[i] ? a : b;
|
||||
return Result;
|
||||
}
|
||||
@@ -253,46 +223,46 @@ GLM_FUNC_QUALIFIER U associatedMax
|
||||
}
|
||||
|
||||
// Max comparison between 3 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Max comparison between 3 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> associatedMax
|
||||
(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// Max comparison between 3 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c
|
||||
)
|
||||
{
|
||||
vecType<T, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, T, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
|
||||
return Result;
|
||||
}
|
||||
@@ -316,17 +286,17 @@ GLM_FUNC_QUALIFIER U associatedMax
|
||||
}
|
||||
|
||||
// Max comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, vecType<U, P> const & a,
|
||||
vecType<T, P> const & y, vecType<U, P> const & b,
|
||||
vecType<T, P> const & z, vecType<U, P> const & c,
|
||||
vecType<T, P> const & w, vecType<U, P> const & d
|
||||
vec<L, T, Q> const& x, vec<L, U, Q> const& a,
|
||||
vec<L, T, Q> const& y, vec<L, U, Q> const& b,
|
||||
vec<L, T, Q> const& z, vec<L, U, Q> const& c,
|
||||
vec<L, T, Q> const& w, vec<L, U, Q> const& d
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
T Test1 = max(x[i], y[i]);
|
||||
T Test2 = max(z[i], w[i]);
|
||||
@@ -338,20 +308,20 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
}
|
||||
|
||||
// Max comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
T x, vecType<U, P> const & a,
|
||||
T y, vecType<U, P> const & b,
|
||||
T z, vecType<U, P> const & c,
|
||||
T w, vecType<U, P> const & d
|
||||
T x, vec<L, U, Q> const& a,
|
||||
T y, vec<L, U, Q> const& b,
|
||||
T z, vec<L, U, Q> const& c,
|
||||
T w, vec<L, U, Q> const& d
|
||||
)
|
||||
{
|
||||
T Test1 = max(x, y);
|
||||
T Test2 = max(z, w);
|
||||
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
U Result1 = x > y ? a[i] : b[i];
|
||||
U Result2 = z > w ? c[i] : d[i];
|
||||
@@ -361,17 +331,17 @@ GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
}
|
||||
|
||||
// Max comparison between 4 variables
|
||||
template<typename T, typename U, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<U, P> associatedMax
|
||||
template<length_t L, typename T, typename U, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, U, Q> associatedMax
|
||||
(
|
||||
vecType<T, P> const & x, U a,
|
||||
vecType<T, P> const & y, U b,
|
||||
vecType<T, P> const & z, U c,
|
||||
vecType<T, P> const & w, U d
|
||||
vec<L, T, Q> const& x, U a,
|
||||
vec<L, T, Q> const& y, U b,
|
||||
vec<L, T, Q> const& z, U c,
|
||||
vec<L, T, Q> const& w, U d
|
||||
)
|
||||
{
|
||||
vecType<U, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(Result); ++i)
|
||||
vec<L, U, Q> Result;
|
||||
for(length_t i = 0, n = Result.length(); i < n; ++i)
|
||||
{
|
||||
T Test1 = max(x[i], y[i]);
|
||||
T Test2 = max(z[i], w[i]);;
|
||||
|
||||
@@ -1,51 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_bit
|
||||
/// @file glm/gtx/bit.hpp
|
||||
/// @date 2007-03-14 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_bit GLM_GTX_bit
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Allow to perform bit operations on integer values
|
||||
///
|
||||
/// <glm/gtx/bit.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/bit.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Allow to perform bit operations on integer values
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../gtc/bitfield.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_bit is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_bit extension is deprecated, include GLM_GTC_bitfield and GLM_GTC_integer instead")
|
||||
#endif
|
||||
|
||||
@@ -55,21 +29,25 @@ namespace glm
|
||||
/// @{
|
||||
|
||||
/// @see gtx_bit
|
||||
template <typename genIUType>
|
||||
template<typename genIUType>
|
||||
GLM_FUNC_DECL genIUType highestBitValue(genIUType Value);
|
||||
|
||||
/// @see gtx_bit
|
||||
template<typename genIUType>
|
||||
GLM_FUNC_DECL genIUType lowestBitValue(genIUType Value);
|
||||
|
||||
/// Find the highest bit set to 1 in a integer variable and return its value.
|
||||
///
|
||||
/// @see gtx_bit
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> highestBitValue(vecType<T, P> const & value);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> highestBitValue(vec<L, T, Q> const& value);
|
||||
|
||||
/// Return the power of two number which value is just higher the input value.
|
||||
/// Deprecated, use ceilPowerOfTwo from GTC_round instead
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename genIUType>
|
||||
template<typename genIUType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoAbove(genIUType Value);
|
||||
|
||||
/// Return the power of two number which value is just higher the input value.
|
||||
@@ -77,15 +55,15 @@ namespace glm
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoAbove(vecType<T, P> const & value);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& value);
|
||||
|
||||
/// Return the power of two number which value is just lower the input value.
|
||||
/// Deprecated, use floorPowerOfTwo from GTC_round instead
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename genIUType>
|
||||
template<typename genIUType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoBelow(genIUType Value);
|
||||
|
||||
/// Return the power of two number which value is just lower the input value.
|
||||
@@ -93,15 +71,15 @@ namespace glm
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoBelow(vecType<T, P> const & value);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& value);
|
||||
|
||||
/// Return the power of two number which value is the closet to the input value.
|
||||
/// Deprecated, use roundPowerOfTwo from GTC_round instead
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename genIUType>
|
||||
template<typename genIUType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL genIUType powerOfTwoNearest(genIUType Value);
|
||||
|
||||
/// Return the power of two number which value is the closet to the input value.
|
||||
@@ -109,8 +87,8 @@ namespace glm
|
||||
///
|
||||
/// @see gtc_round
|
||||
/// @see gtx_bit
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vecType<T, P> powerOfTwoNearest(vecType<T, P> const & value);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_DEPRECATED GLM_FUNC_DECL vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& value);
|
||||
|
||||
/// @}
|
||||
} //namespace glm
|
||||
|
||||
@@ -1,41 +1,11 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_bit
|
||||
/// @file glm/gtx/bit.inl
|
||||
/// @date 2014-11-25 / 2014-11-25
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
///////////////////
|
||||
// highestBitValue
|
||||
|
||||
template <typename genIUType>
|
||||
template<typename genIUType>
|
||||
GLM_FUNC_QUALIFIER genIUType highestBitValue(genIUType Value)
|
||||
{
|
||||
genIUType tmp = Value;
|
||||
@@ -48,46 +18,61 @@ namespace glm
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> highestBitValue(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> highestBitValue(vec<L, T, Q> const& v)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(highestBitValue, v);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(highestBitValue, v);
|
||||
}
|
||||
|
||||
///////////////////
|
||||
// lowestBitValue
|
||||
|
||||
template<typename genIUType>
|
||||
GLM_FUNC_QUALIFIER genIUType lowestBitValue(genIUType Value)
|
||||
{
|
||||
return (Value & (~Value + 1));
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> lowestBitValue(vec<L, T, Q> const& v)
|
||||
{
|
||||
return detail::functor1<vec, L, T, T, Q>::call(lowestBitValue, v);
|
||||
}
|
||||
|
||||
///////////////////
|
||||
// powerOfTwoAbove
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType value)
|
||||
{
|
||||
return isPowerOfTwo(value) ? value : highestBitValue(value) << 1;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoAbove(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoAbove(vec<L, T, Q> const& v)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(powerOfTwoAbove, v);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoAbove, v);
|
||||
}
|
||||
|
||||
///////////////////
|
||||
// powerOfTwoBelow
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoBelow(genType value)
|
||||
{
|
||||
return isPowerOfTwo(value) ? value : highestBitValue(value);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoBelow(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoBelow(vec<L, T, Q> const& v)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(powerOfTwoBelow, v);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoBelow, v);
|
||||
}
|
||||
|
||||
/////////////////////
|
||||
// powerOfTwoNearest
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoNearest(genType value)
|
||||
{
|
||||
if(isPowerOfTwo(value))
|
||||
@@ -98,10 +83,10 @@ namespace glm
|
||||
return (next - value) < (value - prev) ? next : prev;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> powerOfTwoNearest(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> powerOfTwoNearest(vec<L, T, Q> const& v)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(powerOfTwoNearest, v);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(powerOfTwoNearest, v);
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_closest_point
|
||||
/// @file glm/gtx/closest_point.hpp
|
||||
/// @date 2005-12-30 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_closest_point GLM_GTX_closest_point
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Find the point on a straight line which is the closet of a point.
|
||||
///
|
||||
/// <glm/gtx/closest_point.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// Include <glm/gtx/closest_point.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Find the point on a straight line which is the closet of a point.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_closest_point extension included")
|
||||
#endif
|
||||
|
||||
@@ -53,20 +28,20 @@ namespace glm
|
||||
/// @addtogroup gtx_closest_point
|
||||
/// @{
|
||||
|
||||
/// Find the point on a straight line which is the closet of a point.
|
||||
/// Find the point on a straight line which is the closet of a point.
|
||||
/// @see gtx_closest_point
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> closestPointOnLine(
|
||||
tvec3<T, P> const & point,
|
||||
tvec3<T, P> const & a,
|
||||
tvec3<T, P> const & b);
|
||||
|
||||
/// 2d lines work as well
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec2<T, P> closestPointOnLine(
|
||||
tvec2<T, P> const & point,
|
||||
tvec2<T, P> const & a,
|
||||
tvec2<T, P> const & b);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> closestPointOnLine(
|
||||
vec<3, T, Q> const& point,
|
||||
vec<3, T, Q> const& a,
|
||||
vec<3, T, Q> const& b);
|
||||
|
||||
/// 2d lines work as well
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<2, T, Q> closestPointOnLine(
|
||||
vec<2, T, Q> const& point,
|
||||
vec<2, T, Q> const& a,
|
||||
vec<2, T, Q> const& b);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
||||
@@ -1,48 +1,18 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_closest_point
|
||||
/// @file glm/gtx/closest_point.inl
|
||||
/// @date 2005-12-30 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> closestPointOnLine
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> closestPointOnLine
|
||||
(
|
||||
tvec3<T, P> const & point,
|
||||
tvec3<T, P> const & a,
|
||||
tvec3<T, P> const & b
|
||||
vec<3, T, Q> const& point,
|
||||
vec<3, T, Q> const& a,
|
||||
vec<3, T, Q> const& b
|
||||
)
|
||||
{
|
||||
T LineLength = distance(a, b);
|
||||
tvec3<T, P> Vector = point - a;
|
||||
tvec3<T, P> LineDirection = (b - a) / LineLength;
|
||||
vec<3, T, Q> Vector = point - a;
|
||||
vec<3, T, Q> LineDirection = (b - a) / LineLength;
|
||||
|
||||
// Project Vector to LineDirection to get the distance of point from a
|
||||
T Distance = dot(Vector, LineDirection);
|
||||
@@ -51,18 +21,18 @@ namespace glm
|
||||
if(Distance >= LineLength) return b;
|
||||
return a + LineDirection * Distance;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec2<T, P> closestPointOnLine
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, T, Q> closestPointOnLine
|
||||
(
|
||||
tvec2<T, P> const & point,
|
||||
tvec2<T, P> const & a,
|
||||
tvec2<T, P> const & b
|
||||
vec<2, T, Q> const& point,
|
||||
vec<2, T, Q> const& a,
|
||||
vec<2, T, Q> const& b
|
||||
)
|
||||
{
|
||||
T LineLength = distance(a, b);
|
||||
tvec2<T, P> Vector = point - a;
|
||||
tvec2<T, P> LineDirection = (b - a) / LineLength;
|
||||
vec<2, T, Q> Vector = point - a;
|
||||
vec<2, T, Q> LineDirection = (b - a) / LineLength;
|
||||
|
||||
// Project Vector to LineDirection to get the distance of point from a
|
||||
T Distance = dot(Vector, LineDirection);
|
||||
@@ -71,5 +41,5 @@ namespace glm
|
||||
if(Distance >= LineLength) return b;
|
||||
return a + LineDirection * Distance;
|
||||
}
|
||||
|
||||
|
||||
}//namespace glm
|
||||
|
||||
50
includes/glm/gtx/color_encoding.hpp
Normal file
50
includes/glm/gtx/color_encoding.hpp
Normal file
@@ -0,0 +1,50 @@
|
||||
/// @ref gtx_color_encoding
|
||||
/// @file glm/gtx/color_encoding.hpp
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_color_encoding (dependence)
|
||||
///
|
||||
/// @defgroup gtx_color_encoding GLM_GTX_color_encoding
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/color_encoding.hpp> to use the features of this extension.
|
||||
///
|
||||
/// @brief Allow to perform bit operations on integer values
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
#include "../detail/qualifier.hpp"
|
||||
#include "../vec3.hpp"
|
||||
#include <limits>
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTC_color_encoding extension included")
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_color_encoding
|
||||
/// @{
|
||||
|
||||
/// Convert a linear sRGB color to D65 YUV.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB);
|
||||
|
||||
/// Convert a linear sRGB color to D50 YUV.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB);
|
||||
|
||||
/// Convert a D65 YUV color to linear sRGB.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ);
|
||||
|
||||
/// Convert a D65 YUV color to D50 YUV.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ);
|
||||
|
||||
/// @}
|
||||
} //namespace glm
|
||||
|
||||
#include "color_encoding.inl"
|
||||
45
includes/glm/gtx/color_encoding.inl
Normal file
45
includes/glm/gtx/color_encoding.inl
Normal file
@@ -0,0 +1,45 @@
|
||||
/// @ref gtx_color_encoding
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD65XYZ(vec<3, T, Q> const& ColorLinearSRGB)
|
||||
{
|
||||
vec<3, T, Q> const M(0.490f, 0.17697f, 0.2f);
|
||||
vec<3, T, Q> const N(0.31f, 0.8124f, 0.01063f);
|
||||
vec<3, T, Q> const O(0.490f, 0.01f, 0.99f);
|
||||
|
||||
return (M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB) * static_cast<T>(5.650675255693055f);
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> convertLinearSRGBToD50XYZ(vec<3, T, Q> const& ColorLinearSRGB)
|
||||
{
|
||||
vec<3, T, Q> const M(0.436030342570117f, 0.222438466210245f, 0.013897440074263f);
|
||||
vec<3, T, Q> const N(0.385101860087134f, 0.716942745571917f, 0.097076381494207f);
|
||||
vec<3, T, Q> const O(0.143067806654203f, 0.060618777416563f, 0.713926257896652f);
|
||||
|
||||
return M * ColorLinearSRGB + N * ColorLinearSRGB + O * ColorLinearSRGB;
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToLinearSRGB(vec<3, T, Q> const& ColorD65XYZ)
|
||||
{
|
||||
vec<3, T, Q> const M(0.41847f, -0.091169f, 0.0009209f);
|
||||
vec<3, T, Q> const N(-0.15866f, 0.25243f, 0.015708f);
|
||||
vec<3, T, Q> const O(0.0009209f, -0.0025498f, 0.1786f);
|
||||
|
||||
return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ;
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> convertD65XYZToD50XYZ(vec<3, T, Q> const& ColorD65XYZ)
|
||||
{
|
||||
vec<3, T, Q> const M(+1.047844353856414f, +0.029549007606644f, -0.009250984365223f);
|
||||
vec<3, T, Q> const N(+0.022898981050086f, +0.990508028941971f, +0.015072338237051f);
|
||||
vec<3, T, Q> const O(-0.050206647741605f, -0.017074711360960f, +0.751717835079977f);
|
||||
|
||||
return M * ColorD65XYZ + N * ColorD65XYZ + O * ColorD65XYZ;
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_color_space
|
||||
/// @file glm/gtx/color_space.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_color_space GLM_GTX_color_space
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Related to RGB to HSV conversions and operations.
|
||||
///
|
||||
/// <glm/gtx/color_space.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/color_space.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Related to RGB to HSV conversions and operations.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_color_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_color_space extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,41 +30,41 @@ namespace glm
|
||||
|
||||
/// Converts a color from HSV color space to its color in RGB color space.
|
||||
/// @see gtx_color_space
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rgbColor(
|
||||
tvec3<T, P> const & hsvValue);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rgbColor(
|
||||
vec<3, T, Q> const& hsvValue);
|
||||
|
||||
/// Converts a color from RGB color space to its color in HSV color space.
|
||||
/// @see gtx_color_space
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> hsvColor(
|
||||
tvec3<T, P> const & rgbValue);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> hsvColor(
|
||||
vec<3, T, Q> const& rgbValue);
|
||||
|
||||
/// Build a saturation matrix.
|
||||
/// @see gtx_color_space
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> saturation(
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> saturation(
|
||||
T const s);
|
||||
|
||||
/// Modify the saturation of a color.
|
||||
/// @see gtx_color_space
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> saturation(
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> saturation(
|
||||
T const s,
|
||||
tvec3<T, P> const & color);
|
||||
|
||||
vec<3, T, Q> const& color);
|
||||
|
||||
/// Modify the saturation of a color.
|
||||
/// @see gtx_color_space
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> saturation(
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> saturation(
|
||||
T const s,
|
||||
tvec4<T, P> const & color);
|
||||
|
||||
vec<4, T, Q> const& color);
|
||||
|
||||
/// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals.
|
||||
/// @see gtx_color_space
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T luminosity(
|
||||
tvec3<T, P> const & color);
|
||||
vec<3, T, Q> const& color);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,20 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_color_space
|
||||
/// @file glm/gtx/color_space.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rgbColor(const tvec3<T, P>& hsvColor)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rgbColor(const vec<3, T, Q>& hsvColor)
|
||||
{
|
||||
tvec3<T, P> hsv = hsvColor;
|
||||
tvec3<T, P> rgbColor;
|
||||
vec<3, T, Q> hsv = hsvColor;
|
||||
vec<3, T, Q> rgbColor;
|
||||
|
||||
if(hsv.y == static_cast<T>(0))
|
||||
// achromatic (grey)
|
||||
rgbColor = tvec3<T, P>(hsv.z);
|
||||
rgbColor = vec<3, T, Q>(hsv.z);
|
||||
else
|
||||
{
|
||||
T sector = floor(hsv.x / T(60));
|
||||
T frac = (hsv.x / T(60)) - sector;
|
||||
T sector = floor(hsv.x * (T(1) / T(60)));
|
||||
T frac = (hsv.x * (T(1) / T(60))) - sector;
|
||||
// factorial part of h
|
||||
T o = hsv.z * (T(1) - hsv.y);
|
||||
T p = hsv.z * (T(1) - hsv.y * frac);
|
||||
@@ -74,13 +44,13 @@ namespace glm
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 4:
|
||||
rgbColor.r = q;
|
||||
rgbColor.g = o;
|
||||
rgbColor.r = q;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 5:
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = o;
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = p;
|
||||
break;
|
||||
}
|
||||
@@ -89,19 +59,19 @@ namespace glm
|
||||
return rgbColor;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> hsvColor(const tvec3<T, P>& rgbColor)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> hsvColor(const vec<3, T, Q>& rgbColor)
|
||||
{
|
||||
tvec3<T, P> hsv = rgbColor;
|
||||
vec<3, T, Q> hsv = rgbColor;
|
||||
float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b);
|
||||
float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b);
|
||||
float Delta = Max - Min;
|
||||
|
||||
hsv.z = Max;
|
||||
hsv.z = Max;
|
||||
|
||||
if(Max != static_cast<T>(0))
|
||||
{
|
||||
hsv.y = Delta / hsv.z;
|
||||
hsv.y = Delta / hsv.z;
|
||||
T h = static_cast<T>(0);
|
||||
|
||||
if(rgbColor.r == Max)
|
||||
@@ -114,7 +84,7 @@ namespace glm
|
||||
// between magenta & cyan
|
||||
h = static_cast<T>(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta;
|
||||
|
||||
if(h < T(0))
|
||||
if(h < T(0))
|
||||
hsv.x = h + T(360);
|
||||
else
|
||||
hsv.x = h;
|
||||
@@ -129,44 +99,43 @@ namespace glm
|
||||
return hsv;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> saturation(T const s)
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> saturation(T const s)
|
||||
{
|
||||
tvec3<T, defaultp> rgbw = tvec3<T, defaultp>(T(0.2126), T(0.7152), T(0.0722));
|
||||
vec<3, T, defaultp> rgbw = vec<3, T, defaultp>(T(0.2126), T(0.7152), T(0.0722));
|
||||
|
||||
T col0 = (T(1) - s) * rgbw.r;
|
||||
T col1 = (T(1) - s) * rgbw.g;
|
||||
T col2 = (T(1) - s) * rgbw.b;
|
||||
vec<3, T, defaultp> const col((T(1) - s) * rgbw);
|
||||
|
||||
mat<4, 4, T, defaultp> result(T(1));
|
||||
result[0][0] = col.x + s;
|
||||
result[0][1] = col.x;
|
||||
result[0][2] = col.x;
|
||||
result[1][0] = col.y;
|
||||
result[1][1] = col.y + s;
|
||||
result[1][2] = col.y;
|
||||
result[2][0] = col.z;
|
||||
result[2][1] = col.z;
|
||||
result[2][2] = col.z + s;
|
||||
|
||||
tmat4x4<T, defaultp> result(T(1));
|
||||
result[0][0] = col0 + s;
|
||||
result[0][1] = col0;
|
||||
result[0][2] = col0;
|
||||
result[1][0] = col1;
|
||||
result[1][1] = col1 + s;
|
||||
result[1][2] = col1;
|
||||
result[2][0] = col2;
|
||||
result[2][1] = col2;
|
||||
result[2][2] = col2 + s;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> saturation(const T s, const tvec3<T, P>& color)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> saturation(const T s, const vec<3, T, Q>& color)
|
||||
{
|
||||
return tvec3<T, P>(saturation(s) * tvec4<T, P>(color, T(0)));
|
||||
return vec<3, T, Q>(saturation(s) * vec<4, T, Q>(color, T(0)));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> saturation(const T s, const tvec4<T, P>& color)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> saturation(const T s, const vec<4, T, Q>& color)
|
||||
{
|
||||
return saturation(s) * color;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T luminosity(const tvec3<T, P>& color)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T luminosity(const vec<3, T, Q>& color)
|
||||
{
|
||||
const tvec3<T, P> tmp = tvec3<T, P>(0.33, 0.59, 0.11);
|
||||
const vec<3, T, Q> tmp = vec<3, T, Q>(0.33, 0.59, 0.11);
|
||||
return dot(color, tmp);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_color_space_YCoCg
|
||||
/// @file glm/gtx/color_space_YCoCg.hpp
|
||||
/// @date 2008-10-28 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief RGB to YCoCg conversions and operations
|
||||
///
|
||||
/// <glm/gtx/color_space_YCoCg.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// Include <glm/gtx/color_space_YCoCg.hpp> to use the features of this extension.
|
||||
///
|
||||
/// RGB to YCoCg conversions and operations
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_color_space_YCoCg is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_color_space_YCoCg extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,29 +30,29 @@ namespace glm
|
||||
|
||||
/// Convert a color from RGB color space to YCoCg color space.
|
||||
/// @see gtx_color_space_YCoCg
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rgb2YCoCg(
|
||||
tvec3<T, P> const & rgbColor);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCg(
|
||||
vec<3, T, Q> const& rgbColor);
|
||||
|
||||
/// Convert a color from YCoCg color space to RGB color space.
|
||||
/// @see gtx_color_space_YCoCg
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> YCoCg2rgb(
|
||||
tvec3<T, P> const & YCoCgColor);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> YCoCg2rgb(
|
||||
vec<3, T, Q> const& YCoCgColor);
|
||||
|
||||
/// Convert a color from RGB color space to YCoCgR color space.
|
||||
/// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range"
|
||||
/// @see gtx_color_space_YCoCg
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rgb2YCoCgR(
|
||||
tvec3<T, P> const & rgbColor);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rgb2YCoCgR(
|
||||
vec<3, T, Q> const& rgbColor);
|
||||
|
||||
/// Convert a color from YCoCgR color space to RGB color space.
|
||||
/// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range"
|
||||
/// @see gtx_color_space_YCoCg
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> YCoCgR2rgb(
|
||||
tvec3<T, P> const & YCoCgColor);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> YCoCgR2rgb(
|
||||
vec<3, T, Q> const& YCoCgColor);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,101 +1,71 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_color_space_YCoCg
|
||||
/// @file glm/gtx/color_space_YCoCg.inl
|
||||
/// @date 2008-10-28 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCg
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg
|
||||
(
|
||||
tvec3<T, P> const & rgbColor
|
||||
vec<3, T, Q> const& rgbColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
vec<3, T, Q> result;
|
||||
result.x/*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4);
|
||||
result.y/*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2);
|
||||
result.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> YCoCg2rgb
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb
|
||||
(
|
||||
tvec3<T, P> const & YCoCgColor
|
||||
vec<3, T, Q> const& YCoCgColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
vec<3, T, Q> result;
|
||||
result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;
|
||||
result.g = YCoCgColor.x + YCoCgColor.z;
|
||||
result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T, precision P, bool isInteger>
|
||||
template<typename T, qualifier Q, bool isInteger>
|
||||
class compute_YCoCgR {
|
||||
public:
|
||||
static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
|
||||
static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
|
||||
(
|
||||
tvec3<T, P> const & rgbColor
|
||||
vec<3, T, Q> const& rgbColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
result.x/*Y */ = rgbColor.g / T(2) + (rgbColor.r + rgbColor.b) / T(4);
|
||||
vec<3, T, Q> result;
|
||||
result.x/*Y */ = rgbColor.g * static_cast<T>(0.5) + (rgbColor.r + rgbColor.b) * static_cast<T>(0.25);
|
||||
result.y/*Co*/ = rgbColor.r - rgbColor.b;
|
||||
result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / T(2);
|
||||
result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast<T>(0.5);
|
||||
return result;
|
||||
}
|
||||
|
||||
static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb
|
||||
static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
|
||||
(
|
||||
tvec3<T, P> const & YCoCgRColor
|
||||
vec<3, T, Q> const& YCoCgRColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
T tmp = YCoCgRColor.x - (YCoCgRColor.z / T(2));
|
||||
vec<3, T, Q> result;
|
||||
T tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast<T>(0.5));
|
||||
result.g = YCoCgRColor.z + tmp;
|
||||
result.b = tmp - (YCoCgRColor.y / T(2));
|
||||
result.b = tmp - (YCoCgRColor.y * static_cast<T>(0.5));
|
||||
result.r = result.b + YCoCgRColor.y;
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, precision P>
|
||||
class compute_YCoCgR<T, P, true> {
|
||||
template<typename T, qualifier Q>
|
||||
class compute_YCoCgR<T, Q, true> {
|
||||
public:
|
||||
static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
|
||||
static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
|
||||
(
|
||||
tvec3<T, P> const & rgbColor
|
||||
vec<3, T, Q> const& rgbColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
vec<3, T, Q> result;
|
||||
result.y/*Co*/ = rgbColor.r - rgbColor.b;
|
||||
T tmp = rgbColor.b + (result.y >> 1);
|
||||
result.z/*Cg*/ = rgbColor.g - tmp;
|
||||
@@ -103,12 +73,12 @@ namespace glm
|
||||
return result;
|
||||
}
|
||||
|
||||
static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb
|
||||
static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
|
||||
(
|
||||
tvec3<T, P> const & YCoCgRColor
|
||||
vec<3, T, Q> const& YCoCgRColor
|
||||
)
|
||||
{
|
||||
tvec3<T, P> result;
|
||||
vec<3, T, Q> result;
|
||||
T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1);
|
||||
result.g = YCoCgRColor.z + tmp;
|
||||
result.b = tmp - (YCoCgRColor.y >> 1);
|
||||
@@ -117,21 +87,21 @@ namespace glm
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
|
||||
(
|
||||
tvec3<T, P> const & rgbColor
|
||||
vec<3, T, Q> const& rgbColor
|
||||
)
|
||||
{
|
||||
return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor);
|
||||
return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
|
||||
(
|
||||
tvec3<T, P> const & YCoCgRColor
|
||||
vec<3, T, Q> const& YCoCgRColor
|
||||
)
|
||||
{
|
||||
return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor);
|
||||
return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,44 +1,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_common
|
||||
/// @file glm/gtx/common.hpp
|
||||
/// @date 2014-09-08 / 2014-09-08
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_common GLM_GTX_common
|
||||
/// @ingroup gtx
|
||||
///
|
||||
///
|
||||
/// Include <glm/gtx/common.hpp> to use the features of this extension.
|
||||
///
|
||||
/// @brief Provide functions to increase the compatibility with Cg and HLSL languages
|
||||
///
|
||||
/// <glm/gtx/common.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -48,7 +18,11 @@
|
||||
#include "../vec4.hpp"
|
||||
#include "../gtc/vec1.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_common is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_common extension included")
|
||||
#endif
|
||||
|
||||
@@ -60,21 +34,41 @@ namespace glm
|
||||
/// Returns true if x is a denormalized number
|
||||
/// Numbers whose absolute value is too small to be represented in the normal format are represented in an alternate, denormalized format.
|
||||
/// This format is less precise but can represent values closer to zero.
|
||||
///
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a>
|
||||
/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a>
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL typename genType::bool_type isdenormal(genType const& x);
|
||||
|
||||
/// Similiar to 'mod' but with a different rounding and integer support.
|
||||
/// Similar to 'mod' but with a different rounding and integer support.
|
||||
/// Returns 'x - y * trunc(x/y)' instead of 'x - y * floor(x/y)'
|
||||
///
|
||||
///
|
||||
/// @see <a href="http://stackoverflow.com/questions/7610631/glsl-mod-vs-hlsl-fmod">GLSL mod vs HLSL fmod</a>
|
||||
/// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a>
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fmod(vecType<T, P> const & v);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fmod(vec<L, T, Q> const& v);
|
||||
|
||||
/// Returns whether vector components values are within an interval. A open interval excludes its endpoints, and is denoted with square brackets.
|
||||
///
|
||||
/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector
|
||||
/// @tparam T Floating-point or integer scalar types
|
||||
/// @tparam Q Value from qualifier enum
|
||||
///
|
||||
/// @see ext_vector_relational
|
||||
template <length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);
|
||||
|
||||
/// Returns whether vector components values are within an interval. A closed interval includes its endpoints, and is denoted with square brackets.
|
||||
///
|
||||
/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector
|
||||
/// @tparam T Floating-point or integer scalar types
|
||||
/// @tparam Q Value from qualifier enum
|
||||
///
|
||||
/// @see ext_vector_relational
|
||||
template <length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,119 +1,91 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_common
|
||||
/// @file glm/gtx/common.inl
|
||||
/// @date 2014-09-08 / 2014-09-08
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <cmath>
|
||||
#include "../gtc/epsilon.hpp"
|
||||
#include "../gtc/constants.hpp"
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
{
|
||||
template <typename T, precision P, template <class, precision> class vecType, bool isFloat = true>
|
||||
template<length_t L, typename T, qualifier Q, bool isFloat = true>
|
||||
struct compute_fmod
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b)
|
||||
GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
|
||||
{
|
||||
return detail::functor2<T, P, vecType>::call(std::fmod, a, b);
|
||||
return detail::functor2<vec, L, T, Q>::call(std::fmod, a, b);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, precision P, template <class, precision> class vecType>
|
||||
struct compute_fmod<T, P, vecType, false>
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
struct compute_fmod<L, T, Q, false>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vecType<T, P> call(vecType<T, P> const & a, vecType<T, P> const & b)
|
||||
GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
|
||||
{
|
||||
return a % b;
|
||||
}
|
||||
};
|
||||
}//namespace detail
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool isdenormal(T const & x)
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isdenormal(T const& x)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs");
|
||||
|
||||
# if GLM_HAS_CXX11_STL
|
||||
return std::fpclassify(x) == FP_SUBNORMAL;
|
||||
# else
|
||||
return x != static_cast<T>(0) && std::fabs(x) < std::numeric_limits<T>::min();
|
||||
return epsilonNotEqual(x, static_cast<T>(0), epsilon<T>()) && std::fabs(x) < std::numeric_limits<T>::min();
|
||||
# endif
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tvec1<T, P>::bool_type isdenormal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename vec<1, T, Q>::bool_type isdenormal
|
||||
(
|
||||
tvec1<T, P> const & x
|
||||
vec<1, T, Q> const& x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs");
|
||||
|
||||
return typename tvec1<T, P>::bool_type(
|
||||
return typename vec<1, T, Q>::bool_type(
|
||||
isdenormal(x.x));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tvec2<T, P>::bool_type isdenormal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename vec<2, T, Q>::bool_type isdenormal
|
||||
(
|
||||
tvec2<T, P> const & x
|
||||
vec<2, T, Q> const& x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs");
|
||||
|
||||
return typename tvec2<T, P>::bool_type(
|
||||
return typename vec<2, T, Q>::bool_type(
|
||||
isdenormal(x.x),
|
||||
isdenormal(x.y));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tvec3<T, P>::bool_type isdenormal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename vec<3, T, Q>::bool_type isdenormal
|
||||
(
|
||||
tvec3<T, P> const & x
|
||||
vec<3, T, Q> const& x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs");
|
||||
|
||||
return typename tvec3<T, P>::bool_type(
|
||||
return typename vec<3, T, Q>::bool_type(
|
||||
isdenormal(x.x),
|
||||
isdenormal(x.y),
|
||||
isdenormal(x.z));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tvec4<T, P>::bool_type isdenormal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename vec<4, T, Q>::bool_type isdenormal
|
||||
(
|
||||
tvec4<T, P> const & x
|
||||
vec<4, T, Q> const& x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'isdenormal' only accept floating-point inputs");
|
||||
|
||||
return typename tvec4<T, P>::bool_type(
|
||||
return typename vec<4, T, Q>::bool_type(
|
||||
isdenormal(x.x),
|
||||
isdenormal(x.y),
|
||||
isdenormal(x.z),
|
||||
@@ -121,21 +93,33 @@ namespace detail
|
||||
}
|
||||
|
||||
// fmod
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fmod(genType x, genType y)
|
||||
{
|
||||
return fmod(tvec1<genType>(x), y).x;
|
||||
return fmod(vec<1, genType>(x), y).x;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fmod(vecType<T, P> const & x, T y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, T y)
|
||||
{
|
||||
return detail::compute_fmod<T, P, vecType, std::numeric_limits<T>::is_iec559>::call(x, vecType<T, P>(y));
|
||||
return detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, vec<L, T, Q>(y));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fmod(vecType<T, P> const & x, vecType<T, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmod(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
|
||||
{
|
||||
return detail::compute_fmod<T, P, vecType, std::numeric_limits<T>::is_iec559>::call(x, y);
|
||||
return detail::compute_fmod<L, T, Q, std::numeric_limits<T>::is_iec559>::call(x, y);
|
||||
}
|
||||
|
||||
template <length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, bool, Q> openBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max)
|
||||
{
|
||||
return greaterThan(Value, Min) && lessThan(Value, Max);
|
||||
}
|
||||
|
||||
template <length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, bool, Q> closeBounded(vec<L, T, Q> const& Value, vec<L, T, Q> const& Min, vec<L, T, Q> const& Max)
|
||||
{
|
||||
return greaterThanEqual(Value, Min) && lessThanEqual(Value, Max);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,44 +1,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_compatibility
|
||||
/// @file glm/gtx/compatibility.hpp
|
||||
/// @date 2007-01-24 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_compatibility GLM_GTX_compatibility
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Provide functions to increase the compatibility with Cg and HLSL languages
|
||||
///
|
||||
/// <glm/gtx/compatibility.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/compatibility.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Provide functions to increase the compatibility with Cg and HLSL languages
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -46,13 +16,17 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtc/quaternion.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_compatibility is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_compatibility extension included")
|
||||
#endif
|
||||
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
#if GLM_COMPILER & GLM_COMPILER_VC
|
||||
# include <cfloat>
|
||||
#elif(GLM_COMPILER & GLM_COMPILER_GCC)
|
||||
#elif GLM_COMPILER & GLM_COMPILER_GCC
|
||||
# include <cmath>
|
||||
# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID)
|
||||
# undef isfinite
|
||||
@@ -64,94 +38,94 @@ namespace glm
|
||||
/// @addtogroup gtx_compatibility
|
||||
/// @{
|
||||
|
||||
template <typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> lerp(const tvec2<T, P>& x, const tvec2<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> lerp(const tvec3<T, P>& x, const tvec3<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> lerp(const tvec4<T, P>& x, const tvec4<T, P>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> lerp(const tvec2<T, P>& x, const tvec2<T, P>& y, const tvec2<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> lerp(const tvec3<T, P>& x, const tvec3<T, P>& y, const tvec3<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> lerp(const tvec4<T, P>& x, const tvec4<T, P>& y, const tvec4<T, P>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> lerp(const vec<2, T, Q>& x, const vec<2, T, Q>& y, const vec<2, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> lerp(const vec<3, T, Q>& x, const vec<3, T, Q>& y, const vec<3, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> lerp(const vec<4, T, Q>& x, const vec<4, T, Q>& y, const vec<4, T, Q>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility)
|
||||
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> saturate(const tvec2<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> saturate(const tvec3<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> saturate(const tvec4<T, P>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> saturate(const vec<2, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> saturate(const vec<3, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> saturate(const vec<4, T, Q>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility)
|
||||
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec2<T, P> atan2(const tvec2<T, P>& x, const tvec2<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec3<T, P> atan2(const tvec3<T, P>& x, const tvec3<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_QUALIFIER tvec4<T, P> atan2(const tvec4<T, P>& x, const tvec4<T, P>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<2, T, Q> atan2(const vec<2, T, Q>& x, const vec<2, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<3, T, Q> atan2(const vec<3, T, Q>& x, const vec<3, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_QUALIFIER vec<4, T, Q> atan2(const vec<4, T, Q>& x, const vec<4, T, Q>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility)
|
||||
|
||||
template <typename genType> GLM_FUNC_DECL bool isfinite(genType const & x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_DECL tvec1<bool, P> isfinite(const tvec1<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_DECL tvec2<bool, P> isfinite(const tvec2<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_DECL tvec3<bool, P> isfinite(const tvec3<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template <typename T, precision P> GLM_FUNC_DECL tvec4<bool, P> isfinite(const tvec4<T, P>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template<typename genType> GLM_FUNC_DECL bool isfinite(genType const& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_DECL vec<1, bool, Q> isfinite(const vec<1, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_DECL vec<2, bool, Q> isfinite(const vec<2, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_DECL vec<3, bool, Q> isfinite(const vec<3, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
template<typename T, qualifier Q> GLM_FUNC_DECL vec<4, bool, Q> isfinite(const vec<4, T, Q>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility)
|
||||
|
||||
typedef bool bool1; //!< \brief boolean type with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec2<bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec3<bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec4<bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<2, bool, highp> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<3, bool, highp> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<4, bool, highp> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef bool bool1x1; //!< \brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x2<bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x3<bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x4<bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x2<bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x3<bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x4<bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x2<bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x3<bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x4<bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 2, bool, highp> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 3, bool, highp> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 4, bool, highp> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 2, bool, highp> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 3, bool, highp> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 4, bool, highp> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 2, bool, highp> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 3, bool, highp> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 4, bool, highp> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef int int1; //!< \brief integer vector with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec2<int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec3<int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec4<int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<2, int, highp> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<3, int, highp> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<4, int, highp> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef int int1x1; //!< \brief integer matrix with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x2<int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x3<int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x4<int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x2<int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x3<int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x4<int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x2<int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x3<int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x4<int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 2, int, highp> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 3, int, highp> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 4, int, highp> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 2, int, highp> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 3, int, highp> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 4, int, highp> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 2, int, highp> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 3, int, highp> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 4, int, highp> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef float float1; //!< \brief single-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec2<float, highp> float2; //!< \brief single-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec3<float, highp> float3; //!< \brief single-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec4<float, highp> float4; //!< \brief single-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef float float1; //!< \brief single-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<2, float, highp> float2; //!< \brief single-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<3, float, highp> float3; //!< \brief single-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<4, float, highp> float4; //!< \brief single-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef float float1x1; //!< \brief single-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x2<float, highp> float2x2; //!< \brief single-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x3<float, highp> float2x3; //!< \brief single-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x4<float, highp> float2x4; //!< \brief single-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x2<float, highp> float3x2; //!< \brief single-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x3<float, highp> float3x3; //!< \brief single-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x4<float, highp> float3x4; //!< \brief single-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x2<float, highp> float4x2; //!< \brief single-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x3<float, highp> float4x3; //!< \brief single-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x4<float, highp> float4x4; //!< \brief single-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef float float1x1; //!< \brief single-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 2, float, highp> float2x2; //!< \brief single-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 3, float, highp> float2x3; //!< \brief single-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 4, float, highp> float2x4; //!< \brief single-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 2, float, highp> float3x2; //!< \brief single-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 3, float, highp> float3x3; //!< \brief single-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 4, float, highp> float3x4; //!< \brief single-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 2, float, highp> float4x2; //!< \brief single-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 3, float, highp> float4x3; //!< \brief single-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 4, float, highp> float4x4; //!< \brief single-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef double double1; //!< \brief double-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec2<double, highp> double2; //!< \brief double-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec3<double, highp> double3; //!< \brief double-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tvec4<double, highp> double4; //!< \brief double-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef double double1; //!< \brief double-qualifier floating-point vector with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<2, double, highp> double2; //!< \brief double-qualifier floating-point vector with 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<3, double, highp> double3; //!< \brief double-qualifier floating-point vector with 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef vec<4, double, highp> double4; //!< \brief double-qualifier floating-point vector with 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
typedef double double1x1; //!< \brief double-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x2<double, highp> double2x2; //!< \brief double-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x3<double, highp> double2x3; //!< \brief double-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat2x4<double, highp> double2x4; //!< \brief double-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x2<double, highp> double3x2; //!< \brief double-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x3<double, highp> double3x3; //!< \brief double-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat3x4<double, highp> double3x4; //!< \brief double-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x2<double, highp> double4x2; //!< \brief double-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x3<double, highp> double4x3; //!< \brief double-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef tmat4x4<double, highp> double4x4; //!< \brief double-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef double double1x1; //!< \brief double-qualifier floating-point matrix with 1 component. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 2, double, highp> double2x2; //!< \brief double-qualifier floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 3, double, highp> double2x3; //!< \brief double-qualifier floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<2, 4, double, highp> double2x4; //!< \brief double-qualifier floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 2, double, highp> double3x2; //!< \brief double-qualifier floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 3, double, highp> double3x3; //!< \brief double-qualifier floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<3, 4, double, highp> double3x4; //!< \brief double-qualifier floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 2, double, highp> double4x2; //!< \brief double-qualifier floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 3, double, highp> double4x3; //!< \brief double-qualifier floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension)
|
||||
typedef mat<4, 4, double, highp> double4x4; //!< \brief double-qualifier floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension)
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,48 +1,16 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_compatibility
|
||||
/// @file glm/gtx/compatibility.inl
|
||||
/// @date 2007-01-24 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <limits>
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// isfinite
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isfinite(
|
||||
genType const & x)
|
||||
genType const& x)
|
||||
{
|
||||
# if GLM_HAS_CXX11_STL
|
||||
return std::isfinite(x) != 0;
|
||||
# elif GLM_COMPILER & GLM_COMPILER_VC
|
||||
return _finite(x);
|
||||
return _finite(x) != 0;
|
||||
# elif GLM_COMPILER & GLM_COMPILER_GCC && GLM_PLATFORM & GLM_PLATFORM_ANDROID
|
||||
return _isfinite(x) != 0;
|
||||
# else
|
||||
@@ -53,38 +21,38 @@ namespace glm
|
||||
# endif
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec1<bool, P> isfinite(
|
||||
tvec1<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<1, bool, Q> isfinite(
|
||||
vec<1, T, Q> const& x)
|
||||
{
|
||||
return tvec1<bool, P>(
|
||||
return vec<1, bool, Q>(
|
||||
isfinite(x.x));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec2<bool, P> isfinite(
|
||||
tvec2<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, bool, Q> isfinite(
|
||||
vec<2, T, Q> const& x)
|
||||
{
|
||||
return tvec2<bool, P>(
|
||||
return vec<2, bool, Q>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<bool, P> isfinite(
|
||||
tvec3<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, bool, Q> isfinite(
|
||||
vec<3, T, Q> const& x)
|
||||
{
|
||||
return tvec3<bool, P>(
|
||||
return vec<3, bool, Q>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<bool, P> isfinite(
|
||||
tvec4<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, bool, Q> isfinite(
|
||||
vec<4, T, Q> const& x)
|
||||
{
|
||||
return tvec4<bool, P>(
|
||||
return vec<4, bool, Q>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z),
|
||||
|
||||
@@ -1,51 +1,28 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_component_wise
|
||||
/// @file glm/gtx/component_wise.hpp
|
||||
/// @date 2007-05-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_component_wise GLM_GTX_component_wise
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Operations between components of a type
|
||||
///
|
||||
/// <glm/gtx/component_wise.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/component_wise.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Operations between components of a type
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
#include "../detail/precision.hpp"
|
||||
#include "../detail/qualifier.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_component_wise is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_component_wise extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,29 +31,37 @@ namespace glm
|
||||
/// @addtogroup gtx_component_wise
|
||||
/// @{
|
||||
|
||||
/// Add all vector components together.
|
||||
/// Convert an integer vector to a normalized float vector.
|
||||
/// If the parameter value type is already a floating qualifier type, the value is passed through.
|
||||
/// @see gtx_component_wise
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compAdd(
|
||||
genType const & v);
|
||||
template<typename floatType, length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v);
|
||||
|
||||
/// Multiply all vector components together.
|
||||
/// Convert a normalized float vector to an integer vector.
|
||||
/// If the parameter value type is already a floating qualifier type, the value is passed through.
|
||||
/// @see gtx_component_wise
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMul(
|
||||
genType const & v);
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> compScale(vec<L, floatType, Q> const& v);
|
||||
|
||||
/// Add all vector components together.
|
||||
/// @see gtx_component_wise
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compAdd(genType const& v);
|
||||
|
||||
/// Multiply all vector components together.
|
||||
/// @see gtx_component_wise
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMul(genType const& v);
|
||||
|
||||
/// Find the minimum value between single vector components.
|
||||
/// @see gtx_component_wise
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMin(
|
||||
genType const & v);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMin(genType const& v);
|
||||
|
||||
/// Find the maximum value between single vector components.
|
||||
/// @see gtx_component_wise
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMax(
|
||||
genType const & v);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type compMax(genType const& v);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,70 +1,127 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_component_wise
|
||||
/// @file glm/gtx/component_wise.inl
|
||||
/// @date 2007-05-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
#include <limits>
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
{
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T compAdd(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType>
|
||||
struct compute_compNormalize
|
||||
{};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compNormalize<L, T, floatType, Q, true, true>
|
||||
{
|
||||
T result(0);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(v); ++i)
|
||||
result += v[i];
|
||||
return result;
|
||||
GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)
|
||||
{
|
||||
floatType const Min = static_cast<floatType>(std::numeric_limits<T>::min());
|
||||
floatType const Max = static_cast<floatType>(std::numeric_limits<T>::max());
|
||||
return (vec<L, floatType, Q>(v) - Min) / (Max - Min) * static_cast<floatType>(2) - static_cast<floatType>(1);
|
||||
}
|
||||
};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compNormalize<L, T, floatType, Q, true, false>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)
|
||||
{
|
||||
return vec<L, floatType, Q>(v) / static_cast<floatType>(std::numeric_limits<T>::max());
|
||||
}
|
||||
};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compNormalize<L, T, floatType, Q, false, true>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vec<L, floatType, Q> call(vec<L, T, Q> const& v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q, bool isInteger, bool signedType>
|
||||
struct compute_compScale
|
||||
{};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compScale<L, T, floatType, Q, true, true>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)
|
||||
{
|
||||
floatType const Max = static_cast<floatType>(std::numeric_limits<T>::max()) + static_cast<floatType>(0.5);
|
||||
vec<L, floatType, Q> const Scaled(v * Max);
|
||||
vec<L, T, Q> const Result(Scaled - static_cast<floatType>(0.5));
|
||||
return Result;
|
||||
}
|
||||
};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compScale<L, T, floatType, Q, true, false>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)
|
||||
{
|
||||
return vec<L, T, Q>(vec<L, floatType, Q>(v) * static_cast<floatType>(std::numeric_limits<T>::max()));
|
||||
}
|
||||
};
|
||||
|
||||
template<length_t L, typename T, typename floatType, qualifier Q>
|
||||
struct compute_compScale<L, T, floatType, Q, false, true>
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static vec<L, T, Q> call(vec<L, floatType, Q> const& v)
|
||||
{
|
||||
return v;
|
||||
}
|
||||
};
|
||||
}//namespace detail
|
||||
|
||||
template<typename floatType, length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, floatType, Q> compNormalize(vec<L, T, Q> const& v)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "'compNormalize' accepts only floating-point types for 'floatType' template parameter");
|
||||
|
||||
return detail::compute_compNormalize<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T compMul(vecType<T, P> const & v)
|
||||
template<typename T, length_t L, typename floatType, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> compScale(vec<L, floatType, Q> const& v)
|
||||
{
|
||||
T result(1);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(v); ++i)
|
||||
result *= v[i];
|
||||
return result;
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<floatType>::is_iec559, "'compScale' accepts only floating-point types for 'floatType' template parameter");
|
||||
|
||||
return detail::compute_compScale<L, T, floatType, Q, std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed>::call(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T compMin(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T compAdd(vec<L, T, Q> const& v)
|
||||
{
|
||||
T result(v[0]);
|
||||
for(detail::component_count_t i = 1; i < detail::component_count(v); ++i)
|
||||
result = min(result, v[i]);
|
||||
return result;
|
||||
T Result(0);
|
||||
for(length_t i = 0, n = v.length(); i < n; ++i)
|
||||
Result += v[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T compMax(vecType<T, P> const & v)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T compMul(vec<L, T, Q> const& v)
|
||||
{
|
||||
T result(v[0]);
|
||||
for(detail::component_count_t i = 1; i < detail::component_count(v); ++i)
|
||||
result = max(result, v[i]);
|
||||
return result;
|
||||
T Result(1);
|
||||
for(length_t i = 0, n = v.length(); i < n; ++i)
|
||||
Result *= v[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T compMin(vec<L, T, Q> const& v)
|
||||
{
|
||||
T Result(v[0]);
|
||||
for(length_t i = 1, n = v.length(); i < n; ++i)
|
||||
Result = min(Result, v[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T compMax(vec<L, T, Q> const& v)
|
||||
{
|
||||
T Result(v[0]);
|
||||
for(length_t i = 1, n = v.length(); i < n; ++i)
|
||||
Result = max(Result, v[i]);
|
||||
return Result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,46 +1,17 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_dual_quaternion
|
||||
/// @file glm/gtx/dual_quaternion.hpp
|
||||
/// @date 2013-02-10 / 2013-02-20
|
||||
/// @author Maksim Vorobiev (msomeone@gmail.com)
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_half_float (dependence)
|
||||
/// @see gtc_constants (dependence)
|
||||
/// @see gtc_quaternion (dependence)
|
||||
///
|
||||
/// @defgroup gtx_dual_quaternion GLM_GTX_dual_quaternion
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Defines a templated dual-quaternion type and several dual-quaternion operations.
|
||||
/// Include <glm/gtx/dual_quaternion.hpp> to use the features of this extension.
|
||||
///
|
||||
/// <glm/gtx/dual_quaternion.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// Defines a templated dual-quaternion type and several dual-quaternion operations.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -49,7 +20,11 @@
|
||||
#include "../gtc/constants.hpp"
|
||||
#include "../gtc/quaternion.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_dual_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_dual_quaternion extension included")
|
||||
#endif
|
||||
|
||||
@@ -58,206 +33,197 @@ namespace glm
|
||||
/// @addtogroup gtx_dual_quaternion
|
||||
/// @{
|
||||
|
||||
template <typename T, precision P = defaultp>
|
||||
template<typename T, qualifier Q = defaultp>
|
||||
struct tdualquat
|
||||
{
|
||||
// -- Implementation detail --
|
||||
|
||||
typedef T value_type;
|
||||
typedef glm::tquat<T, P> part_type;
|
||||
|
||||
# ifdef GLM_META_PROG_HELPERS
|
||||
static GLM_RELAXED_CONSTEXPR length_t components = 2;
|
||||
static GLM_RELAXED_CONSTEXPR precision prec = P;
|
||||
# endif//GLM_META_PROG_HELPERS
|
||||
typedef qua<T, Q> part_type;
|
||||
|
||||
// -- Data --
|
||||
|
||||
glm::tquat<T, P> real, dual;
|
||||
qua<T, Q> real, dual;
|
||||
|
||||
// -- Component accesses --
|
||||
|
||||
# ifdef GLM_FORCE_SIZE_FUNC
|
||||
typedef size_t size_type;
|
||||
/// Return the count of components of a dual quaternion
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR size_type size() const;
|
||||
typedef length_t length_type;
|
||||
/// Return the count of components of a dual quaternion
|
||||
GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 2;}
|
||||
|
||||
GLM_FUNC_DECL part_type & operator[](size_type i);
|
||||
GLM_FUNC_DECL part_type const & operator[](size_type i) const;
|
||||
# else
|
||||
typedef length_t length_type;
|
||||
/// Return the count of components of a dual quaternion
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR length_type length() const;
|
||||
|
||||
GLM_FUNC_DECL part_type & operator[](length_type i);
|
||||
GLM_FUNC_DECL part_type const & operator[](length_type i) const;
|
||||
# endif//GLM_FORCE_SIZE_FUNC
|
||||
GLM_FUNC_DECL part_type & operator[](length_type i);
|
||||
GLM_FUNC_DECL part_type const& operator[](length_type i) const;
|
||||
|
||||
// -- Implicit basic constructors --
|
||||
|
||||
GLM_FUNC_DECL tdualquat() GLM_DEFAULT_CTOR;
|
||||
GLM_FUNC_DECL tdualquat(tdualquat<T, P> const & d) GLM_DEFAULT;
|
||||
template <precision Q>
|
||||
GLM_FUNC_DECL tdualquat(tdualquat<T, Q> const & d);
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat() GLM_DEFAULT;
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, Q> const& d) GLM_DEFAULT;
|
||||
template<qualifier P>
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(tdualquat<T, P> const& d);
|
||||
|
||||
// -- Explicit basic constructors --
|
||||
|
||||
GLM_FUNC_DECL explicit tdualquat(ctor);
|
||||
GLM_FUNC_DECL explicit tdualquat(tquat<T, P> const & real);
|
||||
GLM_FUNC_DECL tdualquat(tquat<T, P> const & orientation, tvec3<T, P> const & translation);
|
||||
GLM_FUNC_DECL tdualquat(tquat<T, P> const & real, tquat<T, P> const & dual);
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua<T, Q> const& real);
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua<T, Q> const& orientation, vec<3, T, Q> const& translation);
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR tdualquat(qua<T, Q> const& real, qua<T, Q> const& dual);
|
||||
|
||||
// -- Conversion constructors --
|
||||
|
||||
template <typename U, precision Q>
|
||||
GLM_FUNC_DECL GLM_EXPLICIT tdualquat(tdualquat<U, Q> const & q);
|
||||
template<typename U, qualifier P>
|
||||
GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT tdualquat(tdualquat<U, P> const& q);
|
||||
|
||||
GLM_FUNC_DECL explicit tdualquat(tmat2x4<T, P> const & holder_mat);
|
||||
GLM_FUNC_DECL explicit tdualquat(tmat3x4<T, P> const & aug_mat);
|
||||
GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<2, 4, T, Q> const& holder_mat);
|
||||
GLM_FUNC_DECL GLM_EXPLICIT GLM_CONSTEXPR tdualquat(mat<3, 4, T, Q> const& aug_mat);
|
||||
|
||||
// -- Unary arithmetic operators --
|
||||
|
||||
GLM_FUNC_DECL tdualquat<T, P> & operator=(tdualquat<T, P> const & m) GLM_DEFAULT;
|
||||
GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<T, Q> const& m) GLM_DEFAULT;
|
||||
|
||||
template <typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, P> & operator=(tdualquat<U, P> const & m);
|
||||
template <typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, P> & operator*=(U s);
|
||||
template <typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, P> & operator/=(U s);
|
||||
template<typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> & operator=(tdualquat<U, Q> const& m);
|
||||
template<typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> & operator*=(U s);
|
||||
template<typename U>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> & operator/=(U s);
|
||||
};
|
||||
|
||||
// -- Unary bit operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator+(tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator-(tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator-(tdualquat<T, Q> const& q);
|
||||
|
||||
// -- Binary operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator+(tdualquat<T, P> const & q, tdualquat<T, P> const & p);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator*(tdualquat<T, P> const & q, tdualquat<T, P> const & p);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> operator*(tdualquat<T, P> const & q, tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> operator*(tvec3<T, P> const & v, tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> operator*(tdualquat<T, P> const & q, tvec4<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> operator*(tvec4<T, P> const & v, tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator*(tdualquat<T, P> const & q, T const & s);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator*(T const & s, tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> operator/(tdualquat<T, P> const & q, T const & s);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s);
|
||||
|
||||
// -- Boolean operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL bool operator==(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL bool operator!=(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2);
|
||||
|
||||
/// Creates an identity dual quaternion.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> dual_quat_identity();
|
||||
|
||||
/// Returns the normalized quaternion.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> normalize(tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> normalize(tdualquat<T, Q> const& q);
|
||||
|
||||
/// Returns the linear interpolation of two dual quaternion.
|
||||
///
|
||||
/// @see gtc_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> lerp(tdualquat<T, P> const & x, tdualquat<T, P> const & y, T const & a);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a);
|
||||
|
||||
/// Returns the q inverse.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> inverse(tdualquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> inverse(tdualquat<T, Q> const& q);
|
||||
|
||||
/// Converts a quaternion to a 2 * 4 matrix.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x4<T, P> mat2x4_cast(tdualquat<T, P> const & x);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x);
|
||||
|
||||
/// Converts a quaternion to a 3 * 4 matrix.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x4<T, P> mat3x4_cast(tdualquat<T, P> const & x);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x);
|
||||
|
||||
/// Converts a 2 * 4 matrix (matrix which holds real and dual parts) to a quaternion.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> dualquat_cast(tmat2x4<T, P> const & x);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x);
|
||||
|
||||
/// Converts a 3 * 4 matrix (augmented matrix rotation + translation) to a quaternion.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tdualquat<T, P> dualquat_cast(tmat3x4<T, P> const & x);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x);
|
||||
|
||||
|
||||
/// Dual-quaternion of low single-precision floating-point numbers.
|
||||
/// Dual-quaternion of low single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, lowp> lowp_dualquat;
|
||||
|
||||
/// Dual-quaternion of medium single-precision floating-point numbers.
|
||||
/// Dual-quaternion of medium single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, mediump> mediump_dualquat;
|
||||
|
||||
/// Dual-quaternion of high single-precision floating-point numbers.
|
||||
/// Dual-quaternion of high single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, highp> highp_dualquat;
|
||||
|
||||
|
||||
/// Dual-quaternion of low single-precision floating-point numbers.
|
||||
/// Dual-quaternion of low single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, lowp> lowp_fdualquat;
|
||||
|
||||
/// Dual-quaternion of medium single-precision floating-point numbers.
|
||||
/// Dual-quaternion of medium single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, mediump> mediump_fdualquat;
|
||||
|
||||
/// Dual-quaternion of high single-precision floating-point numbers.
|
||||
/// Dual-quaternion of high single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<float, highp> highp_fdualquat;
|
||||
|
||||
|
||||
/// Dual-quaternion of low double-precision floating-point numbers.
|
||||
/// Dual-quaternion of low double-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<double, lowp> lowp_ddualquat;
|
||||
|
||||
/// Dual-quaternion of medium double-precision floating-point numbers.
|
||||
/// Dual-quaternion of medium double-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<double, mediump> mediump_ddualquat;
|
||||
|
||||
/// Dual-quaternion of high double-precision floating-point numbers.
|
||||
/// Dual-quaternion of high double-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef tdualquat<double, highp> highp_ddualquat;
|
||||
@@ -269,7 +235,7 @@ namespace glm
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef highp_fdualquat dualquat;
|
||||
|
||||
/// Dual-quaternion of single-precision floating-point numbers.
|
||||
/// Dual-quaternion of single-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef highp_fdualquat fdualquat;
|
||||
@@ -288,7 +254,7 @@ namespace glm
|
||||
|
||||
|
||||
#if(!defined(GLM_PRECISION_HIGHP_DOUBLE) && !defined(GLM_PRECISION_MEDIUMP_DOUBLE) && !defined(GLM_PRECISION_LOWP_DOUBLE))
|
||||
/// Dual-quaternion of default double-precision floating-point numbers.
|
||||
/// Dual-quaternion of default double-qualifier floating-point numbers.
|
||||
///
|
||||
/// @see gtx_dual_quaternion
|
||||
typedef highp_ddualquat ddualquat;
|
||||
|
||||
@@ -1,34 +1,4 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_dual_quaternion
|
||||
/// @file glm/gtx/dual_quaternion.inl
|
||||
/// @date 2013-02-10 / 2013-02-13
|
||||
/// @author Maksim Vorobiev (msomeone@gmail.com)
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "../geometric.hpp"
|
||||
#include <limits>
|
||||
@@ -37,88 +7,54 @@ namespace glm
|
||||
{
|
||||
// -- Component accesses --
|
||||
|
||||
# ifdef GLM_FORCE_SIZE_FUNC
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tdualquat<T, P>::size_type tdualquat<T, P>::size() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type & tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i)
|
||||
{
|
||||
assert(i >= 0 && i < this->length());
|
||||
return (&real)[i];
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type & tdualquat<T, P>::operator[](typename tdualquat<T, P>::size_type i)
|
||||
{
|
||||
assert(i >= 0 && static_cast<detail::component_count_t>(i) < detail::component_count(*this));
|
||||
return (&real)[i];
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type const & tdualquat<T, P>::operator[](typename tdualquat<T, P>::size_type i) const
|
||||
{
|
||||
assert(i >= 0 && static_cast<detail::component_count_t>(i) < detail::component_count(*this));
|
||||
return (&real)[i];
|
||||
}
|
||||
# else
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tdualquat<T, P>::length_type tdualquat<T, P>::length() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type & tdualquat<T, P>::operator[](typename tdualquat<T, P>::length_type i)
|
||||
{
|
||||
assert(i >= 0 && static_cast<detail::component_count_t>(i) < detail::component_count(*this));
|
||||
return (&real)[i];
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, P>::part_type const & tdualquat<T, P>::operator[](typename tdualquat<T, P>::length_type i) const
|
||||
{
|
||||
assert(i >= 0 && static_cast<detail::component_count_t>(i) < detail::component_count(*this));
|
||||
return (&real)[i];
|
||||
}
|
||||
# endif//GLM_FORCE_SIZE_FUNC
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER typename tdualquat<T, Q>::part_type const& tdualquat<T, Q>::operator[](typename tdualquat<T, Q>::length_type i) const
|
||||
{
|
||||
assert(i >= 0 && i < this->length());
|
||||
return (&real)[i];
|
||||
}
|
||||
|
||||
// -- Implicit basic constructors --
|
||||
|
||||
# if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT)
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat()
|
||||
# ifndef GLM_FORCE_NO_CTOR_INIT
|
||||
: real(tquat<T, P>())
|
||||
, dual(tquat<T, P>(0, 0, 0, 0))
|
||||
# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat()
|
||||
# if GLM_CONFIG_DEFAULTED_FUNCTIONS != GLM_DISABLE
|
||||
: real(qua<T, Q>())
|
||||
, dual(qua<T, Q>(0, 0, 0, 0))
|
||||
# endif
|
||||
{}
|
||||
# endif
|
||||
|
||||
# if !GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tdualquat<T, P> const & d)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, Q> const& d)
|
||||
: real(d.real)
|
||||
, dual(d.dual)
|
||||
{}
|
||||
# endif//!GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
# endif
|
||||
|
||||
template <typename T, precision P>
|
||||
template <precision Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tdualquat<T, Q> const & d)
|
||||
template<typename T, qualifier Q>
|
||||
template<qualifier P>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<T, P> const& d)
|
||||
: real(d.real)
|
||||
, dual(d.dual)
|
||||
{}
|
||||
|
||||
// -- Explicit basic constructors --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(ctor)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(qua<T, Q> const& r)
|
||||
: real(r), dual(qua<T, Q>(0, 0, 0, 0))
|
||||
{}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const & r)
|
||||
: real(r), dual(tquat<T, P>(0, 0, 0, 0))
|
||||
{}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const & q, tvec3<T, P> const& p)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(qua<T, Q> const& q, vec<3, T, Q> const& p)
|
||||
: real(q), dual(
|
||||
T(-0.5) * ( p.x*q.x + p.y*q.y + p.z*q.z),
|
||||
T(+0.5) * ( p.x*q.w + p.y*q.z - p.z*q.y),
|
||||
@@ -126,65 +62,65 @@ namespace glm
|
||||
T(+0.5) * ( p.x*q.y - p.y*q.x + p.z*q.w))
|
||||
{}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tquat<T, P> const & r, tquat<T, P> const & d)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(qua<T, Q> const& r, qua<T, Q> const& d)
|
||||
: real(r), dual(d)
|
||||
{}
|
||||
|
||||
// -- Conversion constructors --
|
||||
|
||||
template <typename T, precision P>
|
||||
template <typename U, precision Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tdualquat<U, Q> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
template<typename U, qualifier P>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(tdualquat<U, P> const& q)
|
||||
: real(q.real)
|
||||
, dual(q.dual)
|
||||
{}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat2x4<T, P> const & m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(mat<2, 4, T, Q> const& m)
|
||||
{
|
||||
*this = dualquat_cast(m);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P>::tdualquat(tmat3x4<T, P> const & m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER GLM_CONSTEXPR tdualquat<T, Q>::tdualquat(mat<3, 4, T, Q> const& m)
|
||||
{
|
||||
*this = dualquat_cast(m);
|
||||
}
|
||||
|
||||
// -- Unary arithmetic operators --
|
||||
|
||||
# if !GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator=(tdualquat<T, P> const & q)
|
||||
# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<T, Q> const& q)
|
||||
{
|
||||
this->real = q.real;
|
||||
this->dual = q.dual;
|
||||
return *this;
|
||||
}
|
||||
# endif//!GLM_HAS_DEFAULTED_FUNCTIONS
|
||||
# endif
|
||||
|
||||
template <typename T, precision P>
|
||||
template <typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator=(tdualquat<U, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
template<typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator=(tdualquat<U, Q> const& q)
|
||||
{
|
||||
this->real = q.real;
|
||||
this->dual = q.dual;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
template <typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator*=(U s)
|
||||
template<typename T, qualifier Q>
|
||||
template<typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator*=(U s)
|
||||
{
|
||||
this->real *= static_cast<T>(s);
|
||||
this->dual *= static_cast<T>(s);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
template <typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> & tdualquat<T, P>::operator/=(U s)
|
||||
template<typename T, qualifier Q>
|
||||
template<typename U>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> & tdualquat<T, Q>::operator/=(U s)
|
||||
{
|
||||
this->real /= static_cast<T>(s);
|
||||
this->dual /= static_cast<T>(s);
|
||||
@@ -193,100 +129,108 @@ namespace glm
|
||||
|
||||
// -- Unary bit operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator+(tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q)
|
||||
{
|
||||
return q;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator-(tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator-(tdualquat<T, Q> const& q)
|
||||
{
|
||||
return tdualquat<T, P>(-q.real, -q.dual);
|
||||
return tdualquat<T, Q>(-q.real, -q.dual);
|
||||
}
|
||||
|
||||
// -- Binary operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator+(tdualquat<T, P> const & q, tdualquat<T, P> const & p)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator+(tdualquat<T, Q> const& q, tdualquat<T, Q> const& p)
|
||||
{
|
||||
return tdualquat<T, P>(q.real + p.real,q.dual + p.dual);
|
||||
return tdualquat<T, Q>(q.real + p.real,q.dual + p.dual);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(tdualquat<T, P> const & p, tdualquat<T, P> const & o)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& p, tdualquat<T, Q> const& o)
|
||||
{
|
||||
return tdualquat<T, P>(p.real * o.real,p.real * o.dual + p.dual * o.real);
|
||||
return tdualquat<T, Q>(p.real * o.real,p.real * o.dual + p.dual * o.real);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tdualquat<T, P> const & q, tvec3<T, P> const & v)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(tdualquat<T, Q> const& q, vec<3, T, Q> const& v)
|
||||
{
|
||||
tvec3<T, P> const real_v3(q.real.x,q.real.y,q.real.z);
|
||||
tvec3<T, P> const dual_v3(q.dual.x,q.dual.y,q.dual.z);
|
||||
vec<3, T, Q> const real_v3(q.real.x,q.real.y,q.real.z);
|
||||
vec<3, T, Q> const dual_v3(q.dual.x,q.dual.y,q.dual.z);
|
||||
return (cross(real_v3, cross(real_v3,v) + v * q.real.w + dual_v3) + dual_v3 * q.real.w - real_v3 * q.dual.w) * T(2) + v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> operator*(tvec3<T, P> const & v, tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> operator*(vec<3, T, Q> const& v, tdualquat<T, Q> const& q)
|
||||
{
|
||||
return glm::inverse(q) * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tdualquat<T, P> const & q, tvec4<T, P> const & v)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(tdualquat<T, Q> const& q, vec<4, T, Q> const& v)
|
||||
{
|
||||
return tvec4<T, P>(q * tvec3<T, P>(v), v.w);
|
||||
return vec<4, T, Q>(q * vec<3, T, Q>(v), v.w);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> operator*(tvec4<T, P> const & v, tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> operator*(vec<4, T, Q> const& v, tdualquat<T, Q> const& q)
|
||||
{
|
||||
return glm::inverse(q) * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(tdualquat<T, P> const & q, T const & s)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(tdualquat<T, Q> const& q, T const& s)
|
||||
{
|
||||
return tdualquat<T, P>(q.real * s, q.dual * s);
|
||||
return tdualquat<T, Q>(q.real * s, q.dual * s);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator*(T const & s, tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator*(T const& s, tdualquat<T, Q> const& q)
|
||||
{
|
||||
return q * s;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> operator/(tdualquat<T, P> const & q, T const & s)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> operator/(tdualquat<T, Q> const& q, T const& s)
|
||||
{
|
||||
return tdualquat<T, P>(q.real / s, q.dual / s);
|
||||
return tdualquat<T, Q>(q.real / s, q.dual / s);
|
||||
}
|
||||
|
||||
// -- Boolean operators --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool operator==(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool operator==(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2)
|
||||
{
|
||||
return (q1.real == q2.real) && (q1.dual == q2.dual);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool operator!=(tdualquat<T, P> const & q1, tdualquat<T, P> const & q2)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool operator!=(tdualquat<T, Q> const& q1, tdualquat<T, Q> const& q2)
|
||||
{
|
||||
return (q1.real != q2.dual) || (q1.real != q2.dual);
|
||||
return (q1.real != q2.real) || (q1.dual != q2.dual);
|
||||
}
|
||||
|
||||
// -- Operations --
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> normalize(tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> dual_quat_identity()
|
||||
{
|
||||
return tdualquat<T, Q>(
|
||||
qua<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)),
|
||||
qua<T, Q>(static_cast<T>(0), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0)));
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> normalize(tdualquat<T, Q> const& q)
|
||||
{
|
||||
return q / length(q.real);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> lerp(tdualquat<T, P> const & x, tdualquat<T, P> const & y, T const & a)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> lerp(tdualquat<T, Q> const& x, tdualquat<T, Q> const& y, T const& a)
|
||||
{
|
||||
// Dual Quaternion Linear blend aka DLB:
|
||||
// Lerp is only defined in [0, 1]
|
||||
@@ -294,72 +238,72 @@ namespace glm
|
||||
assert(a <= static_cast<T>(1));
|
||||
T const k = dot(x.real,y.real) < static_cast<T>(0) ? -a : a;
|
||||
T const one(1);
|
||||
return tdualquat<T, P>(x * (one - a) + y * k);
|
||||
return tdualquat<T, Q>(x * (one - a) + y * k);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> inverse(tdualquat<T, P> const & q)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> inverse(tdualquat<T, Q> const& q)
|
||||
{
|
||||
const glm::tquat<T, P> real = conjugate(q.real);
|
||||
const glm::tquat<T, P> dual = conjugate(q.dual);
|
||||
return tdualquat<T, P>(real, dual + (real * (-2.0f * dot(real,dual))));
|
||||
const glm::qua<T, Q> real = conjugate(q.real);
|
||||
const glm::qua<T, Q> dual = conjugate(q.dual);
|
||||
return tdualquat<T, Q>(real, dual + (real * (-2.0f * dot(real,dual))));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x4<T, P> mat2x4_cast(tdualquat<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 4, T, Q> mat2x4_cast(tdualquat<T, Q> const& x)
|
||||
{
|
||||
return tmat2x4<T, P>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w );
|
||||
return mat<2, 4, T, Q>( x[0].x, x[0].y, x[0].z, x[0].w, x[1].x, x[1].y, x[1].z, x[1].w );
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x4<T, P> mat3x4_cast(tdualquat<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 4, T, Q> mat3x4_cast(tdualquat<T, Q> const& x)
|
||||
{
|
||||
tquat<T, P> r = x.real / length2(x.real);
|
||||
|
||||
tquat<T, P> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z);
|
||||
qua<T, Q> r = x.real / length2(x.real);
|
||||
|
||||
qua<T, Q> const rr(r.w * x.real.w, r.x * x.real.x, r.y * x.real.y, r.z * x.real.z);
|
||||
r *= static_cast<T>(2);
|
||||
|
||||
|
||||
T const xy = r.x * x.real.y;
|
||||
T const xz = r.x * x.real.z;
|
||||
T const yz = r.y * x.real.z;
|
||||
T const wx = r.w * x.real.x;
|
||||
T const wy = r.w * x.real.y;
|
||||
T const wz = r.w * x.real.z;
|
||||
|
||||
tvec4<T, P> const a(
|
||||
|
||||
vec<4, T, Q> const a(
|
||||
rr.w + rr.x - rr.y - rr.z,
|
||||
xy - wz,
|
||||
xz + wy,
|
||||
-(x.dual.w * r.x - x.dual.x * r.w + x.dual.y * r.z - x.dual.z * r.y));
|
||||
|
||||
tvec4<T, P> const b(
|
||||
|
||||
vec<4, T, Q> const b(
|
||||
xy + wz,
|
||||
rr.w + rr.y - rr.x - rr.z,
|
||||
yz - wx,
|
||||
-(x.dual.w * r.y - x.dual.x * r.z - x.dual.y * r.w + x.dual.z * r.x));
|
||||
|
||||
tvec4<T, P> const c(
|
||||
|
||||
vec<4, T, Q> const c(
|
||||
xz - wy,
|
||||
yz + wx,
|
||||
rr.w + rr.z - rr.x - rr.y,
|
||||
-(x.dual.w * r.z + x.dual.x * r.y - x.dual.y * r.x - x.dual.z * r.w));
|
||||
|
||||
return tmat3x4<T, P>(a, b, c);
|
||||
|
||||
return mat<3, 4, T, Q>(a, b, c);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> dualquat_cast(tmat2x4<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<2, 4, T, Q> const& x)
|
||||
{
|
||||
return tdualquat<T, P>(
|
||||
tquat<T, P>( x[0].w, x[0].x, x[0].y, x[0].z ),
|
||||
tquat<T, P>( x[1].w, x[1].x, x[1].y, x[1].z ));
|
||||
return tdualquat<T, Q>(
|
||||
qua<T, Q>( x[0].w, x[0].x, x[0].y, x[0].z ),
|
||||
qua<T, Q>( x[1].w, x[1].x, x[1].y, x[1].z ));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, P> dualquat_cast(tmat3x4<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER tdualquat<T, Q> dualquat_cast(mat<3, 4, T, Q> const& x)
|
||||
{
|
||||
tquat<T, P> real(uninitialize);
|
||||
|
||||
qua<T, Q> real;
|
||||
|
||||
T const trace = x[0].x + x[1].y + x[2].z;
|
||||
if(trace > static_cast<T>(0))
|
||||
{
|
||||
@@ -397,12 +341,12 @@ namespace glm
|
||||
real.z = static_cast<T>(0.5) * r;
|
||||
real.w = (x[1].x - x[0].y) * invr;
|
||||
}
|
||||
|
||||
tquat<T, P> dual(uninitialize);
|
||||
|
||||
qua<T, Q> dual;
|
||||
dual.x = static_cast<T>(0.5) * ( x[0].w * real.w + x[1].w * real.z - x[2].w * real.y);
|
||||
dual.y = static_cast<T>(0.5) * (-x[0].w * real.z + x[1].w * real.w + x[2].w * real.x);
|
||||
dual.z = static_cast<T>(0.5) * ( x[0].w * real.y - x[1].w * real.x + x[2].w * real.w);
|
||||
dual.w = -static_cast<T>(0.5) * ( x[0].w * real.x + x[1].w * real.y + x[2].w * real.z);
|
||||
return tdualquat<T, P>(real, dual);
|
||||
return tdualquat<T, Q>(real, dual);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
219
includes/glm/gtx/easing.hpp
Normal file
219
includes/glm/gtx/easing.hpp
Normal file
@@ -0,0 +1,219 @@
|
||||
/// @ref gtx_easing
|
||||
/// @file glm/gtx/easing.hpp
|
||||
/// @author Robert Chisholm
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_easing GLM_GTX_easing
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/easing.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Easing functions for animations and transitons
|
||||
/// All functions take a parameter x in the range [0.0,1.0]
|
||||
///
|
||||
/// Based on the AHEasing project of Warren Moore (https://github.com/warrenm/AHEasing)
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
#include "../gtc/constants.hpp"
|
||||
#include "../detail/qualifier.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_easing is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_easing extension included")
|
||||
#endif
|
||||
|
||||
namespace glm{
|
||||
/// @addtogroup gtx_easing
|
||||
/// @{
|
||||
|
||||
/// Modelled after the line y = x
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType linearInterpolation(genType const & a);
|
||||
|
||||
/// Modelled after the parabola y = x^2
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quadraticEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the parabola y = -x^2 + 2x
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quadraticEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise quadratic
|
||||
/// y = (1/2)((2x)^2) ; [0, 0.5)
|
||||
/// y = -(1/2)((2x-1)*(2x-3) - 1) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quadraticEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after the cubic y = x^3
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType cubicEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the cubic y = (x - 1)^3 + 1
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType cubicEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise cubic
|
||||
/// y = (1/2)((2x)^3) ; [0, 0.5)
|
||||
/// y = (1/2)((2x-2)^3 + 2) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType cubicEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after the quartic x^4
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quarticEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the quartic y = 1 - (x - 1)^4
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quarticEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise quartic
|
||||
/// y = (1/2)((2x)^4) ; [0, 0.5)
|
||||
/// y = -(1/2)((2x-2)^4 - 2) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quarticEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after the quintic y = x^5
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quinticEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the quintic y = (x - 1)^5 + 1
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quinticEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise quintic
|
||||
/// y = (1/2)((2x)^5) ; [0, 0.5)
|
||||
/// y = (1/2)((2x-2)^5 + 2) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType quinticEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after quarter-cycle of sine wave
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType sineEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after quarter-cycle of sine wave (different phase)
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType sineEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after half sine wave
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType sineEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after shifted quadrant IV of unit circle
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType circularEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after shifted quadrant II of unit circle
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType circularEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise circular function
|
||||
/// y = (1/2)(1 - sqrt(1 - 4x^2)) ; [0, 0.5)
|
||||
/// y = (1/2)(sqrt(-(2x - 3)*(2x - 1)) + 1) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType circularEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after the exponential function y = 2^(10(x - 1))
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType exponentialEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the exponential function y = -2^(-10x) + 1
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType exponentialEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise exponential
|
||||
/// y = (1/2)2^(10(2x - 1)) ; [0,0.5)
|
||||
/// y = -(1/2)*2^(-10(2x - 1))) + 1 ; [0.5,1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType exponentialEaseInOut(genType const & a);
|
||||
|
||||
/// Modelled after the damped sine wave y = sin(13pi/2*x)*pow(2, 10 * (x - 1))
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType elasticEaseIn(genType const & a);
|
||||
|
||||
/// Modelled after the damped sine wave y = sin(-13pi/2*(x + 1))*pow(2, -10x) + 1
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType elasticEaseOut(genType const & a);
|
||||
|
||||
/// Modelled after the piecewise exponentially-damped sine wave:
|
||||
/// y = (1/2)*sin(13pi/2*(2*x))*pow(2, 10 * ((2*x) - 1)) ; [0,0.5)
|
||||
/// y = (1/2)*(sin(-13pi/2*((2x-1)+1))*pow(2,-10(2*x-1)) + 2) ; [0.5, 1]
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType elasticEaseInOut(genType const & a);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseIn(genType const& a);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseOut(genType const& a);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseInOut(genType const& a);
|
||||
|
||||
/// @param a parameter
|
||||
/// @param o Optional overshoot modifier
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseIn(genType const& a, genType const& o);
|
||||
|
||||
/// @param a parameter
|
||||
/// @param o Optional overshoot modifier
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseOut(genType const& a, genType const& o);
|
||||
|
||||
/// @param a parameter
|
||||
/// @param o Optional overshoot modifier
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType backEaseInOut(genType const& a, genType const& o);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType bounceEaseIn(genType const& a);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType bounceEaseOut(genType const& a);
|
||||
|
||||
/// @see gtx_easing
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType bounceEaseInOut(genType const& a);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
#include "easing.inl"
|
||||
436
includes/glm/gtx/easing.inl
Normal file
436
includes/glm/gtx/easing.inl
Normal file
@@ -0,0 +1,436 @@
|
||||
/// @ref gtx_easing
|
||||
|
||||
#include <cmath>
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType linearInterpolation(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quadraticEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return a * a;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quadraticEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return -(a * (a - static_cast<genType>(2)));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quadraticEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(2) * a * a;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (-static_cast<genType>(2) * a * a) + (4 * a) - one<genType>();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cubicEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return a * a * a;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cubicEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType const f = a - one<genType>();
|
||||
return f * f * f + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cubicEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if (a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(4) * a * a * a;
|
||||
}
|
||||
else
|
||||
{
|
||||
genType const f = ((static_cast<genType>(2) * a) - static_cast<genType>(2));
|
||||
return static_cast<genType>(0.5) * f * f * f + one<genType>();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quarticEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return a * a * a * a;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quarticEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType const f = (a - one<genType>());
|
||||
return f * f * f * (one<genType>() - a) + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quarticEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(8) * a * a * a * a;
|
||||
}
|
||||
else
|
||||
{
|
||||
genType const f = (a - one<genType>());
|
||||
return -static_cast<genType>(8) * f * f * f * f + one<genType>();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quinticEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return a * a * a * a * a;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quinticEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType const f = (a - one<genType>());
|
||||
return f * f * f * f * f + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType quinticEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(16) * a * a * a * a * a;
|
||||
}
|
||||
else
|
||||
{
|
||||
genType const f = ((static_cast<genType>(2) * a) - static_cast<genType>(2));
|
||||
return static_cast<genType>(0.5) * f * f * f * f * f + one<genType>();
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sineEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return sin((a - one<genType>()) * half_pi<genType>()) + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sineEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return sin(a * half_pi<genType>());
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sineEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return static_cast<genType>(0.5) * (one<genType>() - cos(a * pi<genType>()));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType circularEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return one<genType>() - sqrt(one<genType>() - (a * a));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType circularEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return sqrt((static_cast<genType>(2) - a) * a);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType circularEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(0.5) * (one<genType>() - std::sqrt(one<genType>() - static_cast<genType>(4) * (a * a)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return static_cast<genType>(0.5) * (std::sqrt(-((static_cast<genType>(2) * a) - static_cast<genType>(3)) * ((static_cast<genType>(2) * a) - one<genType>())) + one<genType>());
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType exponentialEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a <= zero<genType>())
|
||||
return a;
|
||||
else
|
||||
{
|
||||
genType const Complementary = a - one<genType>();
|
||||
genType const Two = static_cast<genType>(2);
|
||||
|
||||
return glm::pow(Two, Complementary * static_cast<genType>(10));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType exponentialEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a >= one<genType>())
|
||||
return a;
|
||||
else
|
||||
{
|
||||
return one<genType>() - glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * a);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType exponentialEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
return static_cast<genType>(0.5) * glm::pow(static_cast<genType>(2), (static_cast<genType>(20) * a) - static_cast<genType>(10));
|
||||
else
|
||||
return -static_cast<genType>(0.5) * glm::pow(static_cast<genType>(2), (-static_cast<genType>(20) * a) + static_cast<genType>(10)) + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType elasticEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return std::sin(static_cast<genType>(13) * half_pi<genType>() * a) * glm::pow(static_cast<genType>(2), static_cast<genType>(10) * (a - one<genType>()));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType elasticEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return std::sin(-static_cast<genType>(13) * half_pi<genType>() * (a + one<genType>())) * glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * a) + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType elasticEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
return static_cast<genType>(0.5) * std::sin(static_cast<genType>(13) * half_pi<genType>() * (static_cast<genType>(2) * a)) * glm::pow(static_cast<genType>(2), static_cast<genType>(10) * ((static_cast<genType>(2) * a) - one<genType>()));
|
||||
else
|
||||
return static_cast<genType>(0.5) * (std::sin(-static_cast<genType>(13) * half_pi<genType>() * ((static_cast<genType>(2) * a - one<genType>()) + one<genType>())) * glm::pow(static_cast<genType>(2), -static_cast<genType>(10) * (static_cast<genType>(2) * a - one<genType>())) + static_cast<genType>(2));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a, genType const& o)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType z = ((o + one<genType>()) * a) - o;
|
||||
return (a * a * z);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a, genType const& o)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType n = a - one<genType>();
|
||||
genType z = ((o + one<genType>()) * n) + o;
|
||||
return (n * n * z) + one<genType>();
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a, genType const& o)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
genType s = o * static_cast<genType>(1.525);
|
||||
genType x = static_cast<genType>(0.5);
|
||||
genType n = a / static_cast<genType>(0.5);
|
||||
|
||||
if (n < static_cast<genType>(1))
|
||||
{
|
||||
genType z = ((s + static_cast<genType>(1)) * n) - s;
|
||||
genType m = n * n * z;
|
||||
return x * m;
|
||||
}
|
||||
else
|
||||
{
|
||||
n -= static_cast<genType>(2);
|
||||
genType z = ((s + static_cast<genType>(1)) * n) + s;
|
||||
genType m = (n*n*z) + static_cast<genType>(2);
|
||||
return x * m;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseIn(genType const& a)
|
||||
{
|
||||
return backEaseIn(a, static_cast<genType>(1.70158));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseOut(genType const& a)
|
||||
{
|
||||
return backEaseOut(a, static_cast<genType>(1.70158));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType backEaseInOut(genType const& a)
|
||||
{
|
||||
return backEaseInOut(a, static_cast<genType>(1.70158));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bounceEaseOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(4.0 / 11.0))
|
||||
{
|
||||
return (static_cast<genType>(121) * a * a) / static_cast<genType>(16);
|
||||
}
|
||||
else if(a < static_cast<genType>(8.0 / 11.0))
|
||||
{
|
||||
return (static_cast<genType>(363.0 / 40.0) * a * a) - (static_cast<genType>(99.0 / 10.0) * a) + static_cast<genType>(17.0 / 5.0);
|
||||
}
|
||||
else if(a < static_cast<genType>(9.0 / 10.0))
|
||||
{
|
||||
return (static_cast<genType>(4356.0 / 361.0) * a * a) - (static_cast<genType>(35442.0 / 1805.0) * a) + static_cast<genType>(16061.0 / 1805.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (static_cast<genType>(54.0 / 5.0) * a * a) - (static_cast<genType>(513.0 / 25.0) * a) + static_cast<genType>(268.0 / 25.0);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bounceEaseIn(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
return one<genType>() - bounceEaseOut(one<genType>() - a);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bounceEaseInOut(genType const& a)
|
||||
{
|
||||
// Only defined in [0, 1]
|
||||
assert(a >= zero<genType>());
|
||||
assert(a <= one<genType>());
|
||||
|
||||
if(a < static_cast<genType>(0.5))
|
||||
{
|
||||
return static_cast<genType>(0.5) * (one<genType>() - bounceEaseOut(a * static_cast<genType>(2)));
|
||||
}
|
||||
else
|
||||
{
|
||||
return static_cast<genType>(0.5) * bounceEaseOut(a * static_cast<genType>(2) - one<genType>()) + static_cast<genType>(0.5);
|
||||
}
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
@@ -1,51 +1,28 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_euler_angles
|
||||
/// @file glm/gtx/euler_angles.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_euler_angles GLM_GTX_euler_angles
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Build matrices from Euler angles.
|
||||
///
|
||||
/// <glm/gtx/euler_angles.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/euler_angles.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Build matrices from Euler angles.
|
||||
///
|
||||
/// Extraction of Euler angles from rotation matrix.
|
||||
/// Based on the original paper 2014 Mike Day - Extracting Euler Angles from a Rotation Matrix.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_euler_angles is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_euler_angles extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,116 +33,302 @@ namespace glm
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleX(
|
||||
T const & angleX);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleX(
|
||||
T const& angleX);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleY(
|
||||
T const & angleY);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleY(
|
||||
T const& angleY);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z.
|
||||
/// @see gtx_euler_angles
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZ(
|
||||
T const& angleZ);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about X-axis.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZ(
|
||||
T const & angleZ);
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleX(
|
||||
T const & angleX, T const & angularVelocityX);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Y-axis.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleY(
|
||||
T const & angleY, T const & angularVelocityY);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous derived matrix from the rotation matrix about Z-axis.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> derivedEulerAngleZ(
|
||||
T const & angleZ, T const & angularVelocityZ);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXY(
|
||||
T const & angleX,
|
||||
T const & angleY);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXY(
|
||||
T const& angleX,
|
||||
T const& angleY);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYX(
|
||||
T const & angleY,
|
||||
T const & angleX);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYX(
|
||||
T const& angleY,
|
||||
T const& angleX);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXZ(
|
||||
T const & angleX,
|
||||
T const & angleZ);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZ(
|
||||
T const& angleX,
|
||||
T const& angleZ);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZX(
|
||||
T const & angle,
|
||||
T const & angleX);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZX(
|
||||
T const& angle,
|
||||
T const& angleX);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYZ(
|
||||
T const & angleY,
|
||||
T const & angleZ);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZ(
|
||||
T const& angleY,
|
||||
T const& angleZ);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleZY(
|
||||
T const & angleZ,
|
||||
T const & angleY);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZY(
|
||||
T const& angleZ,
|
||||
T const& angleY);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleXYZ(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYZ(
|
||||
T const& t1,
|
||||
T const& t2,
|
||||
T const& t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> eulerAngleYXZ(
|
||||
T const & yaw,
|
||||
T const & pitch,
|
||||
T const & roll);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXZ(
|
||||
T const& yaw,
|
||||
T const& pitch,
|
||||
T const& roll);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat4x4<T, defaultp> yawPitchRoll(
|
||||
T const & yaw,
|
||||
T const & pitch,
|
||||
T const & roll);
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZX(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXYX(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYXY(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZY(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYZ(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXZ(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleXZY(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleYZX(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y * X).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZYX(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X * Y).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> eulerAngleZXY(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<4, 4, T, defaultp> yawPitchRoll(
|
||||
T const& yaw,
|
||||
T const& pitch,
|
||||
T const& roll);
|
||||
|
||||
/// Creates a 2D 2 * 2 rotation matrix from an euler angle.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat2x2<T, defaultp> orientate2(T const & angle);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<2, 2, T, defaultp> orientate2(T const& angle);
|
||||
|
||||
/// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle.
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL tmat3x3<T, defaultp> orientate3(T const & angle);
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL mat<3, 3, T, defaultp> orientate3(T const& angle);
|
||||
|
||||
/// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z).
|
||||
/// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> orientate3(tvec3<T, P> const & angles);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> orientate3(vec<3, T, Q> const& angles);
|
||||
|
||||
/// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z).
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> orientate4(tvec3<T, P> const & angles);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> orientate4(vec<3, T, Q> const& angles);
|
||||
|
||||
/// Extracts the (X * Y * Z) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4<T, defaultp> & M,
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
|
||||
/// Extracts the (Y * X * Z) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (X * Z * X) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (X * Y * X) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Y * X * Y) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Y * Z * Y) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Z * Y * Z) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Z * X * Z) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (X * Z * Y) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Y * Z * X) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Z * Y * X) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// Extracts the (Z * X * Y) Euler angles from the rotation matrix M
|
||||
/// @see gtx_euler_angles
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
|
||||
@@ -1,81 +1,51 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_euler_angles
|
||||
/// @file glm/gtx/euler_angles.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "compatibility.hpp" // glm::atan2
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleX
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleX
|
||||
(
|
||||
T const & angleX
|
||||
T const& angleX
|
||||
)
|
||||
{
|
||||
T cosX = glm::cos(angleX);
|
||||
T sinX = glm::sin(angleX);
|
||||
|
||||
return tmat4x4<T, defaultp>(
|
||||
|
||||
return mat<4, 4, T, defaultp>(
|
||||
T(1), T(0), T(0), T(0),
|
||||
T(0), cosX, sinX, T(0),
|
||||
T(0),-sinX, cosX, T(0),
|
||||
T(0), T(0), T(0), T(1));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleY
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleY
|
||||
(
|
||||
T const & angleY
|
||||
T const& angleY
|
||||
)
|
||||
{
|
||||
T cosY = glm::cos(angleY);
|
||||
T sinY = glm::sin(angleY);
|
||||
|
||||
return tmat4x4<T, defaultp>(
|
||||
return mat<4, 4, T, defaultp>(
|
||||
cosY, T(0), -sinY, T(0),
|
||||
T(0), T(1), T(0), T(0),
|
||||
sinY, T(0), cosY, T(0),
|
||||
T(0), T(0), T(0), T(1));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZ
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZ
|
||||
(
|
||||
T const & angleZ
|
||||
T const& angleZ
|
||||
)
|
||||
{
|
||||
T cosZ = glm::cos(angleZ);
|
||||
T sinZ = glm::sin(angleZ);
|
||||
|
||||
return tmat4x4<T, defaultp>(
|
||||
return mat<4, 4, T, defaultp>(
|
||||
cosZ, sinZ, T(0), T(0),
|
||||
-sinZ, cosZ, T(0), T(0),
|
||||
T(0), T(0), T(1), T(0),
|
||||
@@ -83,10 +53,61 @@ namespace glm
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXY
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleX
|
||||
(
|
||||
T const & angleX,
|
||||
T const & angleY
|
||||
T const & angularVelocityX
|
||||
)
|
||||
{
|
||||
T cosX = glm::cos(angleX) * angularVelocityX;
|
||||
T sinX = glm::sin(angleX) * angularVelocityX;
|
||||
|
||||
return mat<4, 4, T, defaultp>(
|
||||
T(0), T(0), T(0), T(0),
|
||||
T(0),-sinX, cosX, T(0),
|
||||
T(0),-cosX,-sinX, T(0),
|
||||
T(0), T(0), T(0), T(0));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleY
|
||||
(
|
||||
T const & angleY,
|
||||
T const & angularVelocityY
|
||||
)
|
||||
{
|
||||
T cosY = glm::cos(angleY) * angularVelocityY;
|
||||
T sinY = glm::sin(angleY) * angularVelocityY;
|
||||
|
||||
return mat<4, 4, T, defaultp>(
|
||||
-sinY, T(0), -cosY, T(0),
|
||||
T(0), T(0), T(0), T(0),
|
||||
cosY, T(0), -sinY, T(0),
|
||||
T(0), T(0), T(0), T(0));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> derivedEulerAngleZ
|
||||
(
|
||||
T const & angleZ,
|
||||
T const & angularVelocityZ
|
||||
)
|
||||
{
|
||||
T cosZ = glm::cos(angleZ) * angularVelocityZ;
|
||||
T sinZ = glm::sin(angleZ) * angularVelocityZ;
|
||||
|
||||
return mat<4, 4, T, defaultp>(
|
||||
-sinZ, cosZ, T(0), T(0),
|
||||
-cosZ, -sinZ, T(0), T(0),
|
||||
T(0), T(0), T(0), T(0),
|
||||
T(0), T(0), T(0), T(0));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXY
|
||||
(
|
||||
T const& angleX,
|
||||
T const& angleY
|
||||
)
|
||||
{
|
||||
T cosX = glm::cos(angleX);
|
||||
@@ -94,18 +115,18 @@ namespace glm
|
||||
T cosY = glm::cos(angleY);
|
||||
T sinY = glm::sin(angleY);
|
||||
|
||||
return tmat4x4<T, defaultp>(
|
||||
return mat<4, 4, T, defaultp>(
|
||||
cosY, -sinX * -sinY, cosX * -sinY, T(0),
|
||||
T(0), cosX, sinX, T(0),
|
||||
sinY, -sinX * cosY, cosX * cosY, T(0),
|
||||
T(0), T(0), T(0), T(1));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYX
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYX
|
||||
(
|
||||
T const & angleY,
|
||||
T const & angleX
|
||||
T const& angleY,
|
||||
T const& angleX
|
||||
)
|
||||
{
|
||||
T cosX = glm::cos(angleX);
|
||||
@@ -113,59 +134,59 @@ namespace glm
|
||||
T cosY = glm::cos(angleY);
|
||||
T sinY = glm::sin(angleY);
|
||||
|
||||
return tmat4x4<T, defaultp>(
|
||||
return mat<4, 4, T, defaultp>(
|
||||
cosY, 0, -sinY, T(0),
|
||||
sinY * sinX, cosX, cosY * sinX, T(0),
|
||||
sinY * cosX, -sinX, cosY * cosX, T(0),
|
||||
T(0), T(0), T(0), T(1));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXZ
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZ
|
||||
(
|
||||
T const & angleX,
|
||||
T const & angleZ
|
||||
T const& angleX,
|
||||
T const& angleZ
|
||||
)
|
||||
{
|
||||
return eulerAngleX(angleX) * eulerAngleZ(angleZ);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZX
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZX
|
||||
(
|
||||
T const & angleZ,
|
||||
T const & angleX
|
||||
T const& angleZ,
|
||||
T const& angleX
|
||||
)
|
||||
{
|
||||
return eulerAngleZ(angleZ) * eulerAngleX(angleX);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYZ
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZ
|
||||
(
|
||||
T const & angleY,
|
||||
T const & angleZ
|
||||
T const& angleY,
|
||||
T const& angleZ
|
||||
)
|
||||
{
|
||||
return eulerAngleY(angleY) * eulerAngleZ(angleZ);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleZY
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZY
|
||||
(
|
||||
T const & angleZ,
|
||||
T const & angleY
|
||||
T const& angleZ,
|
||||
T const& angleY
|
||||
)
|
||||
{
|
||||
return eulerAngleZ(angleZ) * eulerAngleY(angleY);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleXYZ
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYZ
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
T const& t1,
|
||||
T const& t2,
|
||||
T const& t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(-t1);
|
||||
@@ -174,8 +195,8 @@ namespace glm
|
||||
T s1 = glm::sin(-t1);
|
||||
T s2 = glm::sin(-t2);
|
||||
T s3 = glm::sin(-t3);
|
||||
|
||||
tmat4x4<T, defaultp> Result;
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c2 * c3;
|
||||
Result[0][1] =-c1 * s3 + s1 * s2 * c3;
|
||||
Result[0][2] = s1 * s3 + c1 * s2 * c3;
|
||||
@@ -194,13 +215,13 @@ namespace glm
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> eulerAngleYXZ
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXZ
|
||||
(
|
||||
T const & yaw,
|
||||
T const & pitch,
|
||||
T const & roll
|
||||
T const& yaw,
|
||||
T const& pitch,
|
||||
T const& roll
|
||||
)
|
||||
{
|
||||
T tmp_ch = glm::cos(yaw);
|
||||
@@ -210,7 +231,7 @@ namespace glm
|
||||
T tmp_cb = glm::cos(roll);
|
||||
T tmp_sb = glm::sin(roll);
|
||||
|
||||
tmat4x4<T, defaultp> Result;
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;
|
||||
Result[0][1] = tmp_sb * tmp_cp;
|
||||
Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;
|
||||
@@ -231,11 +252,361 @@ namespace glm
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, defaultp> yawPitchRoll
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZX
|
||||
(
|
||||
T const & yaw,
|
||||
T const & pitch,
|
||||
T const & roll
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c2;
|
||||
Result[0][1] = c1 * s2;
|
||||
Result[0][2] = s1 * s2;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-c3 * s2;
|
||||
Result[1][1] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[1][2] = c1 * s3 + c2 * c3 * s1;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = s2 * s3;
|
||||
Result[2][1] =-c3 * s1 - c1 * c2 * s3;
|
||||
Result[2][2] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXYX
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c2;
|
||||
Result[0][1] = s1 * s2;
|
||||
Result[0][2] =-c1 * s2;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] = s2 * s3;
|
||||
Result[1][1] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[1][2] = c3 * s1 + c1 * c2 * s3;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c3 * s2;
|
||||
Result[2][1] =-c1 * s3 - c2 * c3 * s1;
|
||||
Result[2][2] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYXY
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[0][1] = s2* s3;
|
||||
Result[0][2] =-c3 * s1 - c1 * c2 * s3;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] = s1 * s2;
|
||||
Result[1][1] = c2;
|
||||
Result[1][2] = c1 * s2;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c1 * s3 + c2 * c3 * s1;
|
||||
Result[2][1] =-c3 * s2;
|
||||
Result[2][2] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZY
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[0][1] = c3 * s2;
|
||||
Result[0][2] =-c1 * s3 - c2 * c3 * s1;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-c1 * s2;
|
||||
Result[1][1] = c2;
|
||||
Result[1][2] = s1 * s2;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c3 * s1 + c1 * c2 * s3;
|
||||
Result[2][1] = s2 * s3;
|
||||
Result[2][2] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYZ
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[0][1] = c1 * s3 + c2 * c3 * s1;
|
||||
Result[0][2] =-c3 * s2;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-c3 * s1 - c1 * c2 * s3;
|
||||
Result[1][1] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[1][2] = s2 * s3;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c1 * s2;
|
||||
Result[2][1] = s1 * s2;
|
||||
Result[2][2] = c2;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXZ
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c3 - c2 * s1 * s3;
|
||||
Result[0][1] = c3 * s1 + c1 * c2 * s3;
|
||||
Result[0][2] = s2 *s3;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-c1 * s3 - c2 * c3 * s1;
|
||||
Result[1][1] = c1 * c2 * c3 - s1 * s3;
|
||||
Result[1][2] = c3 * s2;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = s1 * s2;
|
||||
Result[2][1] =-c1 * s2;
|
||||
Result[2][2] = c2;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleXZY
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c2 * c3;
|
||||
Result[0][1] = s1 * s3 + c1 * c3 * s2;
|
||||
Result[0][2] = c3 * s1 * s2 - c1 * s3;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-s2;
|
||||
Result[1][1] = c1 * c2;
|
||||
Result[1][2] = c2 * s1;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c2 * s3;
|
||||
Result[2][1] = c1 * s2 * s3 - c3 * s1;
|
||||
Result[2][2] = c1 * c3 + s1 * s2 *s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleYZX
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c2;
|
||||
Result[0][1] = s2;
|
||||
Result[0][2] =-c2 * s1;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] = s1 * s3 - c1 * c3 * s2;
|
||||
Result[1][1] = c2 * c3;
|
||||
Result[1][2] = c1 * s3 + c3 * s1 * s2;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c3 * s1 + c1 * s2 * s3;
|
||||
Result[2][1] =-c2 * s3;
|
||||
Result[2][2] = c1 * c3 - s1 * s2 * s3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZYX
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c2;
|
||||
Result[0][1] = c2 * s1;
|
||||
Result[0][2] =-s2;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] = c1 * s2 * s3 - c3 * s1;
|
||||
Result[1][1] = c1 * c3 + s1 * s2 * s3;
|
||||
Result[1][2] = c2 * s3;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = s1 * s3 + c1 * c3 * s2;
|
||||
Result[2][1] = c3 * s1 * s2 - c1 * s3;
|
||||
Result[2][2] = c2 * c3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> eulerAngleZXY
|
||||
(
|
||||
T const & t1,
|
||||
T const & t2,
|
||||
T const & t3
|
||||
)
|
||||
{
|
||||
T c1 = glm::cos(t1);
|
||||
T s1 = glm::sin(t1);
|
||||
T c2 = glm::cos(t2);
|
||||
T s2 = glm::sin(t2);
|
||||
T c3 = glm::cos(t3);
|
||||
T s3 = glm::sin(t3);
|
||||
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = c1 * c3 - s1 * s2 * s3;
|
||||
Result[0][1] = c3 * s1 + c1 * s2 * s3;
|
||||
Result[0][2] =-c2 * s3;
|
||||
Result[0][3] = static_cast<T>(0);
|
||||
Result[1][0] =-c2 * s1;
|
||||
Result[1][1] = c1 * c2;
|
||||
Result[1][2] = s2;
|
||||
Result[1][3] = static_cast<T>(0);
|
||||
Result[2][0] = c1 * s3 + c3 * s1 * s2;
|
||||
Result[2][1] = s1 * s3 - c1 * c3 * s2;
|
||||
Result[2][2] = c2 * c3;
|
||||
Result[2][3] = static_cast<T>(0);
|
||||
Result[3][0] = static_cast<T>(0);
|
||||
Result[3][1] = static_cast<T>(0);
|
||||
Result[3][2] = static_cast<T>(0);
|
||||
Result[3][3] = static_cast<T>(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> yawPitchRoll
|
||||
(
|
||||
T const& yaw,
|
||||
T const& pitch,
|
||||
T const& roll
|
||||
)
|
||||
{
|
||||
T tmp_ch = glm::cos(yaw);
|
||||
@@ -245,7 +616,7 @@ namespace glm
|
||||
T tmp_cb = glm::cos(roll);
|
||||
T tmp_sb = glm::sin(roll);
|
||||
|
||||
tmat4x4<T, defaultp> Result;
|
||||
mat<4, 4, T, defaultp> Result;
|
||||
Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb;
|
||||
Result[0][1] = tmp_sb * tmp_cp;
|
||||
Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb;
|
||||
@@ -265,16 +636,16 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, defaultp> orientate2
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, defaultp> orientate2
|
||||
(
|
||||
T const & angle
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
T c = glm::cos(angle);
|
||||
T s = glm::sin(angle);
|
||||
|
||||
tmat2x2<T, defaultp> Result;
|
||||
mat<2, 2, T, defaultp> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[1][0] = -s;
|
||||
@@ -282,16 +653,16 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, defaultp> orientate3
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, defaultp> orientate3
|
||||
(
|
||||
T const & angle
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
T c = glm::cos(angle);
|
||||
T s = glm::sin(angle);
|
||||
|
||||
tmat3x3<T, defaultp> Result;
|
||||
mat<3, 3, T, defaultp> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[0][2] = 0.0f;
|
||||
@@ -304,38 +675,225 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> orientate3
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orientate3
|
||||
(
|
||||
tvec3<T, P> const & angles
|
||||
vec<3, T, Q> const& angles
|
||||
)
|
||||
{
|
||||
return tmat3x3<T, P>(yawPitchRoll(angles.z, angles.x, angles.y));
|
||||
return mat<3, 3, T, Q>(yawPitchRoll(angles.z, angles.x, angles.y));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> orientate4
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientate4
|
||||
(
|
||||
tvec3<T, P> const & angles
|
||||
vec<3, T, Q> const& angles
|
||||
)
|
||||
{
|
||||
return yawPitchRoll(angles.z, angles.x, angles.y);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXYZ(tmat4x4<T, defaultp> & M,
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL void extractEulerAngleXYZ(mat<4, 4, T, defaultp> const& M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
float T1 = glm::atan2<T, defaultp>(M[2][1], M[2][2]);
|
||||
float C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]);
|
||||
float T2 = glm::atan2<T, defaultp>(-M[2][0], C2);
|
||||
float S1 = glm::sin(T1);
|
||||
float C1 = glm::cos(T1);
|
||||
float T3 = glm::atan2<T, defaultp>(S1*M[0][2] - C1*M[0][1], C1*M[1][1] - S1*M[1][2 ]);
|
||||
T T1 = glm::atan2<T, defaultp>(M[2][1], M[2][2]);
|
||||
T C2 = glm::sqrt(M[0][0]*M[0][0] + M[1][0]*M[1][0]);
|
||||
T T2 = glm::atan2<T, defaultp>(-M[2][0], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(S1*M[0][2] - C1*M[0][1], C1*M[1][1] - S1*M[1][2 ]);
|
||||
t1 = -T1;
|
||||
t2 = -T2;
|
||||
t3 = -T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleYXZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[2][0], M[2][2]);
|
||||
T C2 = glm::sqrt(M[0][1]*M[0][1] + M[1][1]*M[1][1]);
|
||||
T T2 = glm::atan2<T, defaultp>(-M[2][1], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(S1*M[1][2] - C1*M[1][0], C1*M[0][0] - S1*M[0][2]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleXZX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[0][2], M[0][1]);
|
||||
T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[0][0]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(C1*M[1][2] - S1*M[1][1], C1*M[2][2] - S1*M[2][1]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleXYX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[0][1], -M[0][2]);
|
||||
T S2 = glm::sqrt(M[1][0]*M[1][0] + M[2][0]*M[2][0]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[0][0]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(-C1*M[2][1] - S1*M[2][2], C1*M[1][1] + S1*M[1][2]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleYXY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[1][0], M[1][2]);
|
||||
T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[1][1]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(C1*M[2][0] - S1*M[2][2], C1*M[0][0] - S1*M[0][2]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleYZY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[1][2], -M[1][0]);
|
||||
T S2 = glm::sqrt(M[0][1]*M[0][1] + M[2][1]*M[2][1]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[1][1]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(-S1*M[0][0] - C1*M[0][2], S1*M[2][0] + C1*M[2][2]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleZYZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[2][1], M[2][0]);
|
||||
T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[2][2]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(C1*M[0][1] - S1*M[0][0], C1*M[1][1] - S1*M[1][0]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleZXZ(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[2][0], -M[2][1]);
|
||||
T S2 = glm::sqrt(M[0][2]*M[0][2] + M[1][2]*M[1][2]);
|
||||
T T2 = glm::atan2<T, defaultp>(S2, M[2][2]);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(-C1*M[1][0] - S1*M[1][1], C1*M[0][0] + S1*M[0][1]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleXZY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[1][2], M[1][1]);
|
||||
T C2 = glm::sqrt(M[0][0]*M[0][0] + M[2][0]*M[2][0]);
|
||||
T T2 = glm::atan2<T, defaultp>(-M[1][0], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(S1*M[0][1] - C1*M[0][2], C1*M[2][2] - S1*M[2][1]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleYZX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(-M[0][2], M[0][0]);
|
||||
T C2 = glm::sqrt(M[1][1]*M[1][1] + M[2][1]*M[2][1]);
|
||||
T T2 = glm::atan2<T, defaultp>(M[0][1], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(S1*M[1][0] + C1*M[1][2], S1*M[2][0] + C1*M[2][2]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleZYX(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(M[0][1], M[0][0]);
|
||||
T C2 = glm::sqrt(M[1][2]*M[1][2] + M[2][2]*M[2][2]);
|
||||
T T2 = glm::atan2<T, defaultp>(-M[0][2], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(S1*M[2][0] - C1*M[2][1], C1*M[1][1] - S1*M[1][0]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void extractEulerAngleZXY(mat<4, 4, T, defaultp> const & M,
|
||||
T & t1,
|
||||
T & t2,
|
||||
T & t3)
|
||||
{
|
||||
T T1 = glm::atan2<T, defaultp>(-M[1][0], M[1][1]);
|
||||
T C2 = glm::sqrt(M[0][2]*M[0][2] + M[2][2]*M[2][2]);
|
||||
T T2 = glm::atan2<T, defaultp>(M[1][2], C2);
|
||||
T S1 = glm::sin(T1);
|
||||
T C1 = glm::cos(T1);
|
||||
T T3 = glm::atan2<T, defaultp>(C1*M[2][0] + S1*M[2][1], C1*M[0][0] + S1*M[0][1]);
|
||||
t1 = T1;
|
||||
t2 = T2;
|
||||
t3 = T3;
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_extend
|
||||
/// @file glm/gtx/extend.hpp
|
||||
/// @date 2006-01-07 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_extend GLM_GTX_extend
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Extend a position from a source to a position at a defined length.
|
||||
///
|
||||
/// <glm/gtx/extend.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/extend.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Extend a position from a source to a position at a defined length.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_extend is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_extend extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,10 +30,10 @@ namespace glm
|
||||
|
||||
/// Extends of Length the Origin position using the (Source - Origin) direction.
|
||||
/// @see gtx_extend
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType extend(
|
||||
genType const & Origin,
|
||||
genType const & Source,
|
||||
genType const& Origin,
|
||||
genType const& Source,
|
||||
typename genType::value_type const Length);
|
||||
|
||||
/// @}
|
||||
|
||||
@@ -1,76 +1,46 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_extend
|
||||
/// @file glm/gtx/extend.inl
|
||||
/// @date 2006-01-07 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType extend
|
||||
(
|
||||
genType const & Origin,
|
||||
genType const & Source,
|
||||
genType const & Distance
|
||||
genType const& Origin,
|
||||
genType const& Source,
|
||||
genType const& Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec2<T, P> extend
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, T, Q> extend
|
||||
(
|
||||
tvec2<T, P> const & Origin,
|
||||
tvec2<T, P> const & Source,
|
||||
T const & Distance
|
||||
vec<2, T, Q> const& Origin,
|
||||
vec<2, T, Q> const& Source,
|
||||
T const& Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> extend
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> extend
|
||||
(
|
||||
tvec3<T, P> const & Origin,
|
||||
tvec3<T, P> const & Source,
|
||||
T const & Distance
|
||||
vec<3, T, Q> const& Origin,
|
||||
vec<3, T, Q> const& Source,
|
||||
T const& Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> extend
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> extend
|
||||
(
|
||||
tvec4<T, P> const & Origin,
|
||||
tvec4<T, P> const & Source,
|
||||
T const & Distance
|
||||
vec<4, T, Q> const& Origin,
|
||||
vec<4, T, Q> const& Source,
|
||||
T const& Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
|
||||
182
includes/glm/gtx/extended_min_max.hpp
Normal file
182
includes/glm/gtx/extended_min_max.hpp
Normal file
@@ -0,0 +1,182 @@
|
||||
/// @ref gtx_extended_min_max
|
||||
/// @file glm/gtx/extended_min_max.hpp
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_extended_min_max GLM_GTX_extented_min_max
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/extented_min_max.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Min and max functions for 3 to 4 parameters.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_extented_min_max is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_extented_min_max extension included")
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_extended_min_max
|
||||
/// @{
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T min(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z);
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z);
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T min(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z,
|
||||
T const& w);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z,
|
||||
typename C<T>::T const& w);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z,
|
||||
C<T> const& w);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T max(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T max(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z,
|
||||
T const& w);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z,
|
||||
typename C<T>::T const& w);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z,
|
||||
C<T> const& w);
|
||||
|
||||
/// Returns y if y < x; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.
|
||||
///
|
||||
/// @tparam genType Floating-point or integer; scalar or vector types.
|
||||
///
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fmin(genType x, genType y);
|
||||
|
||||
/// Returns y if x < y; otherwise, it returns x. If one of the two arguments is NaN, the value of the other argument is returned.
|
||||
///
|
||||
/// @tparam genType Floating-point; scalar or vector types.
|
||||
///
|
||||
/// @see gtx_extented_min_max
|
||||
/// @see <a href="http://en.cppreference.com/w/cpp/numeric/math/fmax">std::fmax documentation</a>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fmax(genType x, genType y);
|
||||
|
||||
/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see gtx_extented_min_max
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fclamp(genType x, genType minVal, genType maxVal);
|
||||
|
||||
/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.
|
||||
///
|
||||
/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector
|
||||
/// @tparam T Floating-point scalar types
|
||||
/// @tparam Q Value from qualifier enum
|
||||
///
|
||||
/// @see gtx_extented_min_max
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal);
|
||||
|
||||
/// Returns min(max(x, minVal), maxVal) for each component in x. If one of the two arguments is NaN, the value of the other argument is returned.
|
||||
///
|
||||
/// @tparam L Integer between 1 and 4 included that qualify the dimension of the vector
|
||||
/// @tparam T Floating-point scalar types
|
||||
/// @tparam Q Value from qualifier enum
|
||||
///
|
||||
/// @see gtx_extented_min_max
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal);
|
||||
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
#include "extended_min_max.inl"
|
||||
218
includes/glm/gtx/extended_min_max.inl
Normal file
218
includes/glm/gtx/extended_min_max.inl
Normal file
@@ -0,0 +1,218 @@
|
||||
/// @ref gtx_extended_min_max
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T min(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T min
|
||||
(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z,
|
||||
T const& w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z,
|
||||
typename C<T>::T const& w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z,
|
||||
C<T> const& w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T max(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T max
|
||||
(
|
||||
T const& x,
|
||||
T const& y,
|
||||
T const& z,
|
||||
T const& w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const& x,
|
||||
typename C<T>::T const& y,
|
||||
typename C<T>::T const& z,
|
||||
typename C<T>::T const& w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const& x,
|
||||
C<T> const& y,
|
||||
C<T> const& z,
|
||||
C<T> const& w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
// fmin
|
||||
# if GLM_HAS_CXX11_STL
|
||||
using std::fmin;
|
||||
# else
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fmin(genType x, genType y)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fmin' only accept floating-point input");
|
||||
|
||||
if (isnan(x))
|
||||
return y;
|
||||
if (isnan(y))
|
||||
return x;
|
||||
|
||||
return min(x, y);
|
||||
}
|
||||
# endif
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, T b)
|
||||
{
|
||||
return detail::functor2<vec, L, T, Q>::call(fmin, a, vec<L, T, Q>(b));
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmin(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
|
||||
{
|
||||
return detail::functor2<vec, L, T, Q>::call(fmin, a, b);
|
||||
}
|
||||
|
||||
// fmax
|
||||
# if GLM_HAS_CXX11_STL
|
||||
using std::fmax;
|
||||
# else
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fmax(genType x, genType y)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fmax' only accept floating-point input");
|
||||
|
||||
if (isnan(x))
|
||||
return y;
|
||||
if (isnan(y))
|
||||
return x;
|
||||
|
||||
return max(x, y);
|
||||
}
|
||||
# endif
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, T b)
|
||||
{
|
||||
return detail::functor2<vec, L, T, Q>::call(fmax, a, vec<L, T, Q>(b));
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fmax(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
|
||||
{
|
||||
return detail::functor2<vec, L, T, Q>::call(fmax, a, b);
|
||||
}
|
||||
|
||||
// fclamp
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fclamp(genType x, genType minVal, genType maxVal)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fclamp' only accept floating-point or integer inputs");
|
||||
return fmin(fmax(x, minVal), maxVal);
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, T minVal, T maxVal)
|
||||
{
|
||||
return fmin(fmax(x, vec<L, T, Q>(minVal)), vec<L, T, Q>(maxVal));
|
||||
}
|
||||
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fclamp(vec<L, T, Q> const& x, vec<L, T, Q> const& minVal, vec<L, T, Q> const& maxVal)
|
||||
{
|
||||
return fmin(fmax(x, minVal), maxVal);
|
||||
}
|
||||
}//namespace glm
|
||||
@@ -1,162 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_extented_min_max
|
||||
/// @file glm/gtx/extented_min_max.hpp
|
||||
/// @date 2007-03-14 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_extented_min_max GLM_GTX_extented_min_max
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Min and max functions for 3 to 4 parameters.
|
||||
///
|
||||
/// <glm/gtx/extented_min_max.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
# pragma message("GLM: GLM_GTX_extented_min_max extension included")
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_extented_min_max
|
||||
/// @{
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T min(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z);
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z);
|
||||
|
||||
/// Return the minimum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T min(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z,
|
||||
T const & w);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z,
|
||||
typename C<T>::T const & w);
|
||||
|
||||
/// Return the minimum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> min(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z,
|
||||
C<T> const & w);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T max(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z);
|
||||
|
||||
/// Return the maximum component-wise values of 3 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T max(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z,
|
||||
T const & w);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z,
|
||||
typename C<T>::T const & w);
|
||||
|
||||
/// Return the maximum component-wise values of 4 inputs
|
||||
/// @see gtx_extented_min_max
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_DECL C<T> max(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z,
|
||||
C<T> const & w);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
#include "extented_min_max.inl"
|
||||
@@ -1,169 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_extented_min_max
|
||||
/// @file glm/gtx/extented_min_max.inl
|
||||
/// @date 2007-03-14 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T min(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T min
|
||||
(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z,
|
||||
T const & w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z,
|
||||
typename C<T>::T const & w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> min
|
||||
(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z,
|
||||
C<T> const & w
|
||||
)
|
||||
{
|
||||
return glm::min(glm::min(x, y), glm::min(z, w));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T max(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), z);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T max
|
||||
(
|
||||
T const & x,
|
||||
T const & y,
|
||||
T const & z,
|
||||
T const & w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const & x,
|
||||
typename C<T>::T const & y,
|
||||
typename C<T>::T const & z,
|
||||
typename C<T>::T const & w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class C>
|
||||
GLM_FUNC_QUALIFIER C<T> max
|
||||
(
|
||||
C<T> const & x,
|
||||
C<T> const & y,
|
||||
C<T> const & z,
|
||||
C<T> const & w
|
||||
)
|
||||
{
|
||||
return glm::max(glm::max(x, y), glm::max(z, w));
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
41
includes/glm/gtx/exterior_product.hpp
Normal file
41
includes/glm/gtx/exterior_product.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
/// @ref gtx_exterior_product
|
||||
/// @file glm/gtx/exterior_product.hpp
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_exterior_product (dependence)
|
||||
///
|
||||
/// @defgroup gtx_exterior_product GLM_GTX_exterior_product
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/exterior_product.hpp> to use the features of this extension.
|
||||
///
|
||||
/// @brief Allow to perform bit operations on integer values
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
#include "../detail/qualifier.hpp"
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_exterior_product extension included")
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_exterior_product
|
||||
/// @{
|
||||
|
||||
/// Returns the cross product of x and y.
|
||||
///
|
||||
/// @tparam T Floating-point scalar types
|
||||
/// @tparam Q Value from qualifier enum
|
||||
///
|
||||
/// @see <a href="https://en.wikipedia.org/wiki/Exterior_algebra#Cross_and_triple_products">Exterior product</a>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T cross(vec<2, T, Q> const& v, vec<2, T, Q> const& u);
|
||||
|
||||
/// @}
|
||||
} //namespace glm
|
||||
|
||||
#include "exterior_product.inl"
|
||||
26
includes/glm/gtx/exterior_product.inl
Normal file
26
includes/glm/gtx/exterior_product.inl
Normal file
@@ -0,0 +1,26 @@
|
||||
/// @ref gtx_exterior_product
|
||||
|
||||
#include <limits>
|
||||
|
||||
namespace glm {
|
||||
namespace detail
|
||||
{
|
||||
template<typename T, qualifier Q, bool Aligned>
|
||||
struct compute_cross_vec2
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static T call(vec<2, T, Q> const& v, vec<2, T, Q> const& u)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'cross' accepts only floating-point inputs");
|
||||
|
||||
return v.x * u.y - u.x * v.y;
|
||||
}
|
||||
};
|
||||
}//namespace detail
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T cross(vec<2, T, Q> const& x, vec<2, T, Q> const& y)
|
||||
{
|
||||
return detail::compute_cross_vec2<T, Q, detail::is_aligned<Q>::value>::call(x, y);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_exponential
|
||||
/// @file glm/gtx/fast_exponential.hpp
|
||||
/// @date 2006-01-09 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_half_float (dependence)
|
||||
///
|
||||
/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Fast but less accurate implementations of exponential based functions.
|
||||
///
|
||||
/// <glm/gtx/fast_exponential.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/fast_exponential.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Fast but less accurate implementations of exponential based functions.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_fast_exponential is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_fast_exponential extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,63 +31,63 @@ namespace glm
|
||||
|
||||
/// Faster than the common pow function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastPow(genType x, genType y);
|
||||
|
||||
/// Faster than the common pow function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastPow(vecType<T, P> const & x, vecType<T, P> const & y);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y);
|
||||
|
||||
/// Faster than the common pow function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename genTypeT, typename genTypeU>
|
||||
template<typename genTypeT, typename genTypeU>
|
||||
GLM_FUNC_DECL genTypeT fastPow(genTypeT x, genTypeU y);
|
||||
|
||||
/// Faster than the common pow function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastPow(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastPow(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common exp function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastExp(T x);
|
||||
|
||||
/// Faster than the common exp function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastExp(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastExp(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common log function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastLog(T x);
|
||||
|
||||
/// Faster than the common exp2 function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastLog(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastLog(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common exp2 function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastExp2(T x);
|
||||
|
||||
/// Faster than the common exp2 function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastExp2(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastExp2(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common log2 function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastLog2(T x);
|
||||
|
||||
/// Faster than the common log2 function but less accurate.
|
||||
/// @see gtx_fast_exponential
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastLog2(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastLog2(vec<L, T, Q> const& x);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,51 +1,21 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_exponential
|
||||
/// @file glm/gtx/fast_exponential.inl
|
||||
/// @date 2006-01-09 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// fastPow:
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastPow(genType x, genType y)
|
||||
{
|
||||
return exp(y * log(x));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastPow(vecType<T, P> const & x, vecType<T, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
|
||||
{
|
||||
return exp(y * log(x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastPow(T x, int y)
|
||||
{
|
||||
T f = static_cast<T>(1);
|
||||
@@ -54,18 +24,18 @@ namespace glm
|
||||
return f;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastPow(vecType<T, P> const & x, vecType<int, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastPow(vec<L, T, Q> const& x, vec<L, int, Q> const& y)
|
||||
{
|
||||
vecType<T, P> Result(uninitialize);
|
||||
for(detail::component_count_t i = 0; i < detail::component_count(x); ++i)
|
||||
vec<L, T, Q> Result;
|
||||
for(length_t i = 0, n = x.length(); i < n; ++i)
|
||||
Result[i] = fastPow(x[i], y[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
// fastExp
|
||||
// Note: This function provides accurate results only for value between -1 and 1, else avoid it.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastExp(T x)
|
||||
{
|
||||
// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.
|
||||
@@ -110,14 +80,14 @@ namespace glm
|
||||
}
|
||||
*/
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastExp(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastExp(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastExp, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastExp, x);
|
||||
}
|
||||
|
||||
// fastLog
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLog(genType x)
|
||||
{
|
||||
return std::log(x);
|
||||
@@ -132,35 +102,35 @@ namespace glm
|
||||
}
|
||||
*/
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastLog(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastLog(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastLog, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastLog, x);
|
||||
}
|
||||
|
||||
//fastExp2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastExp2(genType x)
|
||||
{
|
||||
return fastExp(0.69314718055994530941723212145818f * x);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastExp2(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastExp2(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastExp2, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastExp2, x);
|
||||
}
|
||||
|
||||
// fastLog2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLog2(genType x)
|
||||
{
|
||||
return fastLog(x) / 0.69314718055994530941723212145818f;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastLog2(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastLog2(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastLog2, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastLog2, x);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,45 +1,16 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_square_root
|
||||
/// @file glm/gtx/fast_square_root.hpp
|
||||
/// @date 2006-01-04 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Fast but less accurate implementations of square root based functions.
|
||||
/// - Sqrt optimisation based on Newton's method,
|
||||
///
|
||||
/// Include <glm/gtx/fast_square_root.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Fast but less accurate implementations of square root based functions.
|
||||
/// - Sqrt optimisation based on Newton's method,
|
||||
/// www.gamedev.net/community/forums/topic.asp?topic id=139956
|
||||
///
|
||||
/// <glm/gtx/fast_square_root.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -48,7 +19,11 @@
|
||||
#include "../exponential.hpp"
|
||||
#include "../geometric.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_fast_square_root is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_fast_square_root extension included")
|
||||
#endif
|
||||
|
||||
@@ -60,56 +35,56 @@ namespace glm
|
||||
/// Faster than the common sqrt function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastSqrt(genType x);
|
||||
|
||||
/// Faster than the common sqrt function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastSqrt(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common inversesqrt function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastInverseSqrt(genType x);
|
||||
|
||||
/// Faster than the common inversesqrt function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> fastInverseSqrt(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common length function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastLength(genType x);
|
||||
|
||||
/// Faster than the common length function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL T fastLength(vecType<T, P> const & x);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T fastLength(vec<L, T, Q> const& x);
|
||||
|
||||
/// Faster than the common distance function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastDistance(genType x, genType y);
|
||||
|
||||
/// Faster than the common distance function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL T fastDistance(vecType<T, P> const & x, vecType<T, P> const & y);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y);
|
||||
|
||||
/// Faster than the common normalize function but less accurate.
|
||||
///
|
||||
/// @see gtx_fast_square_root extension.
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType fastNormalize(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType fastNormalize(genType const& x);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
||||
@@ -1,39 +1,9 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_square_root
|
||||
/// @file glm/gtx/fast_square_root.inl
|
||||
/// @date 2006-01-04 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// fastSqrt
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastSqrt(genType x)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fastSqrt' only accept floating-point input");
|
||||
@@ -41,32 +11,32 @@ namespace glm
|
||||
return genType(1) / fastInverseSqrt(x);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastSqrt(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastSqrt(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastSqrt, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastSqrt, x);
|
||||
}
|
||||
|
||||
// fastInversesqrt
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastInverseSqrt(genType x)
|
||||
{
|
||||
# ifdef __CUDACC__ // Wordaround for a CUDA compiler bug up to CUDA6
|
||||
tvec1<T, P> tmp(detail::compute_inversesqrt<tvec1, genType, lowp>::call(tvec1<genType, lowp>(x)));
|
||||
vec<1, T, Q> tmp(detail::compute_inversesqrt<tvec1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x)));
|
||||
return tmp.x;
|
||||
# else
|
||||
return detail::compute_inversesqrt<tvec1, genType, lowp>::call(tvec1<genType, lowp>(x)).x;
|
||||
return detail::compute_inversesqrt<1, genType, lowp, detail::is_aligned<lowp>::value>::call(vec<1, genType, lowp>(x)).x;
|
||||
# endif
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastInverseSqrt(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastInverseSqrt(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::compute_inversesqrt<vecType, T, P>::call(x);
|
||||
return detail::compute_inversesqrt<L, T, Q, detail::is_aligned<Q>::value>::call(x);
|
||||
}
|
||||
|
||||
// fastLength
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLength(genType x)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'fastLength' only accept floating-point inputs");
|
||||
@@ -74,8 +44,8 @@ namespace glm
|
||||
return abs(x);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T fastLength(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T fastLength(vec<L, T, Q> const& x)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'fastLength' only accept floating-point inputs");
|
||||
|
||||
@@ -83,27 +53,27 @@ namespace glm
|
||||
}
|
||||
|
||||
// fastDistance
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastDistance(genType x, genType y)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T fastDistance(vecType<T, P> const & x, vecType<T, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T fastDistance(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
// fastNormalize
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastNormalize(genType x)
|
||||
{
|
||||
return x > genType(0) ? genType(1) : -genType(1);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastNormalize(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastNormalize(vec<L, T, Q> const& x)
|
||||
{
|
||||
return x * fastInverseSqrt(dot(x, x));
|
||||
}
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_trigonometry
|
||||
/// @file glm/gtx/fast_trigonometry.hpp
|
||||
/// @date 2006-01-08 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Fast but less accurate implementations of trigonometric functions.
|
||||
///
|
||||
/// <glm/gtx/fast_trigonometry.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/fast_trigonometry.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Fast but less accurate implementations of trigonometric functions.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../gtc/constants.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_fast_trigonometry is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_fast_trigonometry extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,47 +30,47 @@ namespace glm
|
||||
|
||||
/// Wrap an angle to [0 2pi[
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T wrapAngle(T angle);
|
||||
|
||||
/// Faster than the common sin function but less accurate.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastSin(T angle);
|
||||
|
||||
/// Faster than the common cos function but less accurate.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastCos(T angle);
|
||||
|
||||
/// Faster than the common tan function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T fastTan(T angle);
|
||||
|
||||
/// Faster than the common asin function but less accurate.
|
||||
/// Faster than the common tan function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastTan(T angle);
|
||||
|
||||
/// Faster than the common asin function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastAsin(T angle);
|
||||
|
||||
/// Faster than the common acos function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// Faster than the common acos function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastAcos(T angle);
|
||||
|
||||
/// Faster than the common atan function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T fastAtan(T y, T x);
|
||||
|
||||
/// Faster than the common atan function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastAtan(T y, T x);
|
||||
|
||||
/// Faster than the common atan function but less accurate.
|
||||
/// Defined between -2pi and 2pi.
|
||||
/// From GLM_GTX_fast_trigonometry extension.
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T fastAtan(T angle);
|
||||
|
||||
/// @}
|
||||
|
||||
@@ -1,77 +1,47 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_fast_trigonometry
|
||||
/// @file glm/gtx/fast_trigonometry.inl
|
||||
/// @date 2006-01-08 / 2014-11-25
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
{
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> taylorCos(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> taylorCos(vec<L, T, Q> const& x)
|
||||
{
|
||||
return static_cast<T>(1)
|
||||
- (x * x) / 2.f
|
||||
+ (x * x * x * x) / 24.f
|
||||
- (x * x * x * x * x * x) / 720.f
|
||||
+ (x * x * x * x * x * x * x * x) / 40320.f;
|
||||
- (x * x) * (1.f / 2.f)
|
||||
+ ((x * x) * (x * x)) * (1.f / 24.f)
|
||||
- (((x * x) * (x * x)) * (x * x)) * (1.f / 720.f)
|
||||
+ (((x * x) * (x * x)) * ((x * x) * (x * x))) * (1.f / 40320.f);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T cos_52s(T x)
|
||||
{
|
||||
T const xx(x * x);
|
||||
return (T(0.9999932946) + xx * (T(-0.4999124376) + xx * (T(0.0414877472) + xx * T(-0.0012712095))));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> cos_52s(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> cos_52s(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(cos_52s, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(cos_52s, x);
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
// wrapAngle
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T wrapAngle(T angle)
|
||||
{
|
||||
return abs<T>(mod<T>(angle, two_pi<T>()));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> wrapAngle(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> wrapAngle(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(wrapAngle, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(wrapAngle, x);
|
||||
}
|
||||
|
||||
// cos
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastCos(T x)
|
||||
{
|
||||
T const angle(wrapAngle<T>(x));
|
||||
@@ -86,87 +56,87 @@ namespace detail
|
||||
return detail::cos_52s(two_pi<T>() - angle);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastCos(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastCos(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastCos, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastCos, x);
|
||||
}
|
||||
|
||||
// sin
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastSin(T x)
|
||||
{
|
||||
return fastCos<T>(half_pi<T>() - x);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastSin(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastSin(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastSin, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastSin, x);
|
||||
}
|
||||
|
||||
// tan
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastTan(T x)
|
||||
{
|
||||
return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastTan(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastTan(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastTan, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastTan, x);
|
||||
}
|
||||
|
||||
// asin
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAsin(T x)
|
||||
{
|
||||
return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastAsin(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastAsin(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastAsin, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastAsin, x);
|
||||
}
|
||||
|
||||
// acos
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAcos(T x)
|
||||
{
|
||||
return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2)
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastAcos(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastAcos(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastAcos, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastAcos, x);
|
||||
}
|
||||
|
||||
// atan
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(T y, T x)
|
||||
{
|
||||
T sgn = sign(y) * sign(x);
|
||||
return abs(fastAtan(y / x)) * sgn;
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastAtan(vecType<T, P> const & y, vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& y, vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor2<T, P, vecType>::call(fastAtan, y, x);
|
||||
return detail::functor2<vec, L, T, Q>::call(fastAtan, y, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(T x)
|
||||
{
|
||||
return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> fastAtan(vecType<T, P> const & x)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> fastAtan(vec<L, T, Q> const& x)
|
||||
{
|
||||
return detail::functor1<T, T, P, vecType>::call(fastAtan, x);
|
||||
return detail::functor1<vec, L, T, T, Q>::call(fastAtan, x);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
13
includes/glm/gtx/float_notmalize.inl
Normal file
13
includes/glm/gtx/float_notmalize.inl
Normal file
@@ -0,0 +1,13 @@
|
||||
/// @ref gtx_float_normalize
|
||||
|
||||
#include <limits>
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, float, Q> floatNormalize(vec<L, T, Q> const& v)
|
||||
{
|
||||
return vec<L, float, Q>(v) / static_cast<float>(std::numeric_limits<T>::max());
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
52
includes/glm/gtx/functions.hpp
Normal file
52
includes/glm/gtx/functions.hpp
Normal file
@@ -0,0 +1,52 @@
|
||||
/// @ref gtx_functions
|
||||
/// @file glm/gtx/functions.hpp
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_quaternion (dependence)
|
||||
///
|
||||
/// @defgroup gtx_functions GLM_GTX_functions
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/functions.hpp> to use the features of this extension.
|
||||
///
|
||||
/// List of useful common functions.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
#include "../detail/qualifier.hpp"
|
||||
#include "../detail/type_vec2.hpp"
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_functions extension included")
|
||||
#endif
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_functions
|
||||
/// @{
|
||||
|
||||
/// 1D gauss function
|
||||
///
|
||||
/// @see gtc_epsilon
|
||||
template<typename T>
|
||||
GLM_FUNC_DECL T gauss(
|
||||
T x,
|
||||
T ExpectedValue,
|
||||
T StandardDeviation);
|
||||
|
||||
/// 2D gauss function
|
||||
///
|
||||
/// @see gtc_epsilon
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T gauss(
|
||||
vec<2, T, Q> const& Coord,
|
||||
vec<2, T, Q> const& ExpectedValue,
|
||||
vec<2, T, Q> const& StandardDeviation);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
#include "functions.inl"
|
||||
|
||||
30
includes/glm/gtx/functions.inl
Normal file
30
includes/glm/gtx/functions.inl
Normal file
@@ -0,0 +1,30 @@
|
||||
/// @ref gtx_functions
|
||||
|
||||
#include "../exponential.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T gauss
|
||||
(
|
||||
T x,
|
||||
T ExpectedValue,
|
||||
T StandardDeviation
|
||||
)
|
||||
{
|
||||
return exp(-((x - ExpectedValue) * (x - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation)) / (StandardDeviation * sqrt(static_cast<T>(6.28318530717958647692528676655900576)));
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T gauss
|
||||
(
|
||||
vec<2, T, Q> const& Coord,
|
||||
vec<2, T, Q> const& ExpectedValue,
|
||||
vec<2, T, Q> const& StandardDeviation
|
||||
)
|
||||
{
|
||||
vec<2, T, Q> const Squared = ((Coord - ExpectedValue) * (Coord - ExpectedValue)) / (static_cast<T>(2) * StandardDeviation * StandardDeviation);
|
||||
return exp(-(Squared.x + Squared.y));
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,43 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_gradient_paint
|
||||
/// @file glm/gtx/gradient_paint.hpp
|
||||
/// @date 2009-03-06 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_optimum_pow (dependence)
|
||||
///
|
||||
/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Functions that return the color of procedural gradient for specific coordinates.
|
||||
/// <glm/gtx/gradient_paint.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/gradient_paint.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Functions that return the color of procedural gradient for specific coordinates.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -45,7 +17,11 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtx/optimum_pow.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_gradient_paint is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_gradient_paint extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,20 +32,20 @@ namespace glm
|
||||
|
||||
/// Return a color from a radial gradient.
|
||||
/// @see - gtx_gradient_paint
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T radialGradient(
|
||||
tvec2<T, P> const & Center,
|
||||
T const & Radius,
|
||||
tvec2<T, P> const & Focal,
|
||||
tvec2<T, P> const & Position);
|
||||
vec<2, T, Q> const& Center,
|
||||
T const& Radius,
|
||||
vec<2, T, Q> const& Focal,
|
||||
vec<2, T, Q> const& Position);
|
||||
|
||||
/// Return a color from a linear gradient.
|
||||
/// @see - gtx_gradient_paint
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T linearGradient(
|
||||
tvec2<T, P> const & Point0,
|
||||
tvec2<T, P> const & Point1,
|
||||
tvec2<T, P> const & Position);
|
||||
vec<2, T, Q> const& Point0,
|
||||
vec<2, T, Q> const& Point1,
|
||||
vec<2, T, Q> const& Position);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
||||
@@ -1,48 +1,18 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_gradient_paint
|
||||
/// @file glm/gtx/gradient_paint.inl
|
||||
/// @date 2009-03-06 / 2013-04-09
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T radialGradient
|
||||
(
|
||||
tvec2<T, P> const & Center,
|
||||
T const & Radius,
|
||||
tvec2<T, P> const & Focal,
|
||||
tvec2<T, P> const & Position
|
||||
vec<2, T, Q> const& Center,
|
||||
T const& Radius,
|
||||
vec<2, T, Q> const& Focal,
|
||||
vec<2, T, Q> const& Position
|
||||
)
|
||||
{
|
||||
tvec2<T, P> F = Focal - Center;
|
||||
tvec2<T, P> D = Position - Focal;
|
||||
vec<2, T, Q> F = Focal - Center;
|
||||
vec<2, T, Q> D = Position - Focal;
|
||||
T Radius2 = pow2(Radius);
|
||||
T Fx2 = pow2(F.x);
|
||||
T Fy2 = pow2(F.y);
|
||||
@@ -52,15 +22,15 @@ namespace glm
|
||||
return Numerator / Denominator;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T linearGradient
|
||||
(
|
||||
tvec2<T, P> const & Point0,
|
||||
tvec2<T, P> const & Point1,
|
||||
tvec2<T, P> const & Position
|
||||
vec<2, T, Q> const& Point0,
|
||||
vec<2, T, Q> const& Point1,
|
||||
vec<2, T, Q> const& Position
|
||||
)
|
||||
{
|
||||
tvec2<T, P> Dist = Point1 - Point0;
|
||||
vec<2, T, Q> Dist = Point1 - Point0;
|
||||
return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_handed_coordinate_space
|
||||
/// @file glm/gtx/handed_coordinate_space.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief To know if a set of three basis vectors defines a right or left-handed coordinate system.
|
||||
///
|
||||
/// <glm/gtx/handed_coordinate_system.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/handed_coordinate_system.hpp> to use the features of this extension.
|
||||
///
|
||||
/// To know if a set of three basis vectors defines a right or left-handed coordinate system.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_handed_coordinate_space is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_handed_coordinate_space extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,19 +30,19 @@ namespace glm
|
||||
|
||||
//! Return if a trihedron right handed or not.
|
||||
//! From GLM_GTX_handed_coordinate_space extension.
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool rightHanded(
|
||||
tvec3<T, P> const & tangent,
|
||||
tvec3<T, P> const & binormal,
|
||||
tvec3<T, P> const & normal);
|
||||
vec<3, T, Q> const& tangent,
|
||||
vec<3, T, Q> const& binormal,
|
||||
vec<3, T, Q> const& normal);
|
||||
|
||||
//! Return if a trihedron left handed or not.
|
||||
//! From GLM_GTX_handed_coordinate_space extension.
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool leftHanded(
|
||||
tvec3<T, P> const & tangent,
|
||||
tvec3<T, P> const & binormal,
|
||||
tvec3<T, P> const & normal);
|
||||
vec<3, T, Q> const& tangent,
|
||||
vec<3, T, Q> const& binormal,
|
||||
vec<3, T, Q> const& normal);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
||||
@@ -1,54 +1,24 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_handed_coordinate_space
|
||||
/// @file glm/gtx/handed_coordinate_space.inl
|
||||
/// @date 2005-12-21 / 2009-02-19
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool rightHanded
|
||||
(
|
||||
tvec3<T, P> const & tangent,
|
||||
tvec3<T, P> const & binormal,
|
||||
tvec3<T, P> const & normal
|
||||
vec<3, T, Q> const& tangent,
|
||||
vec<3, T, Q> const& binormal,
|
||||
vec<3, T, Q> const& normal
|
||||
)
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) > T(0);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool leftHanded
|
||||
(
|
||||
tvec3<T, P> const & tangent,
|
||||
tvec3<T, P> const & binormal,
|
||||
tvec3<T, P> const & normal
|
||||
vec<3, T, Q> const& tangent,
|
||||
vec<3, T, Q> const& binormal,
|
||||
vec<3, T, Q> const& normal
|
||||
)
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) < T(0);
|
||||
|
||||
@@ -1,46 +1,21 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_hash
|
||||
/// @file glm/gtx/hash.hpp
|
||||
/// @date 2015-03-07 / 2015-03-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_hash GLM_GTX_hash
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Add std::hash support for glm types
|
||||
///
|
||||
/// <glm/gtx/hash.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/hash.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Add std::hash support for glm types
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_hash is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include "../vec2.hpp"
|
||||
@@ -69,94 +44,94 @@
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tvec1<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::vec<1, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tvec1<T, P> const & v) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::vec<1, T, Q> const& v) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tvec2<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::vec<2, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tvec2<T, P> const & v) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::vec<2, T, Q> const& v) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tvec3<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::vec<3, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tvec3<T, P> const & v) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::vec<3, T, Q> const& v) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tvec4<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::vec<4, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tvec4<T, P> const & v) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::vec<4, T, Q> const& v) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tquat<T,P>>
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::tquat<T,Q>>
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tquat<T, P> const & q) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::tquat<T, Q> const& q) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tdualquat<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::tdualquat<T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tdualquat<T,P> const & q) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::tdualquat<T,Q> const& q) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat2x2<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<2, 2, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat2x2<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat2x3<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<2, 3, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat2x3<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat2x4<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<2, 4, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat2x4<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat3x2<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<3, 2, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat3x2<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat3x3<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<3, 3, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat3x3<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat3x4<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<3, 4, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat3x4<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat4x2<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<4, 2, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat4x2<T,P> const & m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat4x3<T,P> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat4x3<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
struct hash<glm::tmat4x4<T,P> >
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<4, 3, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::tmat4x4<T,P> const & m) const;
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const;
|
||||
};
|
||||
|
||||
template<typename T, glm::qualifier Q>
|
||||
struct hash<glm::mat<4, 4, T,Q> >
|
||||
{
|
||||
GLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const;
|
||||
};
|
||||
} // namespace std
|
||||
|
||||
|
||||
@@ -1,43 +1,13 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_hash
|
||||
/// @file glm/gtx/hash.inl
|
||||
/// @date 2015-03-07 / 2015-03-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_hash GLM_GTX_hash
|
||||
/// @ingroup gtx
|
||||
///
|
||||
///
|
||||
/// @brief Add std::hash support for glm types
|
||||
///
|
||||
/// <glm/gtx/hash.inl> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// <glm/gtx/hash.inl> need to be included to use the features of this extension.
|
||||
|
||||
namespace glm {
|
||||
namespace detail
|
||||
@@ -51,15 +21,15 @@ namespace detail
|
||||
|
||||
namespace std
|
||||
{
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tvec1<T, P>>::operator()(glm::tvec1<T, P> const & v) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::vec<1, T, Q>>::operator()(glm::vec<1, T, Q> const& v) const
|
||||
{
|
||||
hash<T> hasher;
|
||||
return hasher(v.x);
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tvec2<T, P>>::operator()(glm::tvec2<T, P> const & v) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::vec<2, T, Q>>::operator()(glm::vec<2, T, Q> const& v) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<T> hasher;
|
||||
@@ -68,8 +38,8 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tvec3<T, P>>::operator()(glm::tvec3<T, P> const & v) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::vec<3, T, Q>>::operator()(glm::vec<3, T, Q> const& v) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<T> hasher;
|
||||
@@ -79,8 +49,8 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tvec4<T, P>>::operator()(glm::tvec4<T, P> const & v) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::vec<4, T, Q>>::operator()(glm::vec<4, T, Q> const& v) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<T> hasher;
|
||||
@@ -91,8 +61,8 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, P>>::operator()(glm::tquat<T,P> const & q) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, Q>>::operator()(glm::tquat<T,Q> const& q) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<T> hasher;
|
||||
@@ -103,84 +73,84 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, P>>::operator()(glm::tdualquat<T, P> const & q) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, Q>>::operator()(glm::tdualquat<T, Q> const& q) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tquat<T, P>> hasher;
|
||||
hash<glm::tquat<T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(q.real));
|
||||
glm::detail::hash_combine(seed, hasher(q.dual));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x2<T, P>>::operator()(glm::tmat2x2<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 2, T, Q>>::operator()(glm::mat<2, 2, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec2<T, P>> hasher;
|
||||
hash<glm::vec<2, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x3<T, P>>::operator()(glm::tmat2x3<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 3, T, Q>>::operator()(glm::mat<2, 3, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec3<T, P>> hasher;
|
||||
hash<glm::vec<3, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat2x4<T, P>>::operator()(glm::tmat2x4<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 4, T, Q>>::operator()(glm::mat<2, 4, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec4<T, P>> hasher;
|
||||
hash<glm::vec<4, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x2<T, P>>::operator()(glm::tmat3x2<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 2, T, Q>>::operator()(glm::mat<3, 2, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec2<T, P>> hasher;
|
||||
hash<glm::vec<2, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x3<T, P>>::operator()(glm::tmat3x3<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 3, T, Q>>::operator()(glm::mat<3, 3, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec3<T, P>> hasher;
|
||||
hash<glm::vec<3, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat3x4<T, P>>::operator()(glm::tmat3x4<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 4, T, Q>>::operator()(glm::mat<3, 4, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec4<T, P>> hasher;
|
||||
hash<glm::vec<4, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x2<T,P>>::operator()(glm::tmat4x2<T,P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 2, T,Q>>::operator()(glm::mat<4, 2, T,Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec2<T, P>> hasher;
|
||||
hash<glm::vec<2, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
@@ -188,11 +158,11 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x3<T,P>>::operator()(glm::tmat4x3<T,P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 3, T,Q>>::operator()(glm::mat<4, 3, T,Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec3<T, P>> hasher;
|
||||
hash<glm::vec<3, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
@@ -200,11 +170,11 @@ namespace std
|
||||
return seed;
|
||||
}
|
||||
|
||||
template <typename T, glm::precision P>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::tmat4x4<T,P>>::operator()(glm::tmat4x4<T, P> const & m) const
|
||||
template<typename T, glm::qualifier Q>
|
||||
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 4, T,Q>>::operator()(glm::mat<4, 4, T, Q> const& m) const
|
||||
{
|
||||
size_t seed = 0;
|
||||
hash<glm::tvec4<T, P>> hasher;
|
||||
hash<glm::vec<4, T, Q>> hasher;
|
||||
glm::detail::hash_combine(seed, hasher(m[0]));
|
||||
glm::detail::hash_combine(seed, hasher(m[1]));
|
||||
glm::detail::hash_combine(seed, hasher(m[2]));
|
||||
|
||||
@@ -1,43 +1,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_integer
|
||||
/// @file glm/gtx/integer.hpp
|
||||
/// @date 2005-12-24 / 2011-10-13
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_integer GLM_GTX_integer
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Add support for integer for core functions
|
||||
///
|
||||
/// <glm/gtx/integer.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/integer.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Add support for integer for core functions
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -45,7 +16,11 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtc/integer.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_integer is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_integer extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,9 +29,9 @@ namespace glm
|
||||
/// @addtogroup gtx_integer
|
||||
/// @{
|
||||
|
||||
//! Returns x raised to the y power.
|
||||
//! Returns x raised to the y power.
|
||||
//! From GLM_GTX_integer extension.
|
||||
GLM_FUNC_DECL int pow(int x, int y);
|
||||
GLM_FUNC_DECL int pow(int x, uint y);
|
||||
|
||||
//! Returns the positive square root of x.
|
||||
//! From GLM_GTX_integer extension.
|
||||
@@ -72,10 +47,10 @@ namespace glm
|
||||
|
||||
//! Return the factorial value of a number (!12 max, integer only)
|
||||
//! From GLM_GTX_integer extension.
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType factorial(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType factorial(genType const& x);
|
||||
|
||||
//! 32bit signed integer.
|
||||
//! 32bit signed integer.
|
||||
//! From GLM_GTX_integer extension.
|
||||
typedef signed int sint;
|
||||
|
||||
@@ -83,7 +58,7 @@ namespace glm
|
||||
//! From GLM_GTX_integer extension.
|
||||
GLM_FUNC_DECL uint pow(uint x, uint y);
|
||||
|
||||
//! Returns the positive square root of x.
|
||||
//! Returns the positive square root of x.
|
||||
//! From GLM_GTX_integer extension.
|
||||
GLM_FUNC_DECL uint sqrt(uint x);
|
||||
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_integer
|
||||
/// @file glm/gtx/integer.inl
|
||||
/// @date 2005-12-24 / 2011-10-13
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// pow
|
||||
GLM_FUNC_QUALIFIER int pow(int x, int y)
|
||||
GLM_FUNC_QUALIFIER int pow(int x, uint y)
|
||||
{
|
||||
if(y == 0)
|
||||
return 1;
|
||||
return x >= 0 ? 1 : -1;
|
||||
|
||||
int result = x;
|
||||
for(int i = 1; i < y; ++i)
|
||||
for(uint i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
@@ -94,12 +65,12 @@ namespace detail
|
||||
// mod
|
||||
GLM_FUNC_QUALIFIER int mod(int x, int y)
|
||||
{
|
||||
return x - y * (x / y);
|
||||
return ((x % y) + y) % y;
|
||||
}
|
||||
|
||||
// factorial (!12 max, integer only)
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType factorial(genType const & x)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType factorial(genType const& x)
|
||||
{
|
||||
genType Temp = x;
|
||||
genType Result;
|
||||
@@ -108,30 +79,30 @@ namespace detail
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec2<T, P> factorial(
|
||||
tvec2<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, T, Q> factorial(
|
||||
vec<2, T, Q> const& x)
|
||||
{
|
||||
return tvec2<T, P>(
|
||||
return vec<2, T, Q>(
|
||||
factorial(x.x),
|
||||
factorial(x.y));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> factorial(
|
||||
tvec3<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> factorial(
|
||||
vec<3, T, Q> const& x)
|
||||
{
|
||||
return tvec3<T, P>(
|
||||
return vec<3, T, Q>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> factorial(
|
||||
tvec4<T, P> const & x)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> factorial(
|
||||
vec<4, T, Q> const& x)
|
||||
{
|
||||
return tvec4<T, P>(
|
||||
return vec<4, T, Q>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z),
|
||||
@@ -140,6 +111,9 @@ namespace detail
|
||||
|
||||
GLM_FUNC_QUALIFIER uint pow(uint x, uint y)
|
||||
{
|
||||
if (y == 0)
|
||||
return 1u;
|
||||
|
||||
uint result = x;
|
||||
for(uint i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
@@ -169,7 +143,7 @@ namespace detail
|
||||
|
||||
#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))
|
||||
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
return 31u - findMSB(x);
|
||||
}
|
||||
@@ -177,7 +151,7 @@ namespace detail
|
||||
#else
|
||||
|
||||
// Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
int y, m, n;
|
||||
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_intersect
|
||||
/// @file glm/gtx/intersect.hpp
|
||||
/// @date 2007-04-03 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_closest_point (dependence)
|
||||
///
|
||||
/// @defgroup gtx_intersect GLM_GTX_intersect
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Add intersection functions
|
||||
///
|
||||
/// <glm/gtx/intersect.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/intersect.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Add intersection functions
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -50,7 +21,11 @@
|
||||
#include "../gtx/closest_point.hpp"
|
||||
#include "../gtx/vector_query.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_closest_point is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_closest_point extension included")
|
||||
#endif
|
||||
|
||||
@@ -62,52 +37,53 @@ namespace glm
|
||||
//! Compute the intersection of a ray and a plane.
|
||||
//! Ray direction and plane normal must be unit length.
|
||||
//! From GLM_GTX_intersect extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL bool intersectRayPlane(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & planeOrig, genType const & planeNormal,
|
||||
genType const& orig, genType const& dir,
|
||||
genType const& planeOrig, genType const& planeNormal,
|
||||
typename genType::value_type & intersectionDistance);
|
||||
|
||||
//! Compute the intersection of a ray and a triangle.
|
||||
/// Based om Tomas Möller implementation http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/raytri/
|
||||
//! From GLM_GTX_intersect extension.
|
||||
template <typename genType>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool intersectRayTriangle(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & vert0, genType const & vert1, genType const & vert2,
|
||||
genType & baryPosition);
|
||||
vec<3, T, Q> const& orig, vec<3, T, Q> const& dir,
|
||||
vec<3, T, Q> const& v0, vec<3, T, Q> const& v1, vec<3, T, Q> const& v2,
|
||||
vec<2, T, Q>& baryPosition, T& distance);
|
||||
|
||||
//! Compute the intersection of a line and a triangle.
|
||||
//! From GLM_GTX_intersect extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL bool intersectLineTriangle(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & vert0, genType const & vert1, genType const & vert2,
|
||||
genType const& orig, genType const& dir,
|
||||
genType const& vert0, genType const& vert1, genType const& vert2,
|
||||
genType & position);
|
||||
|
||||
//! Compute the intersection distance of a ray and a sphere.
|
||||
//! Compute the intersection distance of a ray and a sphere.
|
||||
//! The ray direction vector is unit length.
|
||||
//! From GLM_GTX_intersect extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL bool intersectRaySphere(
|
||||
genType const & rayStarting, genType const & rayNormalizedDirection,
|
||||
genType const & sphereCenter, typename genType::value_type const sphereRadiusSquered,
|
||||
genType const& rayStarting, genType const& rayNormalizedDirection,
|
||||
genType const& sphereCenter, typename genType::value_type const sphereRadiusSquered,
|
||||
typename genType::value_type & intersectionDistance);
|
||||
|
||||
//! Compute the intersection of a ray and a sphere.
|
||||
//! From GLM_GTX_intersect extension.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL bool intersectRaySphere(
|
||||
genType const & rayStarting, genType const & rayNormalizedDirection,
|
||||
genType const & sphereCenter, const typename genType::value_type sphereRadius,
|
||||
genType const& rayStarting, genType const& rayNormalizedDirection,
|
||||
genType const& sphereCenter, const typename genType::value_type sphereRadius,
|
||||
genType & intersectionPosition, genType & intersectionNormal);
|
||||
|
||||
//! Compute the intersection of a line and a sphere.
|
||||
//! From GLM_GTX_intersect extension
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL bool intersectLineSphere(
|
||||
genType const & point0, genType const & point1,
|
||||
genType const & sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & intersectionPosition1, genType & intersectionNormal1,
|
||||
genType const& point0, genType const& point1,
|
||||
genType const& sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & intersectionPosition1, genType & intersectionNormal1,
|
||||
genType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType());
|
||||
|
||||
/// @}
|
||||
|
||||
@@ -1,26 +1,19 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Created : 2007-04-03
|
||||
// Updated : 2009-01-20
|
||||
// Licence : This source is under MIT licence
|
||||
// File : glm/gtx/intersect.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// @ref gtx_intersect
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRayPlane
|
||||
(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & planeOrig, genType const & planeNormal,
|
||||
genType const& orig, genType const& dir,
|
||||
genType const& planeOrig, genType const& planeNormal,
|
||||
typename genType::value_type & intersectionDistance
|
||||
)
|
||||
{
|
||||
typename genType::value_type d = glm::dot(dir, planeNormal);
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
|
||||
if(d < Epsilon)
|
||||
if(d < -Epsilon)
|
||||
{
|
||||
intersectionDistance = glm::dot(planeOrig - orig, planeNormal) / d;
|
||||
return true;
|
||||
@@ -29,88 +22,79 @@ namespace glm
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool intersectRayTriangle
|
||||
(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & v0, genType const & v1, genType const & v2,
|
||||
genType & baryPosition
|
||||
vec<3, T, Q> const& orig, vec<3, T, Q> const& dir,
|
||||
vec<3, T, Q> const& vert0, vec<3, T, Q> const& vert1, vec<3, T, Q> const& vert2,
|
||||
vec<2, T, Q>& baryPosition, T& distance
|
||||
)
|
||||
{
|
||||
genType e1 = v1 - v0;
|
||||
genType e2 = v2 - v0;
|
||||
// find vectors for two edges sharing vert0
|
||||
vec<3, T, Q> const edge1 = vert1 - vert0;
|
||||
vec<3, T, Q> const edge2 = vert2 - vert0;
|
||||
|
||||
genType p = glm::cross(dir, e2);
|
||||
// begin calculating determinant - also used to calculate U parameter
|
||||
vec<3, T, Q> const p = glm::cross(dir, edge2);
|
||||
|
||||
typename genType::value_type a = glm::dot(e1, p);
|
||||
// if determinant is near zero, ray lies in plane of triangle
|
||||
T const det = glm::dot(edge1, p);
|
||||
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
if(a < Epsilon)
|
||||
return false;
|
||||
vec<3, T, Q> Perpendicular(0);
|
||||
|
||||
typename genType::value_type f = typename genType::value_type(1.0f) / a;
|
||||
if(det > std::numeric_limits<T>::epsilon())
|
||||
{
|
||||
// calculate distance from vert0 to ray origin
|
||||
vec<3, T, Q> const dist = orig - vert0;
|
||||
|
||||
genType s = orig - v0;
|
||||
baryPosition.x = f * glm::dot(s, p);
|
||||
if(baryPosition.x < typename genType::value_type(0.0f))
|
||||
return false;
|
||||
if(baryPosition.x > typename genType::value_type(1.0f))
|
||||
return false;
|
||||
// calculate U parameter and test bounds
|
||||
baryPosition.x = glm::dot(dist, p);
|
||||
if(baryPosition.x < static_cast<T>(0) || baryPosition.x > det)
|
||||
return false;
|
||||
|
||||
genType q = glm::cross(s, e1);
|
||||
baryPosition.y = f * glm::dot(dir, q);
|
||||
if(baryPosition.y < typename genType::value_type(0.0f))
|
||||
return false;
|
||||
if(baryPosition.y + baryPosition.x > typename genType::value_type(1.0f))
|
||||
return false;
|
||||
// prepare to test V parameter
|
||||
Perpendicular = glm::cross(dist, edge1);
|
||||
|
||||
baryPosition.z = f * glm::dot(e2, q);
|
||||
// calculate V parameter and test bounds
|
||||
baryPosition.y = glm::dot(dir, Perpendicular);
|
||||
if((baryPosition.y < static_cast<T>(0)) || ((baryPosition.x + baryPosition.y) > det))
|
||||
return false;
|
||||
}
|
||||
else if(det < -std::numeric_limits<T>::epsilon())
|
||||
{
|
||||
// calculate distance from vert0 to ray origin
|
||||
vec<3, T, Q> const dist = orig - vert0;
|
||||
|
||||
return baryPosition.z >= typename genType::value_type(0.0f);
|
||||
// calculate U parameter and test bounds
|
||||
baryPosition.x = glm::dot(dist, p);
|
||||
if((baryPosition.x > static_cast<T>(0)) || (baryPosition.x < det))
|
||||
return false;
|
||||
|
||||
// prepare to test V parameter
|
||||
Perpendicular = glm::cross(dist, edge1);
|
||||
|
||||
// calculate V parameter and test bounds
|
||||
baryPosition.y = glm::dot(dir, Perpendicular);
|
||||
if((baryPosition.y > static_cast<T>(0)) || (baryPosition.x + baryPosition.y < det))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return false; // ray is parallel to the plane of the triangle
|
||||
|
||||
T inv_det = static_cast<T>(1) / det;
|
||||
|
||||
// calculate distance, ray intersects triangle
|
||||
distance = glm::dot(edge2, Perpendicular) * inv_det;
|
||||
baryPosition *= inv_det;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//template <typename genType>
|
||||
//GLM_FUNC_QUALIFIER bool intersectRayTriangle
|
||||
//(
|
||||
// genType const & orig, genType const & dir,
|
||||
// genType const & vert0, genType const & vert1, genType const & vert2,
|
||||
// genType & position
|
||||
//)
|
||||
//{
|
||||
// typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
//
|
||||
// genType edge1 = vert1 - vert0;
|
||||
// genType edge2 = vert2 - vert0;
|
||||
//
|
||||
// genType pvec = cross(dir, edge2);
|
||||
//
|
||||
// float det = dot(edge1, pvec);
|
||||
// if(det < Epsilon)
|
||||
// return false;
|
||||
//
|
||||
// genType tvec = orig - vert0;
|
||||
//
|
||||
// position.y = dot(tvec, pvec);
|
||||
// if (position.y < typename genType::value_type(0) || position.y > det)
|
||||
// return typename genType::value_type(0);
|
||||
//
|
||||
// genType qvec = cross(tvec, edge1);
|
||||
//
|
||||
// position.z = dot(dir, qvec);
|
||||
// if (position.z < typename genType::value_type(0) || position.y + position.z > det)
|
||||
// return typename genType::value_type(0);
|
||||
//
|
||||
// position.x = dot(edge2, qvec);
|
||||
// position *= typename genType::value_type(1) / det;
|
||||
//
|
||||
// return typename genType::value_type(1);
|
||||
//}
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineTriangle
|
||||
(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & vert0, genType const & vert1, genType const & vert2,
|
||||
genType const& orig, genType const& dir,
|
||||
genType const& vert0, genType const& vert1, genType const& vert2,
|
||||
genType & position
|
||||
)
|
||||
{
|
||||
@@ -119,36 +103,36 @@ namespace glm
|
||||
genType edge1 = vert1 - vert0;
|
||||
genType edge2 = vert2 - vert0;
|
||||
|
||||
genType pvec = cross(dir, edge2);
|
||||
genType Perpendicular = cross(dir, edge2);
|
||||
|
||||
float det = dot(edge1, pvec);
|
||||
float det = dot(edge1, Perpendicular);
|
||||
|
||||
if (det > -Epsilon && det < Epsilon)
|
||||
return false;
|
||||
float inv_det = typename genType::value_type(1) / det;
|
||||
typename genType::value_type inv_det = typename genType::value_type(1) / det;
|
||||
|
||||
genType tvec = orig - vert0;
|
||||
genType Tengant = orig - vert0;
|
||||
|
||||
position.y = dot(tvec, pvec) * inv_det;
|
||||
position.y = dot(Tengant, Perpendicular) * inv_det;
|
||||
if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1))
|
||||
return false;
|
||||
|
||||
genType qvec = cross(tvec, edge1);
|
||||
genType Cotengant = cross(Tengant, edge1);
|
||||
|
||||
position.z = dot(dir, qvec) * inv_det;
|
||||
position.z = dot(dir, Cotengant) * inv_det;
|
||||
if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1))
|
||||
return false;
|
||||
|
||||
position.x = dot(edge2, qvec) * inv_det;
|
||||
position.x = dot(edge2, Cotengant) * inv_det;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRaySphere
|
||||
(
|
||||
genType const & rayStarting, genType const & rayNormalizedDirection,
|
||||
genType const & sphereCenter, const typename genType::value_type sphereRadiusSquered,
|
||||
genType const& rayStarting, genType const& rayNormalizedDirection,
|
||||
genType const& sphereCenter, const typename genType::value_type sphereRadiusSquered,
|
||||
typename genType::value_type & intersectionDistance
|
||||
)
|
||||
{
|
||||
@@ -165,11 +149,11 @@ namespace glm
|
||||
return intersectionDistance > Epsilon;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRaySphere
|
||||
(
|
||||
genType const & rayStarting, genType const & rayNormalizedDirection,
|
||||
genType const & sphereCenter, const typename genType::value_type sphereRadius,
|
||||
genType const& rayStarting, genType const& rayNormalizedDirection,
|
||||
genType const& sphereCenter, const typename genType::value_type sphereRadius,
|
||||
genType & intersectionPosition, genType & intersectionNormal
|
||||
)
|
||||
{
|
||||
@@ -183,12 +167,12 @@ namespace glm
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineSphere
|
||||
(
|
||||
genType const & point0, genType const & point1,
|
||||
genType const & sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & intersectionPoint1, genType & intersectionNormal1,
|
||||
genType const& point0, genType const& point1,
|
||||
genType const& sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & intersectionPoint1, genType & intersectionNormal1,
|
||||
genType & intersectionPoint2, genType & intersectionNormal2
|
||||
)
|
||||
{
|
||||
|
||||
@@ -1,48 +1,21 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_io
|
||||
/// @file glm/gtx/io.hpp
|
||||
/// @date 2013-11-22 / 2014-11-25
|
||||
/// @author Jan P Springer (regnirpsj@gmail.com)
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_matrix_access (dependence)
|
||||
/// @see gtc_quaternion (dependence)
|
||||
///
|
||||
/// @defgroup gtx_io GLM_GTX_io
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief std::[w]ostream support for glm types
|
||||
///
|
||||
/// std::[w]ostream support for glm types + precision/width/etc. manipulators
|
||||
/// based on howard hinnant's std::chrono io proposal
|
||||
/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html]
|
||||
/// Include <glm/gtx/io.hpp> to use the features of this extension.
|
||||
///
|
||||
/// <glm/gtx/io.hpp> needs to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// std::[w]ostream support for glm types
|
||||
///
|
||||
/// std::[w]ostream support for glm types + qualifier/width/etc. manipulators
|
||||
/// based on howard hinnant's std::chrono io proposal
|
||||
/// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html]
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -50,7 +23,11 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtx/quaternion.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(glm_ext))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_io is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_io extension included")
|
||||
#endif
|
||||
|
||||
@@ -67,7 +44,7 @@ namespace glm
|
||||
{
|
||||
enum order_type { column_major, row_major};
|
||||
|
||||
template <typename CTy>
|
||||
template<typename CTy>
|
||||
class format_punct : public std::locale::facet
|
||||
{
|
||||
typedef CTy char_type;
|
||||
@@ -86,17 +63,17 @@ namespace glm
|
||||
char_type newline;
|
||||
order_type order;
|
||||
|
||||
explicit format_punct(size_t a = 0);
|
||||
explicit format_punct(format_punct const&);
|
||||
GLM_FUNC_DECL explicit format_punct(size_t a = 0);
|
||||
GLM_FUNC_DECL explicit format_punct(format_punct const&);
|
||||
};
|
||||
|
||||
template <typename CTy, typename CTr = std::char_traits<CTy> >
|
||||
template<typename CTy, typename CTr = std::char_traits<CTy> >
|
||||
class basic_state_saver {
|
||||
|
||||
public:
|
||||
|
||||
explicit basic_state_saver(std::basic_ios<CTy,CTr>&);
|
||||
~basic_state_saver();
|
||||
GLM_FUNC_DECL explicit basic_state_saver(std::basic_ios<CTy,CTr>&);
|
||||
GLM_FUNC_DECL ~basic_state_saver();
|
||||
|
||||
private:
|
||||
|
||||
@@ -113,25 +90,25 @@ namespace glm
|
||||
char_type fill_;
|
||||
locale_type locale_;
|
||||
|
||||
basic_state_saver& operator=(basic_state_saver const&);
|
||||
GLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&);
|
||||
};
|
||||
|
||||
typedef basic_state_saver<char> state_saver;
|
||||
typedef basic_state_saver<wchar_t> wstate_saver;
|
||||
|
||||
template <typename CTy, typename CTr = std::char_traits<CTy> >
|
||||
template<typename CTy, typename CTr = std::char_traits<CTy> >
|
||||
class basic_format_saver
|
||||
{
|
||||
public:
|
||||
|
||||
explicit basic_format_saver(std::basic_ios<CTy,CTr>&);
|
||||
~basic_format_saver();
|
||||
GLM_FUNC_DECL explicit basic_format_saver(std::basic_ios<CTy,CTr>&);
|
||||
GLM_FUNC_DECL ~basic_format_saver();
|
||||
|
||||
private:
|
||||
|
||||
basic_state_saver<CTy> const bss_;
|
||||
|
||||
basic_format_saver& operator=(basic_format_saver const&);
|
||||
GLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&);
|
||||
};
|
||||
|
||||
typedef basic_format_saver<char> format_saver;
|
||||
@@ -141,90 +118,82 @@ namespace glm
|
||||
{
|
||||
unsigned value;
|
||||
|
||||
explicit precision(unsigned);
|
||||
GLM_FUNC_DECL explicit precision(unsigned);
|
||||
};
|
||||
|
||||
struct width
|
||||
{
|
||||
unsigned value;
|
||||
|
||||
explicit width(unsigned);
|
||||
GLM_FUNC_DECL explicit width(unsigned);
|
||||
};
|
||||
|
||||
template <typename CTy>
|
||||
template<typename CTy>
|
||||
struct delimeter
|
||||
{
|
||||
CTy value[3];
|
||||
|
||||
explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ',');
|
||||
GLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ',');
|
||||
};
|
||||
|
||||
struct order
|
||||
{
|
||||
order_type value;
|
||||
|
||||
explicit order(order_type);
|
||||
GLM_FUNC_DECL explicit order(order_type);
|
||||
};
|
||||
|
||||
// functions, inlined (inline)
|
||||
|
||||
template <typename FTy, typename CTy, typename CTr>
|
||||
template<typename FTy, typename CTy, typename CTr>
|
||||
FTy const& get_facet(std::basic_ios<CTy,CTr>&);
|
||||
template <typename FTy, typename CTy, typename CTr>
|
||||
template<typename FTy, typename CTy, typename CTr>
|
||||
std::basic_ios<CTy,CTr>& formatted(std::basic_ios<CTy,CTr>&);
|
||||
template <typename FTy, typename CTy, typename CTr>
|
||||
template<typename FTy, typename CTy, typename CTr>
|
||||
std::basic_ios<CTy,CTr>& unformattet(std::basic_ios<CTy,CTr>&);
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, precision const&);
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, width const&);
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, delimeter<CTy> const&);
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, order const&);
|
||||
}//namespace io
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tquat<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec1<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec2<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec3<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec4<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x2<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x3<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x4<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x2<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x3<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x4<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x2<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x3<T,P> const&);
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x4<T,P> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, qua<T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<1, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<2, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<3, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, vec<4, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 2, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 3, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<2, 4, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 2, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 3, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<3, 4, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 2, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 3, T, Q> const&);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, mat<4, 4, T, Q> const&);
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(
|
||||
std::basic_ostream<CTy,CTr> &,
|
||||
std::pair<tmat4x4<T,P> const,
|
||||
tmat4x4<T,P> const> const &);
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(
|
||||
std::basic_ostream<CTy,CTr> &,
|
||||
std::pair<tmat4x4<T,P>,
|
||||
tmat4x4<T,P> > const &);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr> &,
|
||||
std::pair<mat<4, 4, T, Q> const, mat<4, 4, T, Q> const> const&);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,85 +1,56 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_io
|
||||
/// @file glm/gtx/io.inl
|
||||
/// @date 2013-11-22 / 2014-11-25
|
||||
/// @author Jan P Springer (regnirpsj@gmail.com)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <iomanip> // std::setfill<>, std::fixed, std::setprecision, std::right, std::setw
|
||||
#include <ostream> // std::basic_ostream<>
|
||||
#include <iomanip> // std::fixed, std::setfill<>, std::setprecision, std::right, std::setw
|
||||
#include <ostream> // std::basic_ostream<>
|
||||
#include "../gtc/matrix_access.hpp" // glm::col, glm::row
|
||||
#include "../gtx/type_trait.hpp" // glm::type<>
|
||||
|
||||
namespace glm{
|
||||
namespace io
|
||||
{
|
||||
template <typename CTy>
|
||||
/* explicit */ GLM_FUNC_QUALIFIER
|
||||
format_punct<CTy>::format_punct(size_t a)
|
||||
: std::locale::facet(a),
|
||||
formatted (true),
|
||||
precision (3),
|
||||
width (1 + 4 + 1 + precision),
|
||||
separator (','),
|
||||
delim_left ('['),
|
||||
delim_right (']'),
|
||||
space (' '),
|
||||
newline ('\n'),
|
||||
order (row_major)
|
||||
template<typename CTy>
|
||||
GLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(size_t a)
|
||||
: std::locale::facet(a)
|
||||
, formatted(true)
|
||||
, precision(3)
|
||||
, width(1 + 4 + 1 + precision)
|
||||
, separator(',')
|
||||
, delim_left('[')
|
||||
, delim_right(']')
|
||||
, space(' ')
|
||||
, newline('\n')
|
||||
, order(column_major)
|
||||
{}
|
||||
|
||||
template <typename CTy>
|
||||
/* explicit */ GLM_FUNC_QUALIFIER
|
||||
format_punct<CTy>::format_punct(format_punct const& a)
|
||||
: std::locale::facet(0),
|
||||
formatted (a.formatted),
|
||||
precision (a.precision),
|
||||
width (a.width),
|
||||
separator (a.separator),
|
||||
delim_left (a.delim_left),
|
||||
delim_right (a.delim_right),
|
||||
space (a.space),
|
||||
newline (a.newline),
|
||||
order (a.order)
|
||||
template<typename CTy>
|
||||
GLM_FUNC_QUALIFIER format_punct<CTy>::format_punct(format_punct const& a)
|
||||
: std::locale::facet(0)
|
||||
, formatted(a.formatted)
|
||||
, precision(a.precision)
|
||||
, width(a.width)
|
||||
, separator(a.separator)
|
||||
, delim_left(a.delim_left)
|
||||
, delim_right(a.delim_right)
|
||||
, space(a.space)
|
||||
, newline(a.newline)
|
||||
, order(a.order)
|
||||
{}
|
||||
|
||||
template <typename CTy> std::locale::id format_punct<CTy>::id;
|
||||
template<typename CTy> std::locale::id format_punct<CTy>::id;
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
/* explicit */ GLM_FUNC_QUALIFIER basic_state_saver<CTy,CTr>::basic_state_saver(std::basic_ios<CTy,CTr>& a)
|
||||
: state_ (a),
|
||||
flags_ (a.flags()),
|
||||
precision_(a.precision()),
|
||||
width_ (a.width()),
|
||||
fill_ (a.fill()),
|
||||
locale_ (a.getloc())
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::basic_state_saver(std::basic_ios<CTy, CTr>& a)
|
||||
: state_(a)
|
||||
, flags_(a.flags())
|
||||
, precision_(a.precision())
|
||||
, width_(a.width())
|
||||
, fill_(a.fill())
|
||||
, locale_(a.getloc())
|
||||
{}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER basic_state_saver<CTy,CTr>::~basic_state_saver()
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER basic_state_saver<CTy, CTr>::~basic_state_saver()
|
||||
{
|
||||
state_.imbue(locale_);
|
||||
state_.fill(fill_);
|
||||
@@ -88,28 +59,28 @@ namespace io
|
||||
state_.flags(flags_);
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
/* explicit */ GLM_FUNC_QUALIFIER basic_format_saver<CTy,CTr>::basic_format_saver(std::basic_ios<CTy,CTr>& a)
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER basic_format_saver<CTy, CTr>::basic_format_saver(std::basic_ios<CTy, CTr>& a)
|
||||
: bss_(a)
|
||||
{
|
||||
a.imbue(std::locale(a.getloc(), new format_punct<CTy>(get_facet<format_punct<CTy> >(a))));
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER
|
||||
basic_format_saver<CTy,CTr>::~basic_format_saver()
|
||||
basic_format_saver<CTy, CTr>::~basic_format_saver()
|
||||
{}
|
||||
|
||||
/* explicit */ GLM_FUNC_QUALIFIER precision::precision(unsigned a)
|
||||
GLM_FUNC_QUALIFIER precision::precision(unsigned a)
|
||||
: value(a)
|
||||
{}
|
||||
|
||||
/* explicit */ GLM_FUNC_QUALIFIER width::width(unsigned a)
|
||||
GLM_FUNC_QUALIFIER width::width(unsigned a)
|
||||
: value(a)
|
||||
{}
|
||||
|
||||
template <typename CTy>
|
||||
/* explicit */ GLM_FUNC_QUALIFIER delimeter<CTy>::delimeter(CTy a, CTy b, CTy c)
|
||||
template<typename CTy>
|
||||
GLM_FUNC_QUALIFIER delimeter<CTy>::delimeter(CTy a, CTy b, CTy c)
|
||||
: value()
|
||||
{
|
||||
value[0] = a;
|
||||
@@ -117,55 +88,49 @@ namespace io
|
||||
value[2] = c;
|
||||
}
|
||||
|
||||
/* explicit */ GLM_FUNC_QUALIFIER
|
||||
order::order(order_type a)
|
||||
GLM_FUNC_QUALIFIER order::order(order_type a)
|
||||
: value(a)
|
||||
{}
|
||||
|
||||
template <typename FTy, typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios<CTy,CTr>& ios)
|
||||
template<typename FTy, typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios<CTy, CTr>& ios)
|
||||
{
|
||||
if (!std::has_facet<FTy>(ios.getloc())) {
|
||||
ios.imbue(std::locale(ios.getloc(), new FTy));
|
||||
}
|
||||
if(!std::has_facet<FTy>(ios.getloc()))
|
||||
ios.imbue(std::locale(ios.getloc(), new FTy));
|
||||
|
||||
return std::use_facet<FTy>(ios.getloc());
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ios<CTy,CTr>& formatted(std::basic_ios<CTy,CTr>& ios)
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& formatted(std::basic_ios<CTy, CTr>& ios)
|
||||
{
|
||||
const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = true;
|
||||
|
||||
return ios;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ios<CTy,CTr>& unformatted(std::basic_ios<CTy,CTr>& ios)
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ios<CTy, CTr>& unformatted(std::basic_ios<CTy, CTr>& ios)
|
||||
{
|
||||
const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(ios)).formatted = false;
|
||||
|
||||
return ios;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, precision const& a)
|
||||
{
|
||||
const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).precision = a.value;
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, width const& a)
|
||||
{
|
||||
const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).width = a.value;
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, delimeter<CTy> const& a)
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, delimeter<CTy> const& a)
|
||||
{
|
||||
format_punct<CTy> & fmt(const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)));
|
||||
|
||||
@@ -176,466 +141,283 @@ namespace io
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr>
|
||||
template<typename CTy, typename CTr>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>& os, order const& a)
|
||||
{
|
||||
const_cast<format_punct<CTy>&>(get_facet<format_punct<CTy> >(os)).order = a.value;
|
||||
|
||||
return os;
|
||||
}
|
||||
} // namespace io
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tquat<T,P> const& a)
|
||||
namespace detail
|
||||
{
|
||||
template<typename CTy, typename CTr, typename V>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>&
|
||||
print_vector_on(std::basic_ostream<CTy, CTr>& os, V const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
typename std::basic_ostream<CTy, CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
|
||||
length_t const& components(type<V>::components);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
io::basic_state_saver<CTy> const bss(os);
|
||||
|
||||
os << std::fixed
|
||||
<< std::right
|
||||
<< std::setprecision(fmt.precision)
|
||||
<< std::setfill(fmt.space)
|
||||
<< fmt.delim_left
|
||||
<< std::setw(fmt.width) << a.w << fmt.separator
|
||||
<< std::setw(fmt.width) << a.x << fmt.separator
|
||||
<< std::setw(fmt.width) << a.y << fmt.separator
|
||||
<< std::setw(fmt.width) << a.z
|
||||
<< fmt.delim_right;
|
||||
os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left;
|
||||
|
||||
for(length_t i(0); i < components; ++i)
|
||||
{
|
||||
os << std::setw(fmt.width) << a[i];
|
||||
if(components-1 != i)
|
||||
os << fmt.separator;
|
||||
}
|
||||
|
||||
os << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << a.w << fmt.space << a.x << fmt.space << a.y << fmt.space << a.z;
|
||||
for(length_t i(0); i < components; ++i)
|
||||
{
|
||||
os << a[i];
|
||||
|
||||
if(components-1 != i)
|
||||
os << fmt.space;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec1<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, qua<T, Q> const& a)
|
||||
{
|
||||
return detail::print_vector_on(os, a);
|
||||
}
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<1, T, Q> const& a)
|
||||
{
|
||||
return detail::print_vector_on(os, a);
|
||||
}
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
io::basic_state_saver<CTy> const bss(os);
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<2, T, Q> const& a)
|
||||
{
|
||||
return detail::print_vector_on(os, a);
|
||||
}
|
||||
|
||||
os << std::fixed
|
||||
<< std::right
|
||||
<< std::setprecision(fmt.precision)
|
||||
<< std::setfill(fmt.space)
|
||||
<< fmt.delim_left
|
||||
<< std::setw(fmt.width) << a.x
|
||||
<< fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << a.x;
|
||||
}
|
||||
}
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<3, T, Q> const& a)
|
||||
{
|
||||
return detail::print_vector_on(os, a);
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, vec<4, T, Q> const& a)
|
||||
{
|
||||
return detail::print_vector_on(os, a);
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec2<T,P> const& a)
|
||||
namespace detail
|
||||
{
|
||||
template<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_on(std::basic_ostream<CTy, CTr>& os, M<C, R, T, Q> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
|
||||
length_t const& cols(type<M<C, R, T, Q> >::cols);
|
||||
length_t const& rows(type<M<C, R, T, Q> >::rows);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
io::basic_state_saver<CTy> const bss(os);
|
||||
os << fmt.newline << fmt.delim_left;
|
||||
|
||||
os << std::fixed
|
||||
<< std::right
|
||||
<< std::setprecision(fmt.precision)
|
||||
<< std::setfill(fmt.space)
|
||||
<< fmt.delim_left
|
||||
<< std::setw(fmt.width) << a.x << fmt.separator
|
||||
<< std::setw(fmt.width) << a.y
|
||||
<< fmt.delim_right;
|
||||
switch(fmt.order)
|
||||
{
|
||||
case io::column_major:
|
||||
{
|
||||
for(length_t i(0); i < rows; ++i)
|
||||
{
|
||||
if (0 != i)
|
||||
os << fmt.space;
|
||||
|
||||
os << row(a, i);
|
||||
|
||||
if(rows-1 != i)
|
||||
os << fmt.newline;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case io::row_major:
|
||||
{
|
||||
for(length_t i(0); i < cols; ++i)
|
||||
{
|
||||
if(0 != i)
|
||||
os << fmt.space;
|
||||
|
||||
os << column(a, i);
|
||||
|
||||
if(cols-1 != i)
|
||||
os << fmt.newline;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
os << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << a.x << fmt.space << a.y;
|
||||
switch (fmt.order)
|
||||
{
|
||||
case io::column_major:
|
||||
{
|
||||
for(length_t i(0); i < cols; ++i)
|
||||
{
|
||||
os << column(a, i);
|
||||
|
||||
if(cols - 1 != i)
|
||||
os << fmt.space;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case io::row_major:
|
||||
{
|
||||
for (length_t i(0); i < rows; ++i)
|
||||
{
|
||||
os << row(a, i);
|
||||
|
||||
if (rows-1 != i)
|
||||
os << fmt.space;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec3<T,P> const& a)
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 2, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 3, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<2, 4, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 2, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 3, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<3, 4, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 2, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 3, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, mat<4, 4, T, Q> const& a)
|
||||
{
|
||||
return detail::print_matrix_on(os, a);
|
||||
}
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template<typename CTy, typename CTr, template<length_t, length_t, typename, qualifier> class M, length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& print_matrix_pair_on(std::basic_ostream<CTy, CTr>& os, std::pair<M<C, R, T, Q> const, M<C, R, T, Q> const> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
io::format_punct<CTy> const& fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
M<C, R, T, Q> const& ml(a.first);
|
||||
M<C, R, T, Q> const& mr(a.second);
|
||||
length_t const& cols(type<M<C, R, T, Q> >::cols);
|
||||
length_t const& rows(type<M<C, R, T, Q> >::rows);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
io::basic_state_saver<CTy> const bss(os);
|
||||
os << fmt.newline << fmt.delim_left;
|
||||
|
||||
os << std::fixed
|
||||
<< std::right
|
||||
<< std::setprecision(fmt.precision)
|
||||
<< std::setfill(fmt.space)
|
||||
<< fmt.delim_left
|
||||
<< std::setw(fmt.width) << a.x << fmt.separator
|
||||
<< std::setw(fmt.width) << a.y << fmt.separator
|
||||
<< std::setw(fmt.width) << a.z
|
||||
<< fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << a.x << fmt.space << a.y << fmt.space << a.z;
|
||||
}
|
||||
}
|
||||
switch(fmt.order)
|
||||
{
|
||||
case io::column_major:
|
||||
{
|
||||
for(length_t i(0); i < rows; ++i)
|
||||
{
|
||||
if(0 != i)
|
||||
os << fmt.space;
|
||||
|
||||
return os;
|
||||
}
|
||||
os << row(ml, i) << ((rows-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << row(mr, i);
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec4<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
if(rows-1 != i)
|
||||
os << fmt.newline;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case io::row_major:
|
||||
{
|
||||
for(length_t i(0); i < cols; ++i)
|
||||
{
|
||||
if(0 != i)
|
||||
os << fmt.space;
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
os << column(ml, i) << ((cols-1 != i) ? fmt.space : fmt.delim_right) << fmt.space << ((0 != i) ? fmt.space : fmt.delim_left) << column(mr, i);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
io::basic_state_saver<CTy> const bss(os);
|
||||
if(cols-1 != i)
|
||||
os << fmt.newline;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
os << std::fixed
|
||||
<< std::right
|
||||
<< std::setprecision(fmt.precision)
|
||||
<< std::setfill(fmt.space)
|
||||
<< fmt.delim_left
|
||||
<< std::setw(fmt.width) << a.x << fmt.separator
|
||||
<< std::setw(fmt.width) << a.y << fmt.separator
|
||||
<< std::setw(fmt.width) << a.z << fmt.separator
|
||||
<< std::setw(fmt.width) << a.w
|
||||
<< fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << a.x << fmt.space << a.y << fmt.space << a.z << fmt.space << a.w;
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x2<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat2x2<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x3<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat3x2<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x4<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat4x2<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.newline
|
||||
<< fmt.space << m[3] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x2<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat2x3<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x3<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat3x3<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x4<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat4x3<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if (fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.newline
|
||||
<< fmt.space << m[3] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x2<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat2x4<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if (fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x3<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat3x4<T,P> m(a);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x4<T,P> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat4x4<T,P> m(a);
|
||||
|
||||
if (io::row_major == fmt.order)
|
||||
m = transpose(a);
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
os << fmt.newline
|
||||
<< fmt.delim_left << m[0] << fmt.newline
|
||||
<< fmt.space << m[1] << fmt.newline
|
||||
<< fmt.space << m[2] << fmt.newline
|
||||
<< fmt.space << m[3] << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3];
|
||||
}
|
||||
}
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(
|
||||
std::basic_ostream<CTy,CTr> & os,
|
||||
std::pair<tmat4x4<T,P> const, tmat4x4<T,P> const> const& a)
|
||||
{
|
||||
typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os);
|
||||
|
||||
if(cerberus)
|
||||
{
|
||||
io::format_punct<CTy> const & fmt(io::get_facet<io::format_punct<CTy> >(os));
|
||||
tmat4x4<T,P> ml(a.first);
|
||||
tmat4x4<T,P> mr(a.second);
|
||||
|
||||
if(io::row_major == fmt.order)
|
||||
{
|
||||
ml = transpose(a.first);
|
||||
mr = transpose(a.second);
|
||||
}
|
||||
|
||||
if(fmt.formatted)
|
||||
{
|
||||
CTy const & l(fmt.delim_left);
|
||||
CTy const & r(fmt.delim_right);
|
||||
CTy const & s(fmt.space);
|
||||
|
||||
os << fmt.newline
|
||||
<< l << ml[0] << s << s << l << mr[0] << fmt.newline
|
||||
<< s << ml[1] << s << s << s << mr[1] << fmt.newline
|
||||
<< s << ml[2] << s << s << s << mr[2] << fmt.newline
|
||||
<< s << ml[3] << r << s << s << mr[3] << r;
|
||||
os << fmt.delim_right;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -645,12 +427,14 @@ namespace io
|
||||
|
||||
return os;
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
template <typename CTy, typename CTr, typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(
|
||||
std::basic_ostream<CTy,CTr> & os,
|
||||
std::pair<tmat4x4<T,P>, tmat4x4<T,P> > const& a)
|
||||
template<typename CTy, typename CTr, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER std::basic_ostream<CTy, CTr>& operator<<(
|
||||
std::basic_ostream<CTy, CTr> & os,
|
||||
std::pair<mat<4, 4, T, Q> const,
|
||||
mat<4, 4, T, Q> const> const& a)
|
||||
{
|
||||
return operator<<(os, static_cast<std::pair<tmat4x4<T,P> const, tmat4x4<T,P> const> const&>(a));
|
||||
return detail::print_matrix_pair_on(os, a);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_log_base
|
||||
/// @file glm/gtx/log_base.hpp
|
||||
/// @date 2008-10-24 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_log_base GLM_GTX_log_base
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Logarithm for any base. base can be a vector or a scalar.
|
||||
///
|
||||
/// <glm/gtx/log_base.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/log_base.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Logarithm for any base. base can be a vector or a scalar.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_log_base is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_log_base extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,17 +30,17 @@ namespace glm
|
||||
|
||||
/// Logarithm for any base.
|
||||
/// From GLM_GTX_log_base.
|
||||
template <typename genType>
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType log(
|
||||
genType const & x,
|
||||
genType const & base);
|
||||
genType const& x,
|
||||
genType const& base);
|
||||
|
||||
/// Logarithm for any base.
|
||||
/// From GLM_GTX_log_base.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL vecType<T, P> sign(
|
||||
vecType<T, P> const & x,
|
||||
vecType<T, P> const & base);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<L, T, Q> sign(
|
||||
vec<L, T, Q> const& x,
|
||||
vec<L, T, Q> const& base);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,46 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_log_base
|
||||
/// @file glm/gtx/log_base.inl
|
||||
/// @date 2008-10-24 / 2014-11-25
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType log(genType const & x, genType const & base)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType log(genType const& x, genType const& base)
|
||||
{
|
||||
assert(x != genType(0));
|
||||
return glm::log(x) / glm::log(base);
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T, P> log(vecType<T, P> const & x, vecType<T, P> const & base)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<L, T, Q> log(vec<L, T, Q> const& x, vec<L, T, Q> const& base)
|
||||
{
|
||||
return glm::log(x) / glm::log(base);
|
||||
}
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_cross_product
|
||||
/// @file glm/gtx/matrix_cross_product.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Build cross product matrices
|
||||
///
|
||||
/// <glm/gtx/matrix_cross_product.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_cross_product.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Build cross product matrices
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_cross_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_cross_product extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,15 +31,15 @@ namespace glm
|
||||
|
||||
//! Build a cross product matrix.
|
||||
//! From GLM_GTX_matrix_cross_product extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> matrixCross3(
|
||||
tvec3<T, P> const & x);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> matrixCross3(
|
||||
vec<3, T, Q> const& x);
|
||||
|
||||
//! Build a cross product matrix.
|
||||
//! From GLM_GTX_matrix_cross_product extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> matrixCross4(
|
||||
tvec3<T, P> const & x);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> matrixCross4(
|
||||
vec<3, T, Q> const& x);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,44 +1,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_cross_product
|
||||
/// @file glm/gtx/matrix_cross_product.inl
|
||||
/// @date 2005-12-21 / 2005-12-21
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> matrixCross3
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> matrixCross3
|
||||
(
|
||||
tvec3<T, P> const & x
|
||||
vec<3, T, Q> const& x
|
||||
)
|
||||
{
|
||||
tmat3x3<T, P> Result(T(0));
|
||||
mat<3, 3, T, Q> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
@@ -48,13 +18,13 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> matrixCross4
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> matrixCross4
|
||||
(
|
||||
tvec3<T, P> const & x
|
||||
vec<3, T, Q> const& x
|
||||
)
|
||||
{
|
||||
tmat4x4<T, P> Result(T(0));
|
||||
mat<4, 4, T, Q> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
|
||||
@@ -1,43 +1,14 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_decompose
|
||||
/// @file glm/gtx/matrix_decompose.hpp
|
||||
/// @date 2014-08-29 / 2014-08-29
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_decompose GLM_GTX_matrix_decompose
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Decomposes a model matrix to translations, rotation and scale components
|
||||
///
|
||||
/// <glm/gtx/matrix_decompose.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_decompose.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Decomposes a model matrix to translations, rotation and scale components
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -45,10 +16,15 @@
|
||||
#include "../mat4x4.hpp"
|
||||
#include "../vec3.hpp"
|
||||
#include "../vec4.hpp"
|
||||
#include "../geometric.hpp"
|
||||
#include "../gtc/quaternion.hpp"
|
||||
#include "../gtc/matrix_transform.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_decompose is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_decompose extension included")
|
||||
#endif
|
||||
|
||||
@@ -57,12 +33,12 @@ namespace glm
|
||||
/// @addtogroup gtx_matrix_decompose
|
||||
/// @{
|
||||
|
||||
/// Decomposes a model matrix to translations, rotation and scale components
|
||||
/// Decomposes a model matrix to translations, rotation and scale components
|
||||
/// @see gtx_matrix_decompose
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool decompose(
|
||||
tmat4x4<T, P> const & modelMatrix,
|
||||
tvec3<T, P> & scale, tquat<T, P> & orientation, tvec3<T, P> & translation, tvec3<T, P> & skew, tvec4<T, P> & perspective);
|
||||
mat<4, 4, T, Q> const& modelMatrix,
|
||||
vec<3, T, Q> & scale, qua<T, Q> & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,75 +1,40 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_decompose
|
||||
/// @file glm/gtx/matrix_decompose.inl
|
||||
/// @date 2014-08-29 / 2014-08-29
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
#include "../gtc/constants.hpp"
|
||||
#include "../gtc/epsilon.hpp"
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
{
|
||||
/// Make a linear combination of two vectors and return the result.
|
||||
// result = (a * ascl) + (b * bscl)
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> combine(
|
||||
tvec3<T, P> const & a,
|
||||
tvec3<T, P> const & b,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> combine(
|
||||
vec<3, T, Q> const& a,
|
||||
vec<3, T, Q> const& b,
|
||||
T ascl, T bscl)
|
||||
{
|
||||
return (a * ascl) + (b * bscl);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER void v3Scale(tvec3<T, P> & v, T desiredLength)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> scale(vec<3, T, Q> const& v, T desiredLength)
|
||||
{
|
||||
T len = glm::length(v);
|
||||
if(len != 0)
|
||||
{
|
||||
T l = desiredLength / len;
|
||||
v[0] *= l;
|
||||
v[1] *= l;
|
||||
v[2] *= l;
|
||||
}
|
||||
return v * desiredLength / length(v);
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
/**
|
||||
* Matrix decompose
|
||||
* http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp
|
||||
* Decomposes the mode matrix to translations,rotation scale components
|
||||
*
|
||||
*/
|
||||
// Matrix decompose
|
||||
// http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp
|
||||
// Decomposes the mode matrix to translations,rotation scale components
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool decompose(tmat4x4<T, P> const & ModelMatrix, tvec3<T, P> & Scale, tquat<T, P> & Orientation, tvec3<T, P> & Translation, tvec3<T, P> & Skew, tvec4<T, P> & Perspective)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool decompose(mat<4, 4, T, Q> const& ModelMatrix, vec<3, T, Q> & Scale, qua<T, Q> & Orientation, vec<3, T, Q> & Translation, vec<3, T, Q> & Skew, vec<4, T, Q> & Perspective)
|
||||
{
|
||||
tmat4x4<T, P> LocalMatrix(ModelMatrix);
|
||||
mat<4, 4, T, Q> LocalMatrix(ModelMatrix);
|
||||
|
||||
// Normalize the matrix.
|
||||
if(LocalMatrix[3][3] == static_cast<T>(0))
|
||||
if(epsilonEqual(LocalMatrix[3][3], static_cast<T>(0), epsilon<T>()))
|
||||
return false;
|
||||
|
||||
for(length_t i = 0; i < 4; ++i)
|
||||
@@ -78,21 +43,24 @@ namespace glm
|
||||
|
||||
// perspectiveMatrix is used to solve for perspective, but it also provides
|
||||
// an easy way to test for singularity of the upper 3x3 component.
|
||||
tmat4x4<T, P> PerspectiveMatrix(LocalMatrix);
|
||||
mat<4, 4, T, Q> PerspectiveMatrix(LocalMatrix);
|
||||
|
||||
for(length_t i = 0; i < 3; i++)
|
||||
PerspectiveMatrix[i][3] = static_cast<T>(0);
|
||||
PerspectiveMatrix[3][3] = static_cast<T>(1);
|
||||
|
||||
/// TODO: Fixme!
|
||||
if(determinant(PerspectiveMatrix) == static_cast<T>(0))
|
||||
if(epsilonEqual(determinant(PerspectiveMatrix), static_cast<T>(0), epsilon<T>()))
|
||||
return false;
|
||||
|
||||
// First, isolate perspective. This is the messiest.
|
||||
if(LocalMatrix[0][3] != static_cast<T>(0) || LocalMatrix[1][3] != static_cast<T>(0) || LocalMatrix[2][3] != static_cast<T>(0))
|
||||
if(
|
||||
epsilonNotEqual(LocalMatrix[0][3], static_cast<T>(0), epsilon<T>()) ||
|
||||
epsilonNotEqual(LocalMatrix[1][3], static_cast<T>(0), epsilon<T>()) ||
|
||||
epsilonNotEqual(LocalMatrix[2][3], static_cast<T>(0), epsilon<T>()))
|
||||
{
|
||||
// rightHandSide is the right hand side of the equation.
|
||||
tvec4<T, P> RightHandSide;
|
||||
vec<4, T, Q> RightHandSide;
|
||||
RightHandSide[0] = LocalMatrix[0][3];
|
||||
RightHandSide[1] = LocalMatrix[1][3];
|
||||
RightHandSide[2] = LocalMatrix[2][3];
|
||||
@@ -101,8 +69,8 @@ namespace glm
|
||||
// Solve the equation by inverting PerspectiveMatrix and multiplying
|
||||
// rightHandSide by the inverse. (This is the easiest way, not
|
||||
// necessarily the best.)
|
||||
tmat4x4<T, P> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix);
|
||||
tmat4x4<T, P> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix);
|
||||
mat<4, 4, T, Q> InversePerspectiveMatrix = glm::inverse(PerspectiveMatrix);// inverse(PerspectiveMatrix, inversePerspectiveMatrix);
|
||||
mat<4, 4, T, Q> TransposedInversePerspectiveMatrix = glm::transpose(InversePerspectiveMatrix);// transposeMatrix4(inversePerspectiveMatrix, transposedInversePerspectiveMatrix);
|
||||
|
||||
Perspective = TransposedInversePerspectiveMatrix * RightHandSide;
|
||||
// v4MulPointByMatrix(rightHandSide, transposedInversePerspectiveMatrix, perspectivePoint);
|
||||
@@ -114,43 +82,43 @@ namespace glm
|
||||
else
|
||||
{
|
||||
// No perspective.
|
||||
Perspective = tvec4<T, P>(0, 0, 0, 1);
|
||||
Perspective = vec<4, T, Q>(0, 0, 0, 1);
|
||||
}
|
||||
|
||||
// Next take care of translation (easy).
|
||||
Translation = tvec3<T, P>(LocalMatrix[3]);
|
||||
LocalMatrix[3] = tvec4<T, P>(0, 0, 0, LocalMatrix[3].w);
|
||||
Translation = vec<3, T, Q>(LocalMatrix[3]);
|
||||
LocalMatrix[3] = vec<4, T, Q>(0, 0, 0, LocalMatrix[3].w);
|
||||
|
||||
tvec3<T, P> Row[3], Pdum3;
|
||||
vec<3, T, Q> Row[3], Pdum3;
|
||||
|
||||
// Now get scale and shear.
|
||||
for(length_t i = 0; i < 3; ++i)
|
||||
for(int j = 0; j < 3; ++j)
|
||||
Row[i][j] = LocalMatrix[i][j];
|
||||
for(length_t j = 0; j < 3; ++j)
|
||||
Row[i][j] = LocalMatrix[i][j];
|
||||
|
||||
// Compute X scale factor and normalize first row.
|
||||
Scale.x = length(Row[0]);// v3Length(Row[0]);
|
||||
|
||||
v3Scale(Row[0], static_cast<T>(1));
|
||||
Row[0] = detail::scale(Row[0], static_cast<T>(1));
|
||||
|
||||
// Compute XY shear factor and make 2nd row orthogonal to 1st.
|
||||
Skew.z = dot(Row[0], Row[1]);
|
||||
Row[1] = combine(Row[1], Row[0], static_cast<T>(1), -Skew.z);
|
||||
Row[1] = detail::combine(Row[1], Row[0], static_cast<T>(1), -Skew.z);
|
||||
|
||||
// Now, compute Y scale and normalize 2nd row.
|
||||
Scale.y = length(Row[1]);
|
||||
v3Scale(Row[1], static_cast<T>(1));
|
||||
Row[1] = detail::scale(Row[1], static_cast<T>(1));
|
||||
Skew.z /= Scale.y;
|
||||
|
||||
// Compute XZ and YZ shears, orthogonalize 3rd row.
|
||||
Skew.y = glm::dot(Row[0], Row[2]);
|
||||
Row[2] = combine(Row[2], Row[0], static_cast<T>(1), -Skew.y);
|
||||
Row[2] = detail::combine(Row[2], Row[0], static_cast<T>(1), -Skew.y);
|
||||
Skew.x = glm::dot(Row[1], Row[2]);
|
||||
Row[2] = combine(Row[2], Row[1], static_cast<T>(1), -Skew.x);
|
||||
Row[2] = detail::combine(Row[2], Row[1], static_cast<T>(1), -Skew.x);
|
||||
|
||||
// Next, get Z scale and normalize 3rd row.
|
||||
Scale.z = length(Row[2]);
|
||||
v3Scale(Row[2], static_cast<T>(1));
|
||||
Row[2] = detail::scale(Row[2], static_cast<T>(1));
|
||||
Skew.y /= Scale.z;
|
||||
Skew.x /= Scale.z;
|
||||
|
||||
@@ -162,7 +130,7 @@ namespace glm
|
||||
{
|
||||
for(length_t i = 0; i < 3; i++)
|
||||
{
|
||||
Scale.x *= static_cast<T>(-1);
|
||||
Scale[i] *= static_cast<T>(-1);
|
||||
Row[i] *= static_cast<T>(-1);
|
||||
}
|
||||
}
|
||||
@@ -184,47 +152,34 @@ namespace glm
|
||||
// ret.rotateZ = 0;
|
||||
// }
|
||||
|
||||
T s, t, x, y, z, w;
|
||||
|
||||
t = Row[0][0] + Row[1][1] + Row[2][2] + static_cast<T>(1);
|
||||
|
||||
if(t > static_cast<T>(1e-4))
|
||||
int i, j, k = 0;
|
||||
float root, trace = Row[0].x + Row[1].y + Row[2].z;
|
||||
if(trace > static_cast<T>(0))
|
||||
{
|
||||
s = static_cast<T>(0.5) / sqrt(t);
|
||||
w = static_cast<T>(0.25) / s;
|
||||
x = (Row[2][1] - Row[1][2]) * s;
|
||||
y = (Row[0][2] - Row[2][0]) * s;
|
||||
z = (Row[1][0] - Row[0][1]) * s;
|
||||
}
|
||||
else if(Row[0][0] > Row[1][1] && Row[0][0] > Row[2][2])
|
||||
{
|
||||
s = sqrt (static_cast<T>(1) + Row[0][0] - Row[1][1] - Row[2][2]) * static_cast<T>(2); // S=4*qx
|
||||
x = static_cast<T>(0.25) * s;
|
||||
y = (Row[0][1] + Row[1][0]) / s;
|
||||
z = (Row[0][2] + Row[2][0]) / s;
|
||||
w = (Row[2][1] - Row[1][2]) / s;
|
||||
}
|
||||
else if(Row[1][1] > Row[2][2])
|
||||
{
|
||||
s = sqrt (static_cast<T>(1) + Row[1][1] - Row[0][0] - Row[2][2]) * static_cast<T>(2); // S=4*qy
|
||||
x = (Row[0][1] + Row[1][0]) / s;
|
||||
y = static_cast<T>(0.25) * s;
|
||||
z = (Row[1][2] + Row[2][1]) / s;
|
||||
w = (Row[0][2] - Row[2][0]) / s;
|
||||
}
|
||||
root = sqrt(trace + static_cast<T>(1.0));
|
||||
Orientation.w = static_cast<T>(0.5) * root;
|
||||
root = static_cast<T>(0.5) / root;
|
||||
Orientation.x = root * (Row[1].z - Row[2].y);
|
||||
Orientation.y = root * (Row[2].x - Row[0].z);
|
||||
Orientation.z = root * (Row[0].y - Row[1].x);
|
||||
} // End if > 0
|
||||
else
|
||||
{
|
||||
s = sqrt(static_cast<T>(1) + Row[2][2] - Row[0][0] - Row[1][1]) * static_cast<T>(2); // S=4*qz
|
||||
x = (Row[0][2] + Row[2][0]) / s;
|
||||
y = (Row[1][2] + Row[2][1]) / s;
|
||||
z = static_cast<T>(0.25) * s;
|
||||
w = (Row[1][0] - Row[0][1]) / s;
|
||||
}
|
||||
{
|
||||
static int Next[3] = {1, 2, 0};
|
||||
i = 0;
|
||||
if(Row[1].y > Row[0].x) i = 1;
|
||||
if(Row[2].z > Row[i][i]) i = 2;
|
||||
j = Next[i];
|
||||
k = Next[j];
|
||||
|
||||
Orientation.x = x;
|
||||
Orientation.y = y;
|
||||
Orientation.z = z;
|
||||
Orientation.w = w;
|
||||
root = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + static_cast<T>(1.0));
|
||||
|
||||
Orientation[i] = static_cast<T>(0.5) * root;
|
||||
root = static_cast<T>(0.5) / root;
|
||||
Orientation[j] = root * (Row[i][j] + Row[j][i]);
|
||||
Orientation[k] = root * (Row[i][k] + Row[k][i]);
|
||||
Orientation.w = root * (Row[j][k] - Row[k][j]);
|
||||
} // End if <= 0
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
69
includes/glm/gtx/matrix_factorisation.hpp
Normal file
69
includes/glm/gtx/matrix_factorisation.hpp
Normal file
@@ -0,0 +1,69 @@
|
||||
/// @ref gtx_matrix_factorisation
|
||||
/// @file glm/gtx/matrix_factorisation.hpp
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_factorisation GLM_GTX_matrix_factorisation
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// Include <glm/gtx/matrix_factorisation.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Functions to factor matrices in various forms
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_factorisation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_factorisation extension included")
|
||||
#endif
|
||||
|
||||
/*
|
||||
Suggestions:
|
||||
- Move helper functions flipud and fliplr to another file: They may be helpful in more general circumstances.
|
||||
- Implement other types of matrix factorisation, such as: QL and LQ, L(D)U, eigendecompositions, etc...
|
||||
*/
|
||||
|
||||
namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_matrix_factorisation
|
||||
/// @{
|
||||
|
||||
/// Flips the matrix rows up and down.
|
||||
///
|
||||
/// From GLM_GTX_matrix_factorisation extension.
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in);
|
||||
|
||||
/// Flips the matrix columns right and left.
|
||||
///
|
||||
/// From GLM_GTX_matrix_factorisation extension.
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in);
|
||||
|
||||
/// Performs QR factorisation of a matrix.
|
||||
/// Returns 2 matrices, q and r, such that the columns of q are orthonormal and span the same subspace than those of the input matrix, r is an upper triangular matrix, and q*r=in.
|
||||
/// Given an n-by-m input matrix, q has dimensions min(n,m)-by-m, and r has dimensions n-by-min(n,m).
|
||||
///
|
||||
/// From GLM_GTX_matrix_factorisation extension.
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r);
|
||||
|
||||
/// Performs RQ factorisation of a matrix.
|
||||
/// Returns 2 matrices, r and q, such that r is an upper triangular matrix, the rows of q are orthonormal and span the same subspace than those of the input matrix, and r*q=in.
|
||||
/// Note that in the context of RQ factorisation, the diagonal is seen as starting in the lower-right corner of the matrix, instead of the usual upper-left.
|
||||
/// Given an n-by-m input matrix, r has dimensions min(n,m)-by-m, and q has dimensions n-by-min(n,m).
|
||||
///
|
||||
/// From GLM_GTX_matrix_factorisation extension.
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q);
|
||||
|
||||
/// @}
|
||||
}
|
||||
|
||||
#include "matrix_factorisation.inl"
|
||||
84
includes/glm/gtx/matrix_factorisation.inl
Normal file
84
includes/glm/gtx/matrix_factorisation.inl
Normal file
@@ -0,0 +1,84 @@
|
||||
/// @ref gtx_matrix_factorisation
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in)
|
||||
{
|
||||
mat<R, C, T, Q> tin = transpose(in);
|
||||
tin = fliplr(tin);
|
||||
mat<C, R, T, Q> out = transpose(tin);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in)
|
||||
{
|
||||
mat<C, R, T, Q> out;
|
||||
for (length_t i = 0; i < C; i++)
|
||||
{
|
||||
out[i] = in[(C - i) - 1];
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r)
|
||||
{
|
||||
// Uses modified Gram-Schmidt method
|
||||
// Source: https://en.wikipedia.org/wiki/Gram<61>Schmidt_process
|
||||
// And https://en.wikipedia.org/wiki/QR_decomposition
|
||||
|
||||
//For all the linearly independs columns of the input...
|
||||
// (there can be no more linearly independents columns than there are rows.)
|
||||
for (length_t i = 0; i < (C < R ? C : R); i++)
|
||||
{
|
||||
//Copy in Q the input's i-th column.
|
||||
q[i] = in[i];
|
||||
|
||||
//j = [0,i[
|
||||
// Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns.
|
||||
// Also: Fill the zero elements of R
|
||||
for (length_t j = 0; j < i; j++)
|
||||
{
|
||||
q[i] -= dot(q[i], q[j])*q[j];
|
||||
r[j][i] = 0;
|
||||
}
|
||||
|
||||
//Now, Q i-th column is orthogonal to all the previous columns. Normalize it.
|
||||
q[i] = normalize(q[i]);
|
||||
|
||||
//j = [i,C[
|
||||
//Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input.
|
||||
for (length_t j = i; j < C; j++)
|
||||
{
|
||||
r[j][i] = dot(in[j], q[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q)
|
||||
{
|
||||
// From https://en.wikipedia.org/wiki/QR_decomposition:
|
||||
// The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices.
|
||||
// QR decomposition is Gram<61>Schmidt orthogonalization of columns of A, started from the first column.
|
||||
// RQ decomposition is Gram<61>Schmidt orthogonalization of rows of A, started from the last row.
|
||||
|
||||
mat<R, C, T, Q> tin = transpose(in);
|
||||
tin = fliplr(tin);
|
||||
|
||||
mat<R, (C < R ? C : R), T, Q> tr;
|
||||
mat<(C < R ? C : R), C, T, Q> tq;
|
||||
qr_decompose(tin, tq, tr);
|
||||
|
||||
tr = fliplr(tr);
|
||||
r = transpose(tr);
|
||||
r = fliplr(r);
|
||||
|
||||
tq = fliplr(tq);
|
||||
q = transpose(tq);
|
||||
}
|
||||
} //namespace glm
|
||||
@@ -1,50 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_interpolation
|
||||
/// @file glm/gtx/matrix_interpolation.hpp
|
||||
/// @date 2011-03-05 / 2011-06-07
|
||||
/// @author Ghenadii Ursachi (the.asteroth@gmail.com)
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Allows to directly interpolate two exiciting matrices.
|
||||
///
|
||||
/// <glm/gtx/matrix_interpolation.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_interpolation.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Allows to directly interpolate two matrices.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_interpolation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_interpolation extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,33 +31,28 @@ namespace glm
|
||||
|
||||
/// Get the axis and angle of the rotation from a matrix.
|
||||
/// From GLM_GTX_matrix_interpolation extension.
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL void axisAngle(
|
||||
tmat4x4<T, P> const & mat,
|
||||
tvec3<T, P> & axis,
|
||||
T & angle);
|
||||
mat<4, 4, T, Q> const& Mat, vec<3, T, Q> & Axis, T & Angle);
|
||||
|
||||
/// Build a matrix from axis and angle.
|
||||
/// From GLM_GTX_matrix_interpolation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> axisAngleMatrix(
|
||||
tvec3<T, P> const & axis,
|
||||
T const angle);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> axisAngleMatrix(
|
||||
vec<3, T, Q> const& Axis, T const Angle);
|
||||
|
||||
/// Extracts the rotation part of a matrix.
|
||||
/// From GLM_GTX_matrix_interpolation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> extractMatrixRotation(
|
||||
tmat4x4<T, P> const & mat);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> extractMatrixRotation(
|
||||
mat<4, 4, T, Q> const& Mat);
|
||||
|
||||
/// Build a interpolation of 4 * 4 matrixes.
|
||||
/// From GLM_GTX_matrix_interpolation extension.
|
||||
/// Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> interpolate(
|
||||
tmat4x4<T, P> const & m1,
|
||||
tmat4x4<T, P> const & m2,
|
||||
T const delta);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> interpolate(
|
||||
mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const Delta);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,72 +1,42 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_interpolation
|
||||
/// @file glm/gtx/matrix_interpolation.hpp
|
||||
/// @date 2011-03-05 / 2011-03-05
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "../gtc/constants.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER void axisAngle
|
||||
(
|
||||
tmat4x4<T, P> const & mat,
|
||||
tvec3<T, P> & axis,
|
||||
T & angle
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER void axisAngle(mat<4, 4, T, Q> const& m, vec<3, T, Q> & axis, T& angle)
|
||||
{
|
||||
T epsilon = (T)0.01;
|
||||
T epsilon2 = (T)0.1;
|
||||
T epsilon = static_cast<T>(0.01);
|
||||
T epsilon2 = static_cast<T>(0.1);
|
||||
|
||||
if((abs(mat[1][0] - mat[0][1]) < epsilon) && (abs(mat[2][0] - mat[0][2]) < epsilon) && (abs(mat[2][1] - mat[1][2]) < epsilon))
|
||||
if((abs(m[1][0] - m[0][1]) < epsilon) && (abs(m[2][0] - m[0][2]) < epsilon) && (abs(m[2][1] - m[1][2]) < epsilon))
|
||||
{
|
||||
if ((abs(mat[1][0] + mat[0][1]) < epsilon2) && (abs(mat[2][0] + mat[0][2]) < epsilon2) && (abs(mat[2][1] + mat[1][2]) < epsilon2) && (abs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2))
|
||||
if ((abs(m[1][0] + m[0][1]) < epsilon2) && (abs(m[2][0] + m[0][2]) < epsilon2) && (abs(m[2][1] + m[1][2]) < epsilon2) && (abs(m[0][0] + m[1][1] + m[2][2] - static_cast<T>(3.0)) < epsilon2))
|
||||
{
|
||||
angle = (T)0.0;
|
||||
axis.x = (T)1.0;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.0;
|
||||
angle = static_cast<T>(0.0);
|
||||
axis.x = static_cast<T>(1.0);
|
||||
axis.y = static_cast<T>(0.0);
|
||||
axis.z = static_cast<T>(0.0);
|
||||
return;
|
||||
}
|
||||
angle = static_cast<T>(3.1415926535897932384626433832795);
|
||||
T xx = (mat[0][0] + (T)1.0) / (T)2.0;
|
||||
T yy = (mat[1][1] + (T)1.0) / (T)2.0;
|
||||
T zz = (mat[2][2] + (T)1.0) / (T)2.0;
|
||||
T xy = (mat[1][0] + mat[0][1]) / (T)4.0;
|
||||
T xz = (mat[2][0] + mat[0][2]) / (T)4.0;
|
||||
T yz = (mat[2][1] + mat[1][2]) / (T)4.0;
|
||||
T xx = (m[0][0] + static_cast<T>(1.0)) * static_cast<T>(0.5);
|
||||
T yy = (m[1][1] + static_cast<T>(1.0)) * static_cast<T>(0.5);
|
||||
T zz = (m[2][2] + static_cast<T>(1.0)) * static_cast<T>(0.5);
|
||||
T xy = (m[1][0] + m[0][1]) * static_cast<T>(0.25);
|
||||
T xz = (m[2][0] + m[0][2]) * static_cast<T>(0.25);
|
||||
T yz = (m[2][1] + m[1][2]) * static_cast<T>(0.25);
|
||||
if((xx > yy) && (xx > zz))
|
||||
{
|
||||
if (xx < epsilon) {
|
||||
axis.x = (T)0.0;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
if(xx < epsilon)
|
||||
{
|
||||
axis.x = static_cast<T>(0.0);
|
||||
axis.y = static_cast<T>(0.7071);
|
||||
axis.z = static_cast<T>(0.7071);
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.x = sqrt(xx);
|
||||
axis.y = xy / axis.x;
|
||||
axis.z = xz / axis.x;
|
||||
@@ -74,11 +44,14 @@ namespace glm
|
||||
}
|
||||
else if (yy > zz)
|
||||
{
|
||||
if (yy < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
if(yy < epsilon)
|
||||
{
|
||||
axis.x = static_cast<T>(0.7071);
|
||||
axis.y = static_cast<T>(0.0);
|
||||
axis.z = static_cast<T>(0.7071);
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.y = sqrt(yy);
|
||||
axis.x = xy / axis.y;
|
||||
axis.z = yz / axis.y;
|
||||
@@ -86,11 +59,14 @@ namespace glm
|
||||
}
|
||||
else
|
||||
{
|
||||
if (zz < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.0;
|
||||
} else {
|
||||
if (zz < epsilon)
|
||||
{
|
||||
axis.x = static_cast<T>(0.7071);
|
||||
axis.y = static_cast<T>(0.7071);
|
||||
axis.z = static_cast<T>(0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
axis.z = sqrt(zz);
|
||||
axis.x = xz / axis.z;
|
||||
axis.y = yz / axis.z;
|
||||
@@ -98,63 +74,53 @@ namespace glm
|
||||
}
|
||||
return;
|
||||
}
|
||||
T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1]));
|
||||
T s = sqrt((m[2][1] - m[1][2]) * (m[2][1] - m[1][2]) + (m[2][0] - m[0][2]) * (m[2][0] - m[0][2]) + (m[1][0] - m[0][1]) * (m[1][0] - m[0][1]));
|
||||
if (glm::abs(s) < T(0.001))
|
||||
s = (T)1.0;
|
||||
angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0);
|
||||
axis.x = (mat[1][2] - mat[2][1]) / s;
|
||||
axis.y = (mat[2][0] - mat[0][2]) / s;
|
||||
axis.z = (mat[0][1] - mat[1][0]) / s;
|
||||
s = static_cast<T>(1);
|
||||
T const angleCos = (m[0][0] + m[1][1] + m[2][2] - static_cast<T>(1)) * static_cast<T>(0.5);
|
||||
if(angleCos - static_cast<T>(1) < epsilon)
|
||||
angle = pi<T>() * static_cast<T>(0.25);
|
||||
else
|
||||
angle = acos(angleCos);
|
||||
axis.x = (m[1][2] - m[2][1]) / s;
|
||||
axis.y = (m[2][0] - m[0][2]) / s;
|
||||
axis.z = (m[0][1] - m[1][0]) / s;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> axisAngleMatrix
|
||||
(
|
||||
tvec3<T, P> const & axis,
|
||||
T const angle
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> axisAngleMatrix(vec<3, T, Q> const& axis, T const angle)
|
||||
{
|
||||
T c = cos(angle);
|
||||
T s = sin(angle);
|
||||
T t = static_cast<T>(1) - c;
|
||||
tvec3<T, P> n = normalize(axis);
|
||||
vec<3, T, Q> n = normalize(axis);
|
||||
|
||||
return tmat4x4<T, P>(
|
||||
t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0),
|
||||
t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0),
|
||||
t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0),
|
||||
T(0), T(0), T(0), T(1)
|
||||
);
|
||||
return mat<4, 4, T, Q>(
|
||||
t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, static_cast<T>(0.0),
|
||||
t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, static_cast<T>(0.0),
|
||||
t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, static_cast<T>(0.0),
|
||||
static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> extractMatrixRotation
|
||||
(
|
||||
tmat4x4<T, P> const & mat
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> extractMatrixRotation(mat<4, 4, T, Q> const& m)
|
||||
{
|
||||
return tmat4x4<T, P>(
|
||||
mat[0][0], mat[0][1], mat[0][2], 0.0,
|
||||
mat[1][0], mat[1][1], mat[1][2], 0.0,
|
||||
mat[2][0], mat[2][1], mat[2][2], 0.0,
|
||||
0.0, 0.0, 0.0, 1.0
|
||||
);
|
||||
return mat<4, 4, T, Q>(
|
||||
m[0][0], m[0][1], m[0][2], static_cast<T>(0.0),
|
||||
m[1][0], m[1][1], m[1][2], static_cast<T>(0.0),
|
||||
m[2][0], m[2][1], m[2][2], static_cast<T>(0.0),
|
||||
static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(0.0), static_cast<T>(1.0));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> interpolate
|
||||
(
|
||||
tmat4x4<T, P> const & m1,
|
||||
tmat4x4<T, P> const & m2,
|
||||
T const delta
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> interpolate(mat<4, 4, T, Q> const& m1, mat<4, 4, T, Q> const& m2, T const delta)
|
||||
{
|
||||
tmat4x4<T, P> m1rot = extractMatrixRotation(m1);
|
||||
tmat4x4<T, P> dltRotation = m2 * transpose(m1rot);
|
||||
tvec3<T, P> dltAxis;
|
||||
mat<4, 4, T, Q> m1rot = extractMatrixRotation(m1);
|
||||
mat<4, 4, T, Q> dltRotation = m2 * transpose(m1rot);
|
||||
vec<3, T, Q> dltAxis;
|
||||
T dltAngle;
|
||||
axisAngle(dltRotation, dltAxis, dltAngle);
|
||||
tmat4x4<T, P> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot;
|
||||
mat<4, 4, T, Q> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot;
|
||||
out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]);
|
||||
out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]);
|
||||
out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]);
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_major_storage
|
||||
/// @file glm/gtx/matrix_major_storage.hpp
|
||||
/// @date 2006-04-19 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Build matrices with specific matrix order, row or column
|
||||
///
|
||||
/// <glm/gtx/matrix_major_storage.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_major_storage.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Build matrices with specific matrix order, row or column
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_major_storage is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_major_storage extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,87 +31,87 @@ namespace glm
|
||||
|
||||
//! Build a row major matrix from row vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x2<T, P> rowMajor2(
|
||||
tvec2<T, P> const & v1,
|
||||
tvec2<T, P> const & v2);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2(
|
||||
vec<2, T, Q> const& v1,
|
||||
vec<2, T, Q> const& v2);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x2<T, P> rowMajor2(
|
||||
tmat2x2<T, P> const & m);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> rowMajor2(
|
||||
mat<2, 2, T, Q> const& m);
|
||||
|
||||
//! Build a row major matrix from row vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> rowMajor3(
|
||||
tvec3<T, P> const & v1,
|
||||
tvec3<T, P> const & v2,
|
||||
tvec3<T, P> const & v3);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3(
|
||||
vec<3, T, Q> const& v1,
|
||||
vec<3, T, Q> const& v2,
|
||||
vec<3, T, Q> const& v3);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> rowMajor3(
|
||||
tmat3x3<T, P> const & m);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> rowMajor3(
|
||||
mat<3, 3, T, Q> const& m);
|
||||
|
||||
//! Build a row major matrix from row vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> rowMajor4(
|
||||
tvec4<T, P> const & v1,
|
||||
tvec4<T, P> const & v2,
|
||||
tvec4<T, P> const & v3,
|
||||
tvec4<T, P> const & v4);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4(
|
||||
vec<4, T, Q> const& v1,
|
||||
vec<4, T, Q> const& v2,
|
||||
vec<4, T, Q> const& v3,
|
||||
vec<4, T, Q> const& v4);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> rowMajor4(
|
||||
tmat4x4<T, P> const & m);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> rowMajor4(
|
||||
mat<4, 4, T, Q> const& m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x2<T, P> colMajor2(
|
||||
tvec2<T, P> const & v1,
|
||||
tvec2<T, P> const & v2);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2(
|
||||
vec<2, T, Q> const& v1,
|
||||
vec<2, T, Q> const& v2);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x2<T, P> colMajor2(
|
||||
tmat2x2<T, P> const & m);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> colMajor2(
|
||||
mat<2, 2, T, Q> const& m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> colMajor3(
|
||||
tvec3<T, P> const & v1,
|
||||
tvec3<T, P> const & v2,
|
||||
tvec3<T, P> const & v3);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3(
|
||||
vec<3, T, Q> const& v1,
|
||||
vec<3, T, Q> const& v2,
|
||||
vec<3, T, Q> const& v3);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> colMajor3(
|
||||
tmat3x3<T, P> const & m);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> colMajor3(
|
||||
mat<3, 3, T, Q> const& m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> colMajor4(
|
||||
tvec4<T, P> const & v1,
|
||||
tvec4<T, P> const & v2,
|
||||
tvec4<T, P> const & v3,
|
||||
tvec4<T, P> const & v4);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4(
|
||||
vec<4, T, Q> const& v1,
|
||||
vec<4, T, Q> const& v2,
|
||||
vec<4, T, Q> const& v3,
|
||||
vec<4, T, Q> const& v4);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> colMajor4(
|
||||
tmat4x4<T, P> const & m);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> colMajor4(
|
||||
mat<4, 4, T, Q> const& m);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,45 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_major_storage
|
||||
/// @file glm/gtx/matrix_major_storage.hpp
|
||||
/// @date 2006-04-19 / 2014-11-25
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, P> rowMajor2
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2
|
||||
(
|
||||
tvec2<T, P> const & v1,
|
||||
tvec2<T, P> const & v2
|
||||
vec<2, T, Q> const& v1,
|
||||
vec<2, T, Q> const& v2
|
||||
)
|
||||
{
|
||||
tmat2x2<T, P> Result;
|
||||
mat<2, 2, T, Q> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[0][1] = v2.x;
|
||||
@@ -47,11 +17,11 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, P> rowMajor2(
|
||||
const tmat2x2<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> rowMajor2(
|
||||
const mat<2, 2, T, Q>& m)
|
||||
{
|
||||
tmat2x2<T, P> Result;
|
||||
mat<2, 2, T, Q> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[1][0] = m[0][1];
|
||||
@@ -59,13 +29,13 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> rowMajor3(
|
||||
const tvec3<T, P>& v1,
|
||||
const tvec3<T, P>& v2,
|
||||
const tvec3<T, P>& v3)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3(
|
||||
const vec<3, T, Q>& v1,
|
||||
const vec<3, T, Q>& v2,
|
||||
const vec<3, T, Q>& v3)
|
||||
{
|
||||
tmat3x3<T, P> Result;
|
||||
mat<3, 3, T, Q> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
@@ -78,11 +48,11 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> rowMajor3(
|
||||
const tmat3x3<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rowMajor3(
|
||||
const mat<3, 3, T, Q>& m)
|
||||
{
|
||||
tmat3x3<T, P> Result;
|
||||
mat<3, 3, T, Q> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
@@ -95,14 +65,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> rowMajor4(
|
||||
const tvec4<T, P>& v1,
|
||||
const tvec4<T, P>& v2,
|
||||
const tvec4<T, P>& v3,
|
||||
const tvec4<T, P>& v4)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4(
|
||||
const vec<4, T, Q>& v1,
|
||||
const vec<4, T, Q>& v2,
|
||||
const vec<4, T, Q>& v3,
|
||||
const vec<4, T, Q>& v4)
|
||||
{
|
||||
tmat4x4<T, P> Result;
|
||||
mat<4, 4, T, Q> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
@@ -122,11 +92,11 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> rowMajor4(
|
||||
const tmat4x4<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rowMajor4(
|
||||
const mat<4, 4, T, Q>& m)
|
||||
{
|
||||
tmat4x4<T, P> Result;
|
||||
mat<4, 4, T, Q> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
@@ -146,51 +116,51 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, P> colMajor2(
|
||||
const tvec2<T, P>& v1,
|
||||
const tvec2<T, P>& v2)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2(
|
||||
const vec<2, T, Q>& v1,
|
||||
const vec<2, T, Q>& v2)
|
||||
{
|
||||
return tmat2x2<T, P>(v1, v2);
|
||||
return mat<2, 2, T, Q>(v1, v2);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, P> colMajor2(
|
||||
const tmat2x2<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> colMajor2(
|
||||
const mat<2, 2, T, Q>& m)
|
||||
{
|
||||
return tmat2x2<T, P>(m);
|
||||
return mat<2, 2, T, Q>(m);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> colMajor3(
|
||||
const tvec3<T, P>& v1,
|
||||
const tvec3<T, P>& v2,
|
||||
const tvec3<T, P>& v3)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3(
|
||||
const vec<3, T, Q>& v1,
|
||||
const vec<3, T, Q>& v2,
|
||||
const vec<3, T, Q>& v3)
|
||||
{
|
||||
return tmat3x3<T, P>(v1, v2, v3);
|
||||
return mat<3, 3, T, Q>(v1, v2, v3);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> colMajor3(
|
||||
const tmat3x3<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> colMajor3(
|
||||
const mat<3, 3, T, Q>& m)
|
||||
{
|
||||
return tmat3x3<T, P>(m);
|
||||
return mat<3, 3, T, Q>(m);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> colMajor4(
|
||||
const tvec4<T, P>& v1,
|
||||
const tvec4<T, P>& v2,
|
||||
const tvec4<T, P>& v3,
|
||||
const tvec4<T, P>& v4)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4(
|
||||
const vec<4, T, Q>& v1,
|
||||
const vec<4, T, Q>& v2,
|
||||
const vec<4, T, Q>& v3,
|
||||
const vec<4, T, Q>& v4)
|
||||
{
|
||||
return tmat4x4<T, P>(v1, v2, v3, v4);
|
||||
return mat<4, 4, T, Q>(v1, v2, v3, v4);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> colMajor4(
|
||||
const tmat4x4<T, P>& m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> colMajor4(
|
||||
const mat<4, 4, T, Q>& m)
|
||||
{
|
||||
return tmat4x4<T, P>(m);
|
||||
return mat<4, 4, T, Q>(m);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_operation
|
||||
/// @file glm/gtx/matrix_operation.hpp
|
||||
/// @date 2009-08-29 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Build diagonal matrices from vectors.
|
||||
///
|
||||
/// <glm/gtx/matrix_operation.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_operation.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Build diagonal matrices from vectors.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_operation is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_operation extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,57 +30,72 @@ namespace glm
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x2<T, P> diagonal2x2(
|
||||
tvec2<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> diagonal2x2(
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x3<T, P> diagonal2x3(
|
||||
tvec2<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 3, T, Q> diagonal2x3(
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat2x4<T, P> diagonal2x4(
|
||||
tvec2<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 4, T, Q> diagonal2x4(
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x2<T, P> diagonal3x2(
|
||||
tvec2<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 2, T, Q> diagonal3x2(
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> diagonal3x3(
|
||||
tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> diagonal3x3(
|
||||
vec<3, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x4<T, P> diagonal3x4(
|
||||
tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 4, T, Q> diagonal3x4(
|
||||
vec<3, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x2<T, P> diagonal4x2(
|
||||
tvec2<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 2, T, Q> diagonal4x2(
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x3<T, P> diagonal4x3(
|
||||
tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 3, T, Q> diagonal4x3(
|
||||
vec<3, T, Q> const& v);
|
||||
|
||||
//! Build a diagonal matrix.
|
||||
//! From GLM_GTX_matrix_operation extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> diagonal4x4(
|
||||
tvec4<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> diagonal4x4(
|
||||
vec<4, T, Q> const& v);
|
||||
|
||||
/// Build an adjugate matrix.
|
||||
/// From GLM_GTX_matrix_operation extension.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m);
|
||||
|
||||
/// Build an adjugate matrix.
|
||||
/// From GLM_GTX_matrix_operation extension.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m);
|
||||
|
||||
/// Build an adjugate matrix.
|
||||
/// From GLM_GTX_matrix_operation extension.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,147 +1,176 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_operation
|
||||
/// @file glm/gtx/matrix_operation.inl
|
||||
/// @date 2009-08-29 / 2009-08-29
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x2<T, P> diagonal2x2
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> diagonal2x2
|
||||
(
|
||||
tvec2<T, P> const & v
|
||||
vec<2, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat2x2<T, P> Result(static_cast<T>(1));
|
||||
mat<2, 2, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x3<T, P> diagonal2x3
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 3, T, Q> diagonal2x3
|
||||
(
|
||||
tvec2<T, P> const & v
|
||||
vec<2, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat2x3<T, P> Result(static_cast<T>(1));
|
||||
mat<2, 3, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat2x4<T, P> diagonal2x4
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 4, T, Q> diagonal2x4
|
||||
(
|
||||
tvec2<T, P> const & v
|
||||
vec<2, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat2x4<T, P> Result(static_cast<T>(1));
|
||||
mat<2, 4, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x2<T, P> diagonal3x2
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 2, T, Q> diagonal3x2
|
||||
(
|
||||
tvec2<T, P> const & v
|
||||
vec<2, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat3x2<T, P> Result(static_cast<T>(1));
|
||||
mat<3, 2, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> diagonal3x3
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> diagonal3x3
|
||||
(
|
||||
tvec3<T, P> const & v
|
||||
vec<3, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat3x3<T, P> Result(static_cast<T>(1));
|
||||
mat<3, 3, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x4<T, P> diagonal3x4
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 4, T, Q> diagonal3x4
|
||||
(
|
||||
tvec3<T, P> const & v
|
||||
vec<3, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat3x4<T, P> Result(static_cast<T>(1));
|
||||
mat<3, 4, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> diagonal4x4
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> diagonal4x4
|
||||
(
|
||||
tvec4<T, P> const & v
|
||||
vec<4, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat4x4<T, P> Result(static_cast<T>(1));
|
||||
mat<4, 4, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
Result[3][3] = v[3];
|
||||
return Result;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x3<T, P> diagonal4x3
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 3, T, Q> diagonal4x3
|
||||
(
|
||||
tvec3<T, P> const & v
|
||||
vec<3, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat4x3<T, P> Result(static_cast<T>(1));
|
||||
mat<4, 3, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x2<T, P> diagonal4x2
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 2, T, Q> diagonal4x2
|
||||
(
|
||||
tvec2<T, P> const & v
|
||||
vec<2, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tmat4x2<T, P> Result(static_cast<T>(1));
|
||||
mat<4, 2, T, Q> Result(static_cast<T>(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<2, 2, T, Q> adjugate(mat<2, 2, T, Q> const& m)
|
||||
{
|
||||
return mat<2, 2, T, Q>(
|
||||
+m[1][1], -m[1][0],
|
||||
-m[0][1], +m[0][0]);
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> adjugate(mat<3, 3, T, Q> const& m)
|
||||
{
|
||||
T const m00 = determinant(mat<2, 2, T, Q>(m[1][1], m[2][1], m[1][2], m[2][2]));
|
||||
T const m01 = determinant(mat<2, 2, T, Q>(m[0][1], m[2][1], m[0][2], m[2][2]));
|
||||
T const m02 = determinant(mat<2, 2, T, Q>(m[0][1], m[1][1], m[0][2], m[1][2]));
|
||||
|
||||
T const m10 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][2], m[2][2]));
|
||||
T const m11 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][2], m[2][2]));
|
||||
T const m12 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][2], m[1][2]));
|
||||
|
||||
T const m20 = determinant(mat<2, 2, T, Q>(m[1][0], m[2][0], m[1][1], m[2][1]));
|
||||
T const m21 = determinant(mat<2, 2, T, Q>(m[0][0], m[2][0], m[0][1], m[2][1]));
|
||||
T const m22 = determinant(mat<2, 2, T, Q>(m[0][0], m[1][0], m[0][1], m[1][1]));
|
||||
|
||||
return mat<3, 3, T, Q>(
|
||||
+m00, -m01, +m02,
|
||||
-m10, +m11, -m12,
|
||||
+m20, -m21, +m22);
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> adjugate(mat<4, 4, T, Q> const& m)
|
||||
{
|
||||
T const m00 = determinant(mat<3, 3, T, Q>(m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3]));
|
||||
T const m01 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3]));
|
||||
T const m02 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][1], m[3][3]));
|
||||
T const m03 = determinant(mat<3, 3, T, Q>(m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2]));
|
||||
|
||||
T const m10 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[2][1], m[2][2], m[2][3], m[3][1], m[3][2], m[3][3]));
|
||||
T const m11 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[2][0], m[2][2], m[2][3], m[3][0], m[3][2], m[3][3]));
|
||||
T const m12 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[2][0], m[2][1], m[2][3], m[3][0], m[3][1], m[3][3]));
|
||||
T const m13 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[2][0], m[2][1], m[2][2], m[3][0], m[3][1], m[3][2]));
|
||||
|
||||
T const m20 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[3][1], m[3][2], m[3][3]));
|
||||
T const m21 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[3][0], m[3][2], m[3][3]));
|
||||
T const m22 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[3][0], m[3][1], m[3][3]));
|
||||
T const m23 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[3][0], m[3][1], m[3][2]));
|
||||
|
||||
T const m30 = determinant(mat<3, 3, T, Q>(m[0][1], m[0][2], m[0][3], m[1][1], m[1][2], m[1][3], m[2][1], m[2][2], m[2][3]));
|
||||
T const m31 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][2], m[0][3], m[1][0], m[1][2], m[1][3], m[2][0], m[2][2], m[2][3]));
|
||||
T const m32 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][3], m[1][0], m[1][1], m[1][3], m[2][0], m[2][1], m[2][3]));
|
||||
T const m33 = determinant(mat<3, 3, T, Q>(m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2]));
|
||||
|
||||
return mat<4, 4, T, Q>(
|
||||
+m00, -m01, +m02, -m03,
|
||||
-m10, +m11, -m12, +m13,
|
||||
+m20, -m21, +m22, -m23,
|
||||
-m30, +m31, -m32, +m33);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_query
|
||||
/// @file glm/gtx/matrix_query.hpp
|
||||
/// @date 2007-03-05 / 2011-08-28
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_vector_query (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_query GLM_GTX_matrix_query
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Query to evaluate matrix properties
|
||||
///
|
||||
/// <glm/gtx/matrix_query.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_query.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Query to evaluate matrix properties
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -47,7 +18,11 @@
|
||||
#include "../gtx/vector_query.hpp"
|
||||
#include <limits>
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_query is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_query extension included")
|
||||
#endif
|
||||
|
||||
@@ -58,43 +33,43 @@ namespace glm
|
||||
|
||||
/// Return whether a matrix a null matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNull(tmat2x2<T, P> const & m, T const & epsilon);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix a null matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNull(tmat3x3<T, P> const & m, T const & epsilon);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is a null matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNull(tmat4x4<T, P> const & m, T const & epsilon);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is an identity matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P, template <typename, precision> class matType>
|
||||
GLM_FUNC_DECL bool isIdentity(matType<T, P> const & m, T const & epsilon);
|
||||
template<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType>
|
||||
GLM_FUNC_DECL bool isIdentity(matType<C, R, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is a normalized matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNormalized(tmat2x2<T, P> const & m, T const & epsilon);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is a normalized matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNormalized(tmat3x3<T, P> const & m, T const & epsilon);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is a normalized matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL bool isNormalized(tmat4x4<T, P> const & m, T const & epsilon);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// Return whether a matrix is an orthonormalized matrix.
|
||||
/// From GLM_GTX_matrix_query extension.
|
||||
template<typename T, precision P, template <typename, precision> class matType>
|
||||
GLM_FUNC_DECL bool isOrthogonal(matType<T, P> const & m, T const & epsilon);
|
||||
template<length_t C, length_t R, typename T, qualifier Q, template<length_t, length_t, typename, qualifier> class matType>
|
||||
GLM_FUNC_DECL bool isOrthogonal(matType<C, R, T, Q> const& m, T const& epsilon);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,141 +1,111 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_query
|
||||
/// @file glm/gtx/matrix_query.inl
|
||||
/// @date 2007-03-05 / 2007-03-05
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNull(tmat2x2<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNull(mat<2, 2, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(detail::component_count_t i = 0; result && i < 2 ; ++i)
|
||||
for(length_t i = 0; result && i < m.length() ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNull(tmat3x3<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNull(mat<3, 3, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(detail::component_count_t i = 0; result && i < 3 ; ++i)
|
||||
for(length_t i = 0; result && i < m.length() ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNull(tmat4x4<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNull(mat<4, 4, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(detail::component_count_t i = 0; result && i < 4 ; ++i)
|
||||
for(length_t i = 0; result && i < m.length() ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P, template <typename, precision> class matType>
|
||||
GLM_FUNC_QUALIFIER bool isIdentity(matType<T, P> const & m, T const & epsilon)
|
||||
template<length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isIdentity(mat<C, R, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m[0]); ++i)
|
||||
for(length_t i = 0; result && i < m[0].length() ; ++i)
|
||||
{
|
||||
for(detail::component_count_t j(0); result && j < i ; ++j)
|
||||
for(length_t j = 0; result && j < i ; ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
if(result)
|
||||
result = abs(m[i][i] - 1) <= epsilon;
|
||||
for(detail::component_count_t j(i + 1); result && j < detail::component_count(m); ++j)
|
||||
for(length_t j = i + 1; result && j < m.length(); ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(tmat2x2<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(mat<2, 2, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result(true);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
{
|
||||
typename tmat2x2<T, P>::col_type v;
|
||||
for(detail::component_count_t j(0); j < detail::component_count(m); ++j)
|
||||
typename mat<2, 2, T, Q>::col_type v;
|
||||
for(length_t j = 0; j < m.length(); ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(tmat3x3<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(mat<3, 3, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result(true);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
{
|
||||
typename tmat3x3<T, P>::col_type v;
|
||||
for(detail::component_count_t j(0); j < detail::component_count(m); ++j)
|
||||
typename mat<3, 3, T, Q>::col_type v;
|
||||
for(length_t j = 0; j < m.length(); ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(tmat4x4<T, P> const & m, T const & epsilon)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(mat<4, 4, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result(true);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m); ++i)
|
||||
for(length_t i = 0; result && i < m.length(); ++i)
|
||||
{
|
||||
typename tmat4x4<T, P>::col_type v;
|
||||
for(detail::component_count_t j(0); j < detail::component_count(m); ++j)
|
||||
typename mat<4, 4, T, Q>::col_type v;
|
||||
for(length_t j = 0; j < m.length(); ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T, precision P, template <typename, precision> class matType>
|
||||
GLM_FUNC_QUALIFIER bool isOrthogonal(matType<T, P> const & m, T const & epsilon)
|
||||
template<length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER bool isOrthogonal(mat<C, R, T, Q> const& m, T const& epsilon)
|
||||
{
|
||||
bool result(true);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m) - 1; ++i)
|
||||
for(detail::component_count_t j(i + 1); result && j < detail::component_count(m); ++j)
|
||||
bool result = true;
|
||||
for(length_t i(0); result && i < m.length() - 1; ++i)
|
||||
for(length_t j(i + 1); result && j < m.length(); ++j)
|
||||
result = areOrthogonal(m[i], m[j], epsilon);
|
||||
|
||||
if(result)
|
||||
{
|
||||
matType<T, P> tmp = transpose(m);
|
||||
for(detail::component_count_t i(0); result && i < detail::component_count(m) - 1 ; ++i)
|
||||
for(detail::component_count_t j(i + 1); result && j < detail::component_count(m); ++j)
|
||||
mat<C, R, T, Q> tmp = transpose(m);
|
||||
for(length_t i(0); result && i < m.length() - 1 ; ++i)
|
||||
for(length_t j(i + 1); result && j < m.length(); ++j)
|
||||
result = areOrthogonal(tmp[i], tmp[j], epsilon);
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -1,43 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_transform_2d
|
||||
/// @file glm/gtx/matrix_transform_2d.hpp
|
||||
/// @date 2014-02-20
|
||||
/// @author Miguel Ángel Pérez Martínez
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_matrix_transform_2d GLM_GTX_matrix_transform_2d
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Defines functions that generate common 2d transformation matrices.
|
||||
///
|
||||
/// <glm/gtx/matrix_transform_2d.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/matrix_transform_2d.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Defines functions that generate common 2d transformation matrices.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -45,8 +17,11 @@
|
||||
#include "../mat3x3.hpp"
|
||||
#include "../vec2.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_matrix_transform_2d is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_matrix_transform_2d extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,50 +29,50 @@ namespace glm
|
||||
{
|
||||
/// @addtogroup gtx_matrix_transform_2d
|
||||
/// @{
|
||||
|
||||
|
||||
/// Builds a translation 3 * 3 matrix created from a vector of 2 components.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this translation matrix.
|
||||
/// @param v Coordinates of a translation vector.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> translate(
|
||||
tmat3x3<T, P> const & m,
|
||||
tvec2<T, P> const & v);
|
||||
/// @param v Coordinates of a translation vector.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
/// Builds a rotation 3 * 3 matrix created from an angle.
|
||||
/// Builds a rotation 3 * 3 matrix created from an angle.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this translation matrix.
|
||||
/// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is defined or degrees otherwise.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> rotate(
|
||||
tmat3x3<T, P> const & m,
|
||||
/// @param angle Rotation angle expressed in radians.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T angle);
|
||||
|
||||
/// Builds a scale 3 * 3 matrix created from a vector of 2 components.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this translation matrix.
|
||||
/// @param v Coordinates of a scale vector.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> scale(
|
||||
tmat3x3<T, P> const & m,
|
||||
tvec2<T, P> const & v);
|
||||
/// @param v Coordinates of a scale vector.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
vec<2, T, Q> const& v);
|
||||
|
||||
/// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix.
|
||||
/// Builds an horizontal (parallel to the x axis) shear 3 * 3 matrix.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this translation matrix.
|
||||
/// @param y Shear factor.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX(
|
||||
tmat3x3<T, P> const & m,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T y);
|
||||
|
||||
/// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix.
|
||||
/// Builds a vertical (parallel to the y axis) shear 3 * 3 matrix.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this translation matrix.
|
||||
/// @param x Shear factor.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY(
|
||||
tmat3x3<T, P> const & m,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T x);
|
||||
|
||||
/// @}
|
||||
|
||||
@@ -1,95 +1,66 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_matrix_transform_2d
|
||||
/// @file glm/gtc/matrix_transform_2d.inl
|
||||
/// @date 2014-02-20
|
||||
/// @author Miguel Ángel Pérez Martínez
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "../trigonometric.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> translate(
|
||||
tmat3x3<T, P> const & m,
|
||||
tvec2<T, P> const & v)
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> translate(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
vec<2, T, Q> const& v)
|
||||
{
|
||||
tmat3x3<T, P> Result(m);
|
||||
mat<3, 3, T, Q> Result(m);
|
||||
Result[2] = m[0] * v[0] + m[1] * v[1] + m[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> rotate(
|
||||
tmat3x3<T, P> const & m,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> rotate(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T angle)
|
||||
{
|
||||
T const a = angle;
|
||||
T const c = cos(a);
|
||||
T const s = sin(a);
|
||||
|
||||
tmat3x3<T, P> Result(uninitialize);
|
||||
mat<3, 3, T, Q> Result;
|
||||
Result[0] = m[0] * c + m[1] * s;
|
||||
Result[1] = m[0] * -s + m[1] * c;
|
||||
Result[2] = m[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> scale(
|
||||
tmat3x3<T, P> const & m,
|
||||
tvec2<T, P> const & v)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> scale(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
vec<2, T, Q> const& v)
|
||||
{
|
||||
tmat3x3<T, P> Result(uninitialize);
|
||||
mat<3, 3, T, Q> Result;
|
||||
Result[0] = m[0] * v[0];
|
||||
Result[1] = m[1] * v[1];
|
||||
Result[2] = m[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> shearX(
|
||||
tmat3x3<T, P> const & m,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearX(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T y)
|
||||
{
|
||||
tmat3x3<T, P> Result(1);
|
||||
mat<3, 3, T, Q> Result(1);
|
||||
Result[0][1] = y;
|
||||
return m * Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> shearY(
|
||||
tmat3x3<T, P> const & m,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> shearY(
|
||||
mat<3, 3, T, Q> const& m,
|
||||
T x)
|
||||
{
|
||||
tmat3x3<T, P> Result(1);
|
||||
mat<3, 3, T, Q> Result(1);
|
||||
Result[1][0] = x;
|
||||
return m * Result;
|
||||
}
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_mixed_product
|
||||
/// @file glm/gtx/mixed_product.hpp
|
||||
/// @date 2007-04-03 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Mixed product of 3 vectors.
|
||||
///
|
||||
/// <glm/gtx/mixed_product.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/mixed_product.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Mixed product of 3 vectors.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_mixed_product is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_mixed_product extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,11 +29,11 @@ namespace glm
|
||||
/// @{
|
||||
|
||||
/// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension)
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T mixedProduct(
|
||||
tvec3<T, P> const & v1,
|
||||
tvec3<T, P> const & v2,
|
||||
tvec3<T, P> const & v3);
|
||||
vec<3, T, Q> const& v1,
|
||||
vec<3, T, Q> const& v2,
|
||||
vec<3, T, Q> const& v3);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
||||
@@ -1,43 +1,13 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_mixed_product
|
||||
/// @file glm/gtx/mixed_product.inl
|
||||
/// @date 2007-04-03 / 2008-09-17
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T mixedProduct
|
||||
(
|
||||
tvec3<T, P> const & v1,
|
||||
tvec3<T, P> const & v2,
|
||||
tvec3<T, P> const & v3
|
||||
vec<3, T, Q> const& v1,
|
||||
vec<3, T, Q> const& v2,
|
||||
vec<3, T, Q> const& v3
|
||||
)
|
||||
{
|
||||
return dot(cross(v1, v2), v3);
|
||||
|
||||
@@ -1,52 +1,27 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_norm
|
||||
/// @file glm/gtx/norm.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_quaternion (dependence)
|
||||
///
|
||||
/// @defgroup gtx_norm GLM_GTX_norm
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Various ways to compute vector norms.
|
||||
///
|
||||
/// <glm/gtx/norm.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/norm.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Various ways to compute vector norms.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
#include "../geometric.hpp"
|
||||
#include "../gtx/quaternion.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_norm is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_norm extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,72 +30,45 @@ namespace glm
|
||||
/// @addtogroup gtx_norm
|
||||
/// @{
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T length2(
|
||||
T const & x);
|
||||
/// Returns the squared length of x.
|
||||
/// From GLM_GTX_norm extension.
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T length2(vec<L, T, Q> const& x);
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type length2(
|
||||
genType const & x);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
GLM_FUNC_DECL T distance2(
|
||||
T const & p0,
|
||||
T const & p1);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL typename genType::value_type distance2(
|
||||
genType const & p0,
|
||||
genType const & p1);
|
||||
/// Returns the squared distance between p0 and p1, i.e., length2(p0 - p1).
|
||||
/// From GLM_GTX_norm extension.
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1);
|
||||
|
||||
//! Returns the L1 norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T l1Norm(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y);
|
||||
|
||||
//! Returns the L1 norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T l1Norm(
|
||||
tvec3<T, P> const & v);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T l1Norm(vec<3, T, Q> const& v);
|
||||
|
||||
//! Returns the L2 norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T l2Norm(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x, vec<3, T, Q> const& y);
|
||||
|
||||
//! Returns the L2 norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T l2Norm(
|
||||
tvec3<T, P> const & x);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T l2Norm(vec<3, T, Q> const& x);
|
||||
|
||||
//! Returns the L norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T lxNorm(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y,
|
||||
unsigned int Depth);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth);
|
||||
|
||||
//! Returns the L norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL T lxNorm(
|
||||
tvec3<T, P> const & x,
|
||||
unsigned int Depth);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T lxNorm(vec<3, T, Q> const& x, unsigned int Depth);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,168 +1,81 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_norm
|
||||
/// @file glm/gtx/norm.inl
|
||||
/// @date 2005-12-21 / 2008-07-24
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
#include "../detail/qualifier.hpp"
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
{
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
T const & x
|
||||
)
|
||||
template<length_t L, typename T, qualifier Q, bool Aligned>
|
||||
struct compute_length2
|
||||
{
|
||||
GLM_FUNC_QUALIFIER static T call(vec<L, T, Q> const& v)
|
||||
{
|
||||
return dot(v, v);
|
||||
}
|
||||
};
|
||||
}//namespace detail
|
||||
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType length2(genType x)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_iec559, "'length2' accepts only floating-point inputs");
|
||||
return x * x;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
tvec2<T, P> const & x
|
||||
)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T length2(vec<L, T, Q> const& v)
|
||||
{
|
||||
return dot(x, x);
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'length2' accepts only floating-point inputs");
|
||||
return detail::compute_length2<L, T, Q, detail::is_aligned<Q>::value>::call(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
tvec3<T, P> const & x
|
||||
)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
tvec4<T, P> const & x
|
||||
)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
T const & p0,
|
||||
T const & p1
|
||||
)
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2(T p0, T p1)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'distance2' accepts only floating-point inputs");
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
tvec2<T, P> const & p0,
|
||||
tvec2<T, P> const & p1
|
||||
)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T distance2(vec<L, T, Q> const& p0, vec<L, T, Q> const& p1)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'distance2' accepts only floating-point inputs");
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
tvec3<T, P> const & p0,
|
||||
tvec3<T, P> const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
tvec4<T, P> const & p0,
|
||||
tvec4<T, P> const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T l1Norm
|
||||
(
|
||||
tvec3<T, P> const & a,
|
||||
tvec3<T, P> const & b
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b)
|
||||
{
|
||||
return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T l1Norm
|
||||
(
|
||||
tvec3<T, P> const & v
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T l1Norm(vec<3, T, Q> const& v)
|
||||
{
|
||||
return abs(v.x) + abs(v.y) + abs(v.z);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T l2Norm
|
||||
(
|
||||
tvec3<T, P> const & a,
|
||||
tvec3<T, P> const & b
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& a, vec<3, T, Q> const& b
|
||||
)
|
||||
{
|
||||
return length(b - a);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T l2Norm
|
||||
(
|
||||
tvec3<T, P> const & v
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T l2Norm(vec<3, T, Q> const& v)
|
||||
{
|
||||
return length(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T lxNorm
|
||||
(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y,
|
||||
unsigned int Depth
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& x, vec<3, T, Q> const& y, unsigned int Depth)
|
||||
{
|
||||
return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T lxNorm
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
unsigned int Depth
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T lxNorm(vec<3, T, Q> const& v, unsigned int Depth)
|
||||
{
|
||||
return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth));
|
||||
}
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_normal
|
||||
/// @file glm/gtx/normal.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_normal GLM_GTX_normal
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Compute the normal of a triangle.
|
||||
///
|
||||
/// <glm/gtx/normal.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/normal.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Compute the normal of a triangle.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_normal is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_normal extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,13 +29,11 @@ namespace glm
|
||||
/// @addtogroup gtx_normal
|
||||
/// @{
|
||||
|
||||
//! Computes triangle normal from triangle points.
|
||||
//! From GLM_GTX_normal extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> triangleNormal(
|
||||
tvec3<T, P> const & p1,
|
||||
tvec3<T, P> const & p2,
|
||||
tvec3<T, P> const & p3);
|
||||
/// Computes triangle normal from triangle points.
|
||||
///
|
||||
/// @see gtx_normal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> triangleNormal(vec<3, T, Q> const& p1, vec<3, T, Q> const& p2, vec<3, T, Q> const& p3);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,43 +1,13 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_normal
|
||||
/// @file glm/gtx/normal.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> triangleNormal
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> triangleNormal
|
||||
(
|
||||
tvec3<T, P> const & p1,
|
||||
tvec3<T, P> const & p2,
|
||||
tvec3<T, P> const & p3
|
||||
vec<3, T, Q> const& p1,
|
||||
vec<3, T, Q> const& p2,
|
||||
vec<3, T, Q> const& p3
|
||||
)
|
||||
{
|
||||
return normalize(cross(p1 - p2, p1 - p3));
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_normalize_dot
|
||||
/// @file glm/gtx/normalize_dot.hpp
|
||||
/// @date 2007-09-28 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_fast_square_root (dependence)
|
||||
///
|
||||
/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Dot product of vectors that need to be normalize with a single square root.
|
||||
///
|
||||
/// <glm/gtx/normalized_dot.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/normalized_dot.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Dot product of vectors that need to be normalize with a single square root.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../gtx/fast_square_root.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_normalize_dot is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_normalize_dot extension included")
|
||||
#endif
|
||||
|
||||
@@ -58,15 +33,15 @@ namespace glm
|
||||
/// It's faster that dot(normalize(x), normalize(y)).
|
||||
///
|
||||
/// @see gtx_normalize_dot extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL T normalizeDot(vecType<T, P> const & x, vecType<T, P> const & y);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y);
|
||||
|
||||
/// Normalize parameters and returns the dot product of x and y.
|
||||
/// Faster that dot(fastNormalize(x), fastNormalize(y)).
|
||||
///
|
||||
/// @see gtx_normalize_dot extension.
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_DECL T fastNormalizeDot(vecType<T, P> const & x, vecType<T, P> const & y);
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,45 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_normalize_dot
|
||||
/// @file glm/gtx/normalize_dot.inl
|
||||
/// @date 2007-09-28 / 2008-10-07
|
||||
/// @author Christophe Riccio
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T normalizeDot(vecType<T, P> const & x, vecType<T, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T normalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
|
||||
{
|
||||
return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename T, precision P, template <typename, precision> class vecType>
|
||||
GLM_FUNC_QUALIFIER T fastNormalizeDot(vecType<T, P> const & x, vecType<T, P> const & y)
|
||||
template<length_t L, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T fastNormalizeDot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
|
||||
{
|
||||
return glm::dot(x, y) * glm::fastInverseSqrt(glm::dot(x, x) * glm::dot(y, y));
|
||||
}
|
||||
|
||||
@@ -1,33 +1,5 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_number_precision
|
||||
/// @file glm/gtx/number_precision.hpp
|
||||
/// @date 2007-05-10 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_type_precision (dependence)
|
||||
@@ -35,11 +7,10 @@
|
||||
///
|
||||
/// @defgroup gtx_number_precision GLM_GTX_number_precision
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Defined size types.
|
||||
///
|
||||
/// <glm/gtx/number_precision.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/number_precision.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Defined size types.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -47,7 +18,11 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtc/type_precision.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_number_precision is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_number_precision extension included")
|
||||
#endif
|
||||
|
||||
@@ -55,7 +30,7 @@ namespace glm{
|
||||
namespace gtx
|
||||
{
|
||||
/////////////////////////////
|
||||
// Unsigned int vector types
|
||||
// Unsigned int vector types
|
||||
|
||||
/// @addtogroup gtx_number_precision
|
||||
/// @{
|
||||
@@ -66,18 +41,18 @@ namespace gtx
|
||||
typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension)
|
||||
|
||||
//////////////////////
|
||||
// Float vector types
|
||||
// Float vector types
|
||||
|
||||
typedef f32 f32vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f32 f32vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64vec1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
|
||||
//////////////////////
|
||||
// Float matrix types
|
||||
// Float matrix types
|
||||
|
||||
typedef f32 f32mat1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f32 f32mat1x1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64mat1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64mat1x1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f32 f32mat1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f32 f32mat1x1; //!< \brief Single-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64mat1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
typedef f64 f64mat1x1; //!< \brief Double-qualifier floating-point scalar. (from GLM_GTX_number_precision extension)
|
||||
|
||||
/// @}
|
||||
}//namespace gtx
|
||||
|
||||
@@ -1,34 +1,4 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_number_precision
|
||||
/// @file glm/gtx/number_precision.inl
|
||||
/// @date 2007-05-10 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_optimum_pow
|
||||
/// @file glm/gtx/optimum_pow.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Integer exponentiation of power functions.
|
||||
///
|
||||
/// <glm/gtx/optimum_pow.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/optimum_pow.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Integer exponentiation of power functions.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_optimum_pow is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_optimum_pow extension included")
|
||||
#endif
|
||||
|
||||
@@ -57,20 +32,20 @@ namespace gtx
|
||||
/// Returns x raised to the power of 2.
|
||||
///
|
||||
/// @see gtx_optimum_pow
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType pow2(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType pow2(genType const& x);
|
||||
|
||||
/// Returns x raised to the power of 3.
|
||||
///
|
||||
/// @see gtx_optimum_pow
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType pow3(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType pow3(genType const& x);
|
||||
|
||||
/// Returns x raised to the power of 4.
|
||||
///
|
||||
/// @see gtx_optimum_pow
|
||||
template <typename genType>
|
||||
GLM_FUNC_DECL genType pow4(genType const & x);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType pow4(genType const& x);
|
||||
|
||||
/// @}
|
||||
}//namespace gtx
|
||||
|
||||
@@ -1,51 +1,21 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_optimum_pow
|
||||
/// @file glm/gtx/optimum_pow.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow2(genType const & x)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow2(genType const& x)
|
||||
{
|
||||
return x * x;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow3(genType const & x)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow3(genType const& x)
|
||||
{
|
||||
return x * x * x;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow4(genType const & x)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow4(genType const& x)
|
||||
{
|
||||
return (x * x) * (x * x);
|
||||
}
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_orthonormalize
|
||||
/// @file glm/gtx/orthonormalize.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Orthonormalize matrices.
|
||||
///
|
||||
/// <glm/gtx/orthonormalize.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/orthonormalize.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Orthonormalize matrices.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -47,7 +18,11 @@
|
||||
#include "../mat3x3.hpp"
|
||||
#include "../geometric.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_orthonormalize is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_orthonormalize extension included")
|
||||
#endif
|
||||
|
||||
@@ -59,14 +34,14 @@ namespace glm
|
||||
/// Returns the orthonormalized matrix of m.
|
||||
///
|
||||
/// @see gtx_orthonormalize
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> orthonormalize(tmat3x3<T, P> const & m);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m);
|
||||
|
||||
/// Orthonormalizes x according y.
|
||||
///
|
||||
/// @see gtx_orthonormalize
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> orthonormalize(tvec3<T, P> const & x, tvec3<T, P> const & y);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,41 +1,11 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_orthonormalize
|
||||
/// @file glm/gtx/orthonormalize.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat3x3<T, P> orthonormalize(tmat3x3<T, P> const & m)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<3, 3, T, Q> orthonormalize(mat<3, 3, T, Q> const& m)
|
||||
{
|
||||
tmat3x3<T, P> r = m;
|
||||
mat<3, 3, T, Q> r = m;
|
||||
|
||||
r[0] = normalize(r[0]);
|
||||
|
||||
@@ -51,8 +21,8 @@ namespace glm
|
||||
return r;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> orthonormalize(tvec3<T, P> const & x, tvec3<T, P> const & y)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> orthonormalize(vec<3, T, Q> const& x, vec<3, T, Q> const& y)
|
||||
{
|
||||
return normalize(x - y * dot(y, x));
|
||||
}
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_perpendicular
|
||||
/// @file glm/gtx/perpendicular.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_projection (dependence)
|
||||
///
|
||||
/// @defgroup gtx_perpendicular GLM_GTX_perpendicular
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Perpendicular of a vector from other one
|
||||
///
|
||||
/// <glm/gtx/perpendicular.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/perpendicular.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Perpendicular of a vector from other one
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -46,7 +17,11 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtx/projection.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_perpendicular is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_perpendicular extension included")
|
||||
#endif
|
||||
|
||||
@@ -57,10 +32,8 @@ namespace glm
|
||||
|
||||
//! Projects x a perpendicular axis of Normal.
|
||||
//! From GLM_GTX_perpendicular extension.
|
||||
template <typename vecType>
|
||||
GLM_FUNC_DECL vecType perp(
|
||||
vecType const & x,
|
||||
vecType const & Normal);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType perp(genType const& x, genType const& Normal);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,43 +1,9 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_perpendicular
|
||||
/// @file glm/gtx/perpendicular.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename vecType>
|
||||
GLM_FUNC_QUALIFIER vecType perp
|
||||
(
|
||||
vecType const & x,
|
||||
vecType const & Normal
|
||||
)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType perp(genType const& x, genType const& Normal)
|
||||
{
|
||||
return x - proj(x, Normal);
|
||||
}
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_polar_coordinates
|
||||
/// @file glm/gtx/polar_coordinates.hpp
|
||||
/// @date 2007-03-06 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Conversion from Euclidean space to polar space and revert.
|
||||
///
|
||||
/// <glm/gtx/polar_coordinates.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/polar_coordinates.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Conversion from Euclidean space to polar space and revert.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_polar_coordinates is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_polar_coordinates extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,16 +31,16 @@ namespace glm
|
||||
/// Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude.
|
||||
///
|
||||
/// @see gtx_polar_coordinates
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> polar(
|
||||
tvec3<T, P> const & euclidean);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> polar(
|
||||
vec<3, T, Q> const& euclidean);
|
||||
|
||||
/// Convert Polar to Euclidean coordinates.
|
||||
///
|
||||
/// @see gtx_polar_coordinates
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> euclidean(
|
||||
tvec2<T, P> const & polar);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> euclidean(
|
||||
vec<2, T, Q> const& polar);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,63 +1,33 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_polar_coordinates
|
||||
/// @file glm/gtx/polar_coordinates.inl
|
||||
/// @date 2007-03-06 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> polar
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> polar
|
||||
(
|
||||
tvec3<T, P> const & euclidean
|
||||
vec<3, T, Q> const& euclidean
|
||||
)
|
||||
{
|
||||
T const Length(length(euclidean));
|
||||
tvec3<T, P> const tmp(euclidean / Length);
|
||||
vec<3, T, Q> const tmp(euclidean / Length);
|
||||
T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z));
|
||||
|
||||
return tvec3<T, P>(
|
||||
atan(xz_dist, tmp.y), // latitude
|
||||
return vec<3, T, Q>(
|
||||
asin(tmp.y), // latitude
|
||||
atan(tmp.x, tmp.z), // longitude
|
||||
xz_dist); // xz distance
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> euclidean
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> euclidean
|
||||
(
|
||||
tvec2<T, P> const & polar
|
||||
vec<2, T, Q> const& polar
|
||||
)
|
||||
{
|
||||
T const latitude(polar.x);
|
||||
T const longitude(polar.y);
|
||||
|
||||
return tvec3<T, P>(
|
||||
return vec<3, T, Q>(
|
||||
cos(latitude) * sin(longitude),
|
||||
sin(latitude),
|
||||
cos(latitude) * cos(longitude));
|
||||
|
||||
@@ -1,50 +1,25 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_projection
|
||||
/// @file glm/gtx/projection.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_projection GLM_GTX_projection
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Projection of a vector to other one
|
||||
///
|
||||
/// <glm/gtx/projection.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/projection.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Projection of a vector to other one
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../geometric.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_projection is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_projection extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,8 +31,8 @@ namespace glm
|
||||
/// Projects x on Normal.
|
||||
///
|
||||
/// @see gtx_projection
|
||||
template <typename vecType>
|
||||
GLM_FUNC_DECL vecType proj(vecType const & x, vecType const & Normal);
|
||||
template<typename genType>
|
||||
GLM_FUNC_DECL genType proj(genType const& x, genType const& Normal);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,39 +1,9 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_projection
|
||||
/// @file glm/gtx/projection.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename vecType>
|
||||
GLM_FUNC_QUALIFIER vecType proj(vecType const & x, vecType const & Normal)
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER genType proj(genType const& x, genType const& Normal)
|
||||
{
|
||||
return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;
|
||||
}
|
||||
|
||||
@@ -1,44 +1,15 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_quaternion
|
||||
/// @file glm/gtx/quaternion.hpp
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_extented_min_max (dependence)
|
||||
///
|
||||
/// @defgroup gtx_quaternion GLM_GTX_quaternion
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Extented quaternion types and functions
|
||||
///
|
||||
/// <glm/gtx/quaternion.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/quaternion.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Extented quaternion types and functions
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -46,9 +17,14 @@
|
||||
#include "../glm.hpp"
|
||||
#include "../gtc/constants.hpp"
|
||||
#include "../gtc/quaternion.hpp"
|
||||
#include "../ext/quaternion_exponential.hpp"
|
||||
#include "../gtx/norm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_quaternion is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_quaternion extension included")
|
||||
#endif
|
||||
|
||||
@@ -57,156 +33,140 @@ namespace glm
|
||||
/// @addtogroup gtx_quaternion
|
||||
/// @{
|
||||
|
||||
//! Compute a cross product between a quaternion and a vector.
|
||||
/// Create an identity quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> cross(
|
||||
tquat<T, P> const & q,
|
||||
tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> quat_identity();
|
||||
|
||||
/// Compute a cross product between a quaternion and a vector.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> cross(
|
||||
qua<T, Q> const& q,
|
||||
vec<3, T, Q> const& v);
|
||||
|
||||
//! Compute a cross product between a vector and a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> cross(
|
||||
tvec3<T, P> const & v,
|
||||
tquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> cross(
|
||||
vec<3, T, Q> const& v,
|
||||
qua<T, Q> const& q);
|
||||
|
||||
//! Compute a point on a path according squad equation.
|
||||
//! Compute a point on a path according squad equation.
|
||||
//! q1 and q2 are control points; s1 and s2 are intermediate control points.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> squad(
|
||||
tquat<T, P> const & q1,
|
||||
tquat<T, P> const & q2,
|
||||
tquat<T, P> const & s1,
|
||||
tquat<T, P> const & s2,
|
||||
T const & h);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> squad(
|
||||
qua<T, Q> const& q1,
|
||||
qua<T, Q> const& q2,
|
||||
qua<T, Q> const& s1,
|
||||
qua<T, Q> const& s2,
|
||||
T const& h);
|
||||
|
||||
//! Returns an intermediate control point for squad interpolation.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> intermediate(
|
||||
tquat<T, P> const & prev,
|
||||
tquat<T, P> const & curr,
|
||||
tquat<T, P> const & next);
|
||||
|
||||
//! Returns a exp of a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> exp(
|
||||
tquat<T, P> const & q);
|
||||
|
||||
//! Returns a log of a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> log(
|
||||
tquat<T, P> const & q);
|
||||
|
||||
/// Returns x raised to the y power.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> pow(
|
||||
tquat<T, P> const & x,
|
||||
T const & y);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> intermediate(
|
||||
qua<T, Q> const& prev,
|
||||
qua<T, Q> const& curr,
|
||||
qua<T, Q> const& next);
|
||||
|
||||
//! Returns quarternion square root.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
//template<typename T, precision P>
|
||||
//tquat<T, P> sqrt(
|
||||
// tquat<T, P> const & q);
|
||||
//template<typename T, qualifier Q>
|
||||
//qua<T, Q> sqrt(
|
||||
// qua<T, Q> const& q);
|
||||
|
||||
//! Rotates a 3 components vector by a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rotate(
|
||||
tquat<T, P> const & q,
|
||||
tvec3<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rotate(
|
||||
qua<T, Q> const& q,
|
||||
vec<3, T, Q> const& v);
|
||||
|
||||
/// Rotates a 4 components vector by a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> rotate(
|
||||
tquat<T, P> const & q,
|
||||
tvec4<T, P> const & v);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> rotate(
|
||||
qua<T, Q> const& q,
|
||||
vec<4, T, Q> const& v);
|
||||
|
||||
/// Extract the real component of a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T extractRealComponent(
|
||||
tquat<T, P> const & q);
|
||||
qua<T, Q> const& q);
|
||||
|
||||
/// Converts a quaternion to a 3 * 3 matrix.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tmat3x3<T, P> toMat3(
|
||||
tquat<T, P> const & x){return mat3_cast(x);}
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<3, 3, T, Q> toMat3(
|
||||
qua<T, Q> const& x){return mat3_cast(x);}
|
||||
|
||||
/// Converts a quaternion to a 4 * 4 matrix.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> toMat4(
|
||||
tquat<T, P> const & x){return mat4_cast(x);}
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> toMat4(
|
||||
qua<T, Q> const& x){return mat4_cast(x);}
|
||||
|
||||
/// Converts a 3 * 3 matrix to a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> toQuat(
|
||||
tmat3x3<T, P> const & x){return quat_cast(x);}
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> toQuat(
|
||||
mat<3, 3, T, Q> const& x){return quat_cast(x);}
|
||||
|
||||
/// Converts a 4 * 4 matrix to a quaternion.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> toQuat(
|
||||
tmat4x4<T, P> const & x){return quat_cast(x);}
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> toQuat(
|
||||
mat<4, 4, T, Q> const& x){return quat_cast(x);}
|
||||
|
||||
/// Quaternion interpolation using the rotation short path.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> shortMix(
|
||||
tquat<T, P> const & x,
|
||||
tquat<T, P> const & y,
|
||||
T const & a);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> shortMix(
|
||||
qua<T, Q> const& x,
|
||||
qua<T, Q> const& y,
|
||||
T const& a);
|
||||
|
||||
/// Quaternion normalized linear interpolation.
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> fastMix(
|
||||
tquat<T, P> const & x,
|
||||
tquat<T, P> const & y,
|
||||
T const & a);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> fastMix(
|
||||
qua<T, Q> const& x,
|
||||
qua<T, Q> const& y,
|
||||
T const& a);
|
||||
|
||||
/// Compute the rotation between two vectors.
|
||||
/// param orig vector, needs to be normalized
|
||||
/// param dest vector, needs to be normalized
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> rotation(
|
||||
tvec3<T, P> const & orig,
|
||||
tvec3<T, P> const & dest);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> rotation(
|
||||
vec<3, T, Q> const& orig,
|
||||
vec<3, T, Q> const& dest);
|
||||
|
||||
/// Returns the squared length of x.
|
||||
///
|
||||
///
|
||||
/// @see gtx_quaternion
|
||||
template<typename T, precision P>
|
||||
GLM_FUNC_DECL T length2(tquat<T, P> const & q);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL T length2(qua<T, Q> const& q);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,174 +1,66 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_quaternion
|
||||
/// @file glm/gtx/quaternion.inl
|
||||
/// @date 2005-12-21 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <limits>
|
||||
#include "../gtc/constants.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> cross
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
tquat<T, P> const & q
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> quat_identity()
|
||||
{
|
||||
return qua<T, Q>(static_cast<T>(1), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> cross(vec<3, T, Q> const& v, qua<T, Q> const& q)
|
||||
{
|
||||
return inverse(q) * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> cross
|
||||
(
|
||||
tquat<T, P> const & q,
|
||||
tvec3<T, P> const & v
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> cross(qua<T, Q> const& q, vec<3, T, Q> const& v)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> squad
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> squad
|
||||
(
|
||||
tquat<T, P> const & q1,
|
||||
tquat<T, P> const & q2,
|
||||
tquat<T, P> const & s1,
|
||||
tquat<T, P> const & s2,
|
||||
T const & h)
|
||||
qua<T, Q> const& q1,
|
||||
qua<T, Q> const& q2,
|
||||
qua<T, Q> const& s1,
|
||||
qua<T, Q> const& s2,
|
||||
T const& h)
|
||||
{
|
||||
return mix(mix(q1, q2, h), mix(s1, s2, h), static_cast<T>(2) * (static_cast<T>(1) - h) * h);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> intermediate
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> intermediate
|
||||
(
|
||||
tquat<T, P> const & prev,
|
||||
tquat<T, P> const & curr,
|
||||
tquat<T, P> const & next
|
||||
qua<T, Q> const& prev,
|
||||
qua<T, Q> const& curr,
|
||||
qua<T, Q> const& next
|
||||
)
|
||||
{
|
||||
tquat<T, P> invQuat = inverse(curr);
|
||||
return exp((log(next + invQuat) + log(prev + invQuat)) / static_cast<T>(-4)) * curr;
|
||||
qua<T, Q> invQuat = inverse(curr);
|
||||
return exp((log(next * invQuat) + log(prev * invQuat)) / static_cast<T>(-4)) * curr;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> exp
|
||||
(
|
||||
tquat<T, P> const & q
|
||||
)
|
||||
{
|
||||
tvec3<T, P> u(q.x, q.y, q.z);
|
||||
T Angle = glm::length(u);
|
||||
if (Angle < epsilon<T>())
|
||||
return tquat<T, P>();
|
||||
|
||||
tvec3<T, P> v(u / Angle);
|
||||
return tquat<T, P>(cos(Angle), sin(Angle) * v);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> log
|
||||
(
|
||||
tquat<T, P> const & q
|
||||
)
|
||||
{
|
||||
tvec3<T, P> u(q.x, q.y, q.z);
|
||||
T Vec3Len = length(u);
|
||||
|
||||
if (Vec3Len < epsilon<T>())
|
||||
{
|
||||
if(q.w > static_cast<T>(0))
|
||||
return tquat<T, P>(log(q.w), static_cast<T>(0), static_cast<T>(0), static_cast<T>(0));
|
||||
else if(q.w < static_cast<T>(0))
|
||||
return tquat<T, P>(log(-q.w), pi<T>(), static_cast<T>(0), static_cast<T>(0));
|
||||
else
|
||||
return tquat<T, P>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());
|
||||
}
|
||||
else
|
||||
{
|
||||
T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w);
|
||||
T t = atan(Vec3Len, T(q.w)) / Vec3Len;
|
||||
return tquat<T, P>(log(QuatLen), t * q.x, t * q.y, t * q.z);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> pow(tquat<T, P> const & x, T const & y)
|
||||
{
|
||||
//Raising to the power of 0 should yield 1
|
||||
//Needed to prevent a division by 0 error later on
|
||||
if(y > -epsilon<T>() && y < epsilon<T>())
|
||||
return tquat<T, P>(1,0,0,0);
|
||||
|
||||
//To deal with non-unit quaternions
|
||||
T magnitude = sqrt(x.x * x.x + x.y * x.y + x.z * x.z + x.w *x.w);
|
||||
|
||||
//Equivalent to raising a real number to a power
|
||||
//Needed to prevent a division by 0 error later on
|
||||
if(abs(x.w / magnitude) > static_cast<T>(1) - epsilon<T>() && abs(x.w / magnitude) < static_cast<T>(1) + epsilon<T>())
|
||||
return tquat<T, P>(pow(x.w, y),0,0,0);
|
||||
|
||||
T Angle = acos(x.w / magnitude);
|
||||
T NewAngle = Angle * y;
|
||||
T Div = sin(NewAngle) / sin(Angle);
|
||||
T Mag = pow(magnitude, y-1);
|
||||
|
||||
return tquat<T, P>(cos(NewAngle) * magnitude * Mag, x.x * Div * Mag, x.y * Div * Mag, x.z * Div * Mag);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotate
|
||||
(
|
||||
tquat<T, P> const & q,
|
||||
tvec3<T, P> const & v
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotate(qua<T, Q> const& q, vec<3, T, Q> const& v)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> rotate
|
||||
(
|
||||
tquat<T, P> const & q,
|
||||
tvec4<T, P> const & v
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> rotate(qua<T, Q> const& q, vec<4, T, Q> const& v)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T extractRealComponent
|
||||
(
|
||||
tquat<T, P> const & q
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T extractRealComponent(qua<T, Q> const& q)
|
||||
{
|
||||
T w = static_cast<T>(1) - q.x * q.x - q.y * q.y - q.z * q.z;
|
||||
if(w < T(0))
|
||||
@@ -177,28 +69,20 @@ namespace glm
|
||||
return -sqrt(w);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
tquat<T, P> const & q
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER T length2(qua<T, Q> const& q)
|
||||
{
|
||||
return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> shortMix
|
||||
(
|
||||
tquat<T, P> const & x,
|
||||
tquat<T, P> const & y,
|
||||
T const & a
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> shortMix(qua<T, Q> const& x, qua<T, Q> const& y, T const& a)
|
||||
{
|
||||
if(a <= static_cast<T>(0)) return x;
|
||||
if(a >= static_cast<T>(1)) return y;
|
||||
|
||||
T fCos = dot(x, y);
|
||||
tquat<T, P> y2(y); //BUG!!! tquat<T> y2;
|
||||
qua<T, Q> y2(y); //BUG!!! qua<T> y2;
|
||||
if(fCos < static_cast<T>(0))
|
||||
{
|
||||
y2 = -y;
|
||||
@@ -221,36 +105,29 @@ namespace glm
|
||||
k1 = sin((static_cast<T>(0) + a) * fAngle) * fOneOverSin;
|
||||
}
|
||||
|
||||
return tquat<T, P>(
|
||||
return qua<T, Q>(
|
||||
k0 * x.w + k1 * y2.w,
|
||||
k0 * x.x + k1 * y2.x,
|
||||
k0 * x.y + k1 * y2.y,
|
||||
k0 * x.z + k1 * y2.z);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> fastMix
|
||||
(
|
||||
tquat<T, P> const & x,
|
||||
tquat<T, P> const & y,
|
||||
T const & a
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> fastMix(qua<T, Q> const& x, qua<T, Q> const& y, T const& a)
|
||||
{
|
||||
return glm::normalize(x * (static_cast<T>(1) - a) + (y * a));
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> rotation
|
||||
(
|
||||
tvec3<T, P> const & orig,
|
||||
tvec3<T, P> const & dest
|
||||
)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> rotation(vec<3, T, Q> const& orig, vec<3, T, Q> const& dest)
|
||||
{
|
||||
T cosTheta = dot(orig, dest);
|
||||
tvec3<T, P> rotationAxis;
|
||||
vec<3, T, Q> rotationAxis;
|
||||
|
||||
if(cosTheta >= static_cast<T>(1) - epsilon<T>())
|
||||
return quat();
|
||||
if(cosTheta >= static_cast<T>(1) - epsilon<T>()) {
|
||||
// orig and dest point in the same direction
|
||||
return quat_identity<T,Q>();
|
||||
}
|
||||
|
||||
if(cosTheta < static_cast<T>(-1) + epsilon<T>())
|
||||
{
|
||||
@@ -259,9 +136,9 @@ namespace glm
|
||||
// So guess one; any will do as long as it's perpendicular to start
|
||||
// This implementation favors a rotation around the Up axis (Y),
|
||||
// since it's often what you want to do.
|
||||
rotationAxis = cross(tvec3<T, P>(0, 0, 1), orig);
|
||||
rotationAxis = cross(vec<3, T, Q>(0, 0, 1), orig);
|
||||
if(length2(rotationAxis) < epsilon<T>()) // bad luck, they were parallel, try again!
|
||||
rotationAxis = cross(tvec3<T, P>(1, 0, 0), orig);
|
||||
rotationAxis = cross(vec<3, T, Q>(1, 0, 0), orig);
|
||||
|
||||
rotationAxis = normalize(rotationAxis);
|
||||
return angleAxis(pi<T>(), rotationAxis);
|
||||
@@ -273,11 +150,10 @@ namespace glm
|
||||
T s = sqrt((T(1) + cosTheta) * static_cast<T>(2));
|
||||
T invs = static_cast<T>(1) / s;
|
||||
|
||||
return tquat<T, P>(
|
||||
s * static_cast<T>(0.5f),
|
||||
return qua<T, Q>(
|
||||
s * static_cast<T>(0.5f),
|
||||
rotationAxis.x * invs,
|
||||
rotationAxis.y * invs,
|
||||
rotationAxis.z * invs);
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,102 +1,98 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_range
|
||||
/// @file glm/gtx/range.hpp
|
||||
/// @date 2014-09-19 / 2014-09-19
|
||||
/// @author Joshua Moerman
|
||||
///
|
||||
/// @defgroup gtx_range GLM_GTX_range
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Defines begin and end for vectors and matrices. Useful for range-based for loop.
|
||||
/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements).
|
||||
/// Include <glm/gtx/range.hpp> to use the features of this extension.
|
||||
///
|
||||
/// <glm/gtx/range.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// Defines begin and end for vectors and matrices. Useful for range-based for loop.
|
||||
/// The range is defined over the elements, not over columns or rows (e.g. mat4 has 16 elements).
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../detail/setup.hpp"
|
||||
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if !GLM_HAS_RANGE_FOR
|
||||
# error "GLM_GTX_range requires C++11 suppport or 'range for'"
|
||||
#endif
|
||||
|
||||
#include "../gtc/type_ptr.hpp"
|
||||
#include "../gtc/vec1.hpp"
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
namespace glm
|
||||
{
|
||||
/* The glm types provide a .length() member, but for matrices
|
||||
this only defines the number of columns, so we need to work around this */
|
||||
template <typename T, precision P>
|
||||
detail::component_count_t number_of_elements_(tvec2<T, P> const & v){
|
||||
return detail::component_count(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
detail::component_count_t number_of_elements_(tvec3<T, P> const & v){
|
||||
return detail::component_count(v);
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
detail::component_count_t number_of_elements_(tvec4<T, P> const & v){
|
||||
return detail::component_count(v);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
detail::component_count_t number_of_elements_(genType const & m){
|
||||
return detail::component_count(m) * detail::component_count(m[0]);
|
||||
}
|
||||
}//namespace
|
||||
|
||||
/// @addtogroup gtx_range
|
||||
/// @{
|
||||
|
||||
template <typename genType>
|
||||
const typename genType::value_type * begin(genType const & v){
|
||||
# if GLM_COMPILER & GLM_COMPILER_VC
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable : 4100) // unreferenced formal parameter
|
||||
# endif
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<1, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<2, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<3, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
inline length_t components(vec<4, T, Q> const& v)
|
||||
{
|
||||
return v.length();
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline length_t components(genType const& m)
|
||||
{
|
||||
return m.length() * m[0].length();
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
inline typename genType::value_type const * begin(genType const& v)
|
||||
{
|
||||
return value_ptr(v);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
const typename genType::value_type * end(genType const & v){
|
||||
return begin(v) + detail::number_of_elements_(v);
|
||||
template<typename genType>
|
||||
inline typename genType::value_type const * end(genType const& v)
|
||||
{
|
||||
return begin(v) + components(v);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
typename genType::value_type * begin(genType& v){
|
||||
template<typename genType>
|
||||
inline typename genType::value_type * begin(genType& v)
|
||||
{
|
||||
return value_ptr(v);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
typename genType::value_type * end(genType& v){
|
||||
return begin(v) + detail::number_of_elements_(v);
|
||||
template<typename genType>
|
||||
inline typename genType::value_type * end(genType& v)
|
||||
{
|
||||
return begin(v) + components(v);
|
||||
}
|
||||
|
||||
# if GLM_COMPILER & GLM_COMPILER_VC
|
||||
# pragma warning(pop)
|
||||
# endif
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,51 +1,26 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_raw_data
|
||||
/// @file glm/gtx/raw_data.hpp
|
||||
/// @date 2008-11-19 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
///
|
||||
/// @defgroup gtx_raw_data GLM_GTX_raw_data
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Projection of a vector to other one
|
||||
///
|
||||
/// <glm/gtx/raw_data.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/raw_data.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Projection of a vector to other one
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependencies
|
||||
#include "../ext/scalar_uint_sized.hpp"
|
||||
#include "../detail/setup.hpp"
|
||||
#include "../detail/type_int.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_raw_data is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_raw_data extension included")
|
||||
#endif
|
||||
|
||||
@@ -54,19 +29,19 @@ namespace glm
|
||||
/// @addtogroup gtx_raw_data
|
||||
/// @{
|
||||
|
||||
//! Type for byte numbers.
|
||||
//! Type for byte numbers.
|
||||
//! From GLM_GTX_raw_data extension.
|
||||
typedef detail::uint8 byte;
|
||||
|
||||
//! Type for word numbers.
|
||||
//! Type for word numbers.
|
||||
//! From GLM_GTX_raw_data extension.
|
||||
typedef detail::uint16 word;
|
||||
|
||||
//! Type for dword numbers.
|
||||
//! Type for dword numbers.
|
||||
//! From GLM_GTX_raw_data extension.
|
||||
typedef detail::uint32 dword;
|
||||
|
||||
//! Type for qword numbers.
|
||||
//! Type for qword numbers.
|
||||
//! From GLM_GTX_raw_data extension.
|
||||
typedef detail::uint64 qword;
|
||||
|
||||
|
||||
@@ -1,31 +1,2 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_raw_data
|
||||
/// @file glm/gtx/raw_data.inl
|
||||
/// @date 2008-11-19 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -1,45 +1,16 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_rotate_normalized_axis
|
||||
/// @file glm/gtx/rotate_normalized_axis.hpp
|
||||
/// @date 2012-12-13 / 2012-12-13
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtc_matrix_transform
|
||||
/// @see gtc_quaternion
|
||||
///
|
||||
///
|
||||
/// @defgroup gtx_rotate_normalized_axis GLM_GTX_rotate_normalized_axis
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Quaternions and matrices rotations around normalized axis.
|
||||
///
|
||||
/// <glm/gtx/rotate_normalized_axis.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/rotate_normalized_axis.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Quaternions and matrices rotations around normalized axis.
|
||||
|
||||
#pragma once
|
||||
|
||||
@@ -48,7 +19,11 @@
|
||||
#include "../gtc/epsilon.hpp"
|
||||
#include "../gtc/quaternion.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_rotate_normalized_axis is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_rotate_normalized_axis extension included")
|
||||
#endif
|
||||
|
||||
@@ -57,35 +32,35 @@ namespace glm
|
||||
/// @addtogroup gtx_rotate_normalized_axis
|
||||
/// @{
|
||||
|
||||
/// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle.
|
||||
///
|
||||
/// Builds a rotation 4 * 4 matrix created from a normalized axis and an angle.
|
||||
///
|
||||
/// @param m Input matrix multiplied by this rotation matrix.
|
||||
/// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise.
|
||||
/// @param angle Rotation angle expressed in radians.
|
||||
/// @param axis Rotation axis, must be normalized.
|
||||
/// @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 recommended), float or double.
|
||||
///
|
||||
/// @see gtx_rotate_normalized_axis
|
||||
/// @see - rotate(T angle, T x, T y, T z)
|
||||
/// @see - rotate(tmat4x4<T, P> const & m, T angle, T x, T y, T z)
|
||||
/// @see - rotate(T angle, tvec3<T, P> const & v)
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> rotateNormalizedAxis(
|
||||
tmat4x4<T, P> const & m,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & axis);
|
||||
/// @see - rotate(T angle, T x, T y, T z)
|
||||
/// @see - rotate(mat<4, 4, T, Q> const& m, T angle, T x, T y, T z)
|
||||
/// @see - rotate(T angle, vec<3, T, Q> const& v)
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> rotateNormalizedAxis(
|
||||
mat<4, 4, T, Q> const& m,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& axis);
|
||||
|
||||
/// Rotates a quaternion from a vector of 3 components normalized axis and an angle.
|
||||
///
|
||||
///
|
||||
/// @param q Source orientation
|
||||
/// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise.
|
||||
/// @param angle Angle expressed in radians.
|
||||
/// @param axis Normalized axis of the rotation, must be normalized.
|
||||
///
|
||||
///
|
||||
/// @see gtx_rotate_normalized_axis
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tquat<T, P> rotateNormalizedAxis(
|
||||
tquat<T, P> const & q,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & axis);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL qua<T, Q> rotateNormalizedAxis(
|
||||
qua<T, Q> const& q,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& axis);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,54 +1,24 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2012 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_rotate_normalized_axis
|
||||
/// @file glm/gtx/rotate_normalized_axis.inl
|
||||
/// @date 2012-12-13 / 2012-12-13
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> rotateNormalizedAxis
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> rotateNormalizedAxis
|
||||
(
|
||||
tmat4x4<T, P> const & m,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & v
|
||||
mat<4, 4, T, Q> const& m,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& v
|
||||
)
|
||||
{
|
||||
T const a = angle;
|
||||
T const c = cos(a);
|
||||
T const s = sin(a);
|
||||
|
||||
tvec3<T, P> const axis(v);
|
||||
vec<3, T, Q> const axis(v);
|
||||
|
||||
tvec3<T, P> const temp((static_cast<T>(1) - c) * axis);
|
||||
vec<3, T, Q> const temp((static_cast<T>(1) - c) * axis);
|
||||
|
||||
tmat4x4<T, P> Rotate(uninitialize);
|
||||
mat<4, 4, T, Q> Rotate;
|
||||
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];
|
||||
@@ -61,7 +31,7 @@ namespace glm
|
||||
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
|
||||
Rotate[2][2] = c + temp[2] * axis[2];
|
||||
|
||||
tmat4x4<T, P> Result(uninitialize);
|
||||
mat<4, 4, T, Q> Result;
|
||||
Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
|
||||
Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
|
||||
Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
|
||||
@@ -69,20 +39,20 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tquat<T, P> rotateNormalizedAxis
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER qua<T, Q> rotateNormalizedAxis
|
||||
(
|
||||
tquat<T, P> const & q,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & v
|
||||
qua<T, Q> const& q,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& v
|
||||
)
|
||||
{
|
||||
tvec3<T, P> const Tmp(v);
|
||||
vec<3, T, Q> const Tmp(v);
|
||||
|
||||
T const AngleRad(angle);
|
||||
T const Sin = sin(AngleRad * T(0.5));
|
||||
|
||||
return q * tquat<T, P>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);
|
||||
//return gtc::quaternion::cross(q, tquat<T, P>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));
|
||||
return q * qua<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);
|
||||
//return gtc::quaternion::cross(q, tquat<T, Q>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,52 +1,29 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_rotate_vector
|
||||
/// @file glm/gtx/rotate_vector.hpp
|
||||
/// @date 2006-11-02 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///
|
||||
/// @see core (dependence)
|
||||
/// @see gtx_transform (dependence)
|
||||
///
|
||||
/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector
|
||||
/// @ingroup gtx
|
||||
///
|
||||
/// @brief Function to directly rotate a vector
|
||||
///
|
||||
/// <glm/gtx/rotate_vector.hpp> need to be included to use these functionalities.
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Include <glm/gtx/rotate_vector.hpp> to use the features of this extension.
|
||||
///
|
||||
/// Function to directly rotate a vector
|
||||
|
||||
#pragma once
|
||||
|
||||
// Dependency:
|
||||
#include "../glm.hpp"
|
||||
#include "../gtx/transform.hpp"
|
||||
#include "../gtc/epsilon.hpp"
|
||||
#include "../ext/vector_relational.hpp"
|
||||
#include "../glm.hpp"
|
||||
|
||||
#if(defined(GLM_MESSAGES) && !defined(GLM_EXT_INCLUDED))
|
||||
#ifndef GLM_ENABLE_EXPERIMENTAL
|
||||
# error "GLM: GLM_GTX_rotate_vector is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
|
||||
#endif
|
||||
|
||||
#if GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
|
||||
# pragma message("GLM: GLM_GTX_rotate_vector extension included")
|
||||
#endif
|
||||
|
||||
@@ -56,89 +33,89 @@ namespace glm
|
||||
/// @{
|
||||
|
||||
/// Returns Spherical interpolation between two vectors
|
||||
///
|
||||
///
|
||||
/// @param x A first vector
|
||||
/// @param y A second vector
|
||||
/// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1].
|
||||
///
|
||||
///
|
||||
/// @see gtx_rotate_vector
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> slerp(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y,
|
||||
T const & a);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> slerp(
|
||||
vec<3, T, Q> const& x,
|
||||
vec<3, T, Q> const& y,
|
||||
T const& a);
|
||||
|
||||
//! Rotate a two dimensional vector.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec2<T, P> rotate(
|
||||
tvec2<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<2, T, Q> rotate(
|
||||
vec<2, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a three dimensional vector around an axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rotate(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & normal);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rotate(
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& normal);
|
||||
|
||||
//! Rotate a four dimensional vector around an axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> rotate(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & normal);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> rotate(
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& normal);
|
||||
|
||||
//! Rotate a three dimensional vector around the X axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rotateX(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rotateX(
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a three dimensional vector around the Y axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rotateY(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rotateY(
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a three dimensional vector around the Z axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec3<T, P> rotateZ(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
//! Rotate a four dimentionnals vector around the X axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> rotateX(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<3, T, Q> rotateZ(
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a four dimensional vector around the X axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> rotateY(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
//! Rotate a four dimensional vector around the X axis.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> rotateX(
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a four dimensional vector around the Y axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tvec4<T, P> rotateZ(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle);
|
||||
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> rotateY(
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Rotate a four dimensional vector around the Z axis.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL vec<4, T, Q> rotateZ(
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle);
|
||||
|
||||
//! Build a rotation matrix from a normal and a up vector.
|
||||
//! From GLM_GTX_rotate_vector extension.
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_DECL tmat4x4<T, P> orientation(
|
||||
tvec3<T, P> const & Normal,
|
||||
tvec3<T, P> const & Up);
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_DECL mat<4, 4, T, Q> orientation(
|
||||
vec<3, T, Q> const& Normal,
|
||||
vec<3, T, Q> const& Up);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
||||
@@ -1,43 +1,13 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
/// OpenGL Mathematics (glm.g-truc.net)
|
||||
///
|
||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
|
||||
/// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
/// of this software and associated documentation files (the "Software"), to deal
|
||||
/// in the Software without restriction, including without limitation the rights
|
||||
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
/// copies of the Software, and to permit persons to whom the Software is
|
||||
/// furnished to do so, subject to the following conditions:
|
||||
///
|
||||
/// The above copyright notice and this permission notice shall be included in
|
||||
/// all copies or substantial portions of the Software.
|
||||
///
|
||||
/// Restrictions:
|
||||
/// By making use of the Software for military purposes, you choose to make
|
||||
/// a Bunny unhappy.
|
||||
///
|
||||
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtx_rotate_vector
|
||||
/// @file glm/gtx/rotate_vector.inl
|
||||
/// @date 2006-11-02 / 2011-06-07
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> slerp
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> slerp
|
||||
(
|
||||
tvec3<T, P> const & x,
|
||||
tvec3<T, P> const & y,
|
||||
T const & a
|
||||
vec<3, T, Q> const& x,
|
||||
vec<3, T, Q> const& y,
|
||||
T const& a
|
||||
)
|
||||
{
|
||||
// get cosine of angle between vectors (-1 -> 1)
|
||||
@@ -54,14 +24,14 @@ namespace glm
|
||||
return x * t1 + y * t2;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec2<T, P> rotate
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<2, T, Q> rotate
|
||||
(
|
||||
tvec2<T, P> const & v,
|
||||
T const & angle
|
||||
vec<2, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec2<T, P> Result;
|
||||
vec<2, T, Q> Result;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -70,47 +40,47 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotate
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotate
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & normal
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& normal
|
||||
)
|
||||
{
|
||||
return tmat3x3<T, P>(glm::rotate(angle, normal)) * v;
|
||||
return mat<3, 3, T, Q>(glm::rotate(angle, normal)) * v;
|
||||
}
|
||||
/*
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotateGTX(
|
||||
const tvec3<T, P>& x,
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotateGTX(
|
||||
const vec<3, T, Q>& x,
|
||||
T angle,
|
||||
const tvec3<T, P>& normal)
|
||||
const vec<3, T, Q>& normal)
|
||||
{
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin;
|
||||
}
|
||||
*/
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> rotate
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> rotate
|
||||
(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle,
|
||||
tvec3<T, P> const & normal
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle,
|
||||
vec<3, T, Q> const& normal
|
||||
)
|
||||
{
|
||||
return rotate(angle, normal) * v;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotateX
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotateX
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec3<T, P> Result(v);
|
||||
vec<3, T, Q> Result(v);
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -119,14 +89,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotateY
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotateY
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec3<T, P> Result = v;
|
||||
vec<3, T, Q> Result = v;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -135,14 +105,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec3<T, P> rotateZ
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<3, T, Q> rotateZ
|
||||
(
|
||||
tvec3<T, P> const & v,
|
||||
T const & angle
|
||||
vec<3, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec3<T, P> Result = v;
|
||||
vec<3, T, Q> Result = v;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -151,14 +121,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> rotateX
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> rotateX
|
||||
(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec4<T, P> Result = v;
|
||||
vec<4, T, Q> Result = v;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -167,14 +137,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> rotateY
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> rotateY
|
||||
(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec4<T, P> Result = v;
|
||||
vec<4, T, Q> Result = v;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -183,14 +153,14 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tvec4<T, P> rotateZ
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER vec<4, T, Q> rotateZ
|
||||
(
|
||||
tvec4<T, P> const & v,
|
||||
T const & angle
|
||||
vec<4, T, Q> const& v,
|
||||
T const& angle
|
||||
)
|
||||
{
|
||||
tvec4<T, P> Result = v;
|
||||
vec<4, T, Q> Result = v;
|
||||
T const Cos(cos(angle));
|
||||
T const Sin(sin(angle));
|
||||
|
||||
@@ -199,17 +169,17 @@ namespace glm
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, precision P>
|
||||
GLM_FUNC_QUALIFIER tmat4x4<T, P> orientation
|
||||
template<typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> orientation
|
||||
(
|
||||
tvec3<T, P> const & Normal,
|
||||
tvec3<T, P> const & Up
|
||||
vec<3, T, Q> const& Normal,
|
||||
vec<3, T, Q> const& Up
|
||||
)
|
||||
{
|
||||
if(all(equal(Normal, Up)))
|
||||
return tmat4x4<T, P>(T(1));
|
||||
if(all(equal(Normal, Up, epsilon<T>())))
|
||||
return mat<4, 4, T, Q>(static_cast<T>(1));
|
||||
|
||||
tvec3<T, P> RotationAxis = cross(Up, Normal);
|
||||
vec<3, T, Q> RotationAxis = cross(Up, Normal);
|
||||
T Angle = acos(dot(Normal, Up));
|
||||
|
||||
return rotate(Angle, RotationAxis);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user