mirror of
https://github.com/g-truc/glm.git
synced 2025-04-08 06:43:10 +00:00
Merge branch 'swizzle' of ssh://ogl-math.git.sourceforge.net/gitroot/ogl-math/ogl-math into swizzle
This commit is contained in:
commit
12f0a2a20b
79 changed files with 7994 additions and 11369 deletions
|
@ -26,7 +26,7 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define VECTORIZE_1PARAM(func) \
|
||||
#define VECTORIZE2_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> func( \
|
||||
detail::tvec2<T> const & v) \
|
||||
|
@ -34,8 +34,9 @@
|
|||
return detail::tvec2<T>( \
|
||||
func(v.x), \
|
||||
func(v.y)); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define VECTORIZE3_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> func( \
|
||||
detail::tvec3<T> const & v) \
|
||||
|
@ -44,8 +45,9 @@
|
|||
func(v.x), \
|
||||
func(v.y), \
|
||||
func(v.z)); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define VECTORIZE4_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> func( \
|
||||
detail::tvec4<T> const & v) \
|
||||
|
@ -57,7 +59,59 @@
|
|||
func(v.w)); \
|
||||
}
|
||||
|
||||
#define VECTORIZE_2PARAMS(func) \
|
||||
#define VECTORIZE_VEC(func) \
|
||||
VECTORIZE2_VEC(func) \
|
||||
VECTORIZE3_VEC(func) \
|
||||
VECTORIZE4_VEC(func)
|
||||
|
||||
#define VECTORIZE2_VEC_SCA(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> func \
|
||||
( \
|
||||
detail::tvec2<T> const & x, \
|
||||
typename detail::tvec2<T>::value_type const & y \
|
||||
) \
|
||||
{ \
|
||||
return detail::tvec2<T>( \
|
||||
func(x.x, y), \
|
||||
func(x.y, y)); \
|
||||
}
|
||||
|
||||
#define VECTORIZE3_VEC_SCA(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> func \
|
||||
( \
|
||||
detail::tvec3<T> const & x, \
|
||||
typename detail::tvec3<T>::value_type const & y \
|
||||
) \
|
||||
{ \
|
||||
return detail::tvec3<T>( \
|
||||
func(x.x, y), \
|
||||
func(x.y, y), \
|
||||
func(x.z, y)); \
|
||||
}
|
||||
|
||||
#define VECTORIZE4_VEC_SCA(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> func \
|
||||
( \
|
||||
detail::tvec4<T> const & x, \
|
||||
typename detail::tvec4<T>::value_type const & y \
|
||||
) \
|
||||
{ \
|
||||
return detail::tvec4<T>( \
|
||||
func(x.x, y), \
|
||||
func(x.y, y), \
|
||||
func(x.z, y), \
|
||||
func(x.w, y)); \
|
||||
}
|
||||
|
||||
#define VECTORIZE_VEC_SCA(func) \
|
||||
VECTORIZE2_VEC_SCA(func) \
|
||||
VECTORIZE3_VEC_SCA(func) \
|
||||
VECTORIZE4_VEC_SCA(func)
|
||||
|
||||
#define VECTORIZE2_VEC_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> func \
|
||||
( \
|
||||
|
@ -68,8 +122,9 @@
|
|||
return detail::tvec2<T>( \
|
||||
func(x.x, y.x), \
|
||||
func(x.y, y.y)); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define VECTORIZE3_VEC_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> func \
|
||||
( \
|
||||
|
@ -81,8 +136,9 @@
|
|||
func(x.x, y.x), \
|
||||
func(x.y, y.y), \
|
||||
func(x.z, y.z)); \
|
||||
} \
|
||||
\
|
||||
}
|
||||
|
||||
#define VECTORIZE4_VEC_VEC(func) \
|
||||
template <typename T> \
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> func \
|
||||
( \
|
||||
|
@ -96,3 +152,8 @@
|
|||
func(x.z, y.z), \
|
||||
func(x.w, y.w)); \
|
||||
}
|
||||
|
||||
#define VECTORIZE_VEC_VEC(func) \
|
||||
VECTORIZE2_VEC_VEC(func) \
|
||||
VECTORIZE3_VEC_VEC(func) \
|
||||
VECTORIZE4_VEC_VEC(func)
|
||||
|
|
|
@ -44,72 +44,90 @@ namespace glm
|
|||
/// @{
|
||||
|
||||
/// Returns x if x >= 0; otherwise, it returns -x.
|
||||
///
|
||||
/// @tparam genType floating-point or signed integer; scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs 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</a>
|
||||
template <typename genFIType>
|
||||
genFIType abs(genFIType const & x);
|
||||
template <typename genType>
|
||||
genType abs(genType const & x);
|
||||
|
||||
/// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0.
|
||||
///
|
||||
///
|
||||
/// @tparam genType Floating-point or signed integer; scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml">GLSL sign 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</a>
|
||||
template <typename genFIType>
|
||||
genFIType sign(genFIType const & x);
|
||||
template <typename genType>
|
||||
genType sign(genType const & x);
|
||||
|
||||
//! Returns a value equal to the nearest integer that is less then or equal to x.
|
||||
//!
|
||||
/// Returns a value equal to the nearest integer that is less then or equal to x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml">GLSL floor 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</a>
|
||||
template <typename genType>
|
||||
genType floor(genType const & x);
|
||||
|
||||
//! Returns a value equal to the nearest integer to x
|
||||
//! whose absolute value is not larger than the absolute value of x.
|
||||
//!
|
||||
/// Returns a value equal to the nearest integer to x
|
||||
/// whose absolute value is not larger than the absolute value of x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml">GLSL trunc 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</a>
|
||||
template <typename genType>
|
||||
genType trunc(genType const & x);
|
||||
|
||||
//! Returns a value equal to the nearest integer to x.
|
||||
//! The fraction 0.5 will round in a direction chosen by the
|
||||
//! implementation, presumably the direction that is fastest.
|
||||
//! This includes the possibility that round(x) returns the
|
||||
//! same value as roundEven(x) for all values of x.
|
||||
//!
|
||||
/// Returns a value equal to the nearest integer to x.
|
||||
/// The fraction 0.5 will round in a direction chosen by the
|
||||
/// implementation, presumably the direction that is fastest.
|
||||
/// This includes the possibility that round(x) returns the
|
||||
/// same value as roundEven(x) for all values of x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round 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</a>
|
||||
template <typename genType>
|
||||
genType round(genType const & x);
|
||||
|
||||
//! Returns a value equal to the nearest integer to x.
|
||||
//! A fractional part of 0.5 will round toward the nearest even
|
||||
//! integer. (Both 3.5 and 4.5 for x will return 4.0.)
|
||||
//!
|
||||
/// Returns a value equal to the nearest integer to x.
|
||||
/// A fractional part of 0.5 will round toward the nearest even
|
||||
/// integer. (Both 3.5 and 4.5 for x will return 4.0.)
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml">GLSL roundEven 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</a>
|
||||
template <typename genType>
|
||||
genType roundEven(genType const & x);
|
||||
|
||||
//! Returns a value equal to the nearest integer
|
||||
//! that is greater than or equal to x.
|
||||
//!
|
||||
/// Returns a value equal to the nearest integer
|
||||
/// that is greater than or equal to x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml">GLSL ceil 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</a>
|
||||
template <typename genType>
|
||||
genType ceil(genType const & x);
|
||||
|
||||
//! Return x - floor(x).
|
||||
//!
|
||||
/// Return x - floor(x).
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract 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</a>
|
||||
template <typename genType>
|
||||
genType fract(genType const & x);
|
||||
|
||||
//! Modulus. Returns x - y * floor(x / y)
|
||||
//! for each component in x using the floating point value y.
|
||||
//!
|
||||
/// Modulus. Returns x - y * floor(x / y)
|
||||
/// for each component in x using the floating point value y.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod 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</a>
|
||||
template <typename genType>
|
||||
|
@ -117,9 +135,11 @@ namespace glm
|
|||
genType const & x,
|
||||
genType const & y);
|
||||
|
||||
//! Modulus. Returns x - y * floor(x / y)
|
||||
//! for each component in x using the floating point value y.
|
||||
//!
|
||||
/// Modulus. Returns x - y * floor(x / y)
|
||||
/// for each component in x using the floating point value y.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod 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</a>
|
||||
template <typename genType>
|
||||
|
@ -127,11 +147,13 @@ namespace glm
|
|||
genType const & x,
|
||||
typename genType::value_type const & y);
|
||||
|
||||
//! Returns the fractional part of x and sets i to the integer
|
||||
//! part (as a whole number floating point value). Both the
|
||||
//! return value and the output parameter will have the same
|
||||
//! sign as x.
|
||||
//!
|
||||
/// Returns the fractional part of x and sets i to the integer
|
||||
/// part (as a whole number floating point value). Both the
|
||||
/// return value and the output parameter will have the same
|
||||
/// sign as x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml">GLSL modf 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</a>
|
||||
template <typename genType>
|
||||
|
@ -140,6 +162,8 @@ namespace glm
|
|||
genType & i);
|
||||
|
||||
/// Returns y if y < x; otherwise, it returns x.
|
||||
///
|
||||
/// @tparam genType Floating-point or integer; scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min 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</a>
|
||||
|
@ -154,6 +178,8 @@ namespace glm
|
|||
typename genType::value_type const & y);
|
||||
|
||||
/// Returns y if x < y; otherwise, it returns x.
|
||||
///
|
||||
/// @tparam genType Floating-point or integer; scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max 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</a>
|
||||
|
@ -167,9 +193,11 @@ namespace glm
|
|||
genType const & x,
|
||||
typename genType::value_type const & y);
|
||||
|
||||
//! Returns min(max(x, minVal), maxVal) for each component in x
|
||||
//! using the floating-point values minVal and maxVal.
|
||||
//!
|
||||
/// Returns min(max(x, minVal), maxVal) for each component in x
|
||||
/// using the floating-point values minVal and maxVal.
|
||||
///
|
||||
/// @tparam genType Floating-point or integer; scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp 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</a>
|
||||
template <typename genType>
|
||||
|
@ -243,16 +271,18 @@ namespace glm
|
|||
typename genType::value_type const & edge,
|
||||
genType const & x);
|
||||
|
||||
//! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and
|
||||
//! performs smooth Hermite interpolation between 0 and 1
|
||||
//! when edge0 < x < edge1. This is useful in cases where
|
||||
//! you would want a threshold function with a smooth
|
||||
//! transition. This is equivalent to:
|
||||
//! genType t;
|
||||
//! t = clamp ((x – edge0) / (edge1 – edge0), 0, 1);
|
||||
//! return t * t * (3 – 2 * t);
|
||||
//! Results are undefined if edge0 >= edge1.
|
||||
//!
|
||||
/// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and
|
||||
/// performs smooth Hermite interpolation between 0 and 1
|
||||
/// when edge0 < x < edge1. This is useful in cases where
|
||||
/// you would want a threshold function with a smooth
|
||||
/// transition. This is equivalent to:
|
||||
/// genType t;
|
||||
/// t = clamp ((x – edge0) / (edge1 – edge0), 0, 1);
|
||||
/// return t * t * (3 – 2 * t);
|
||||
/// Results are undefined if edge0 >= edge1.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml">GLSL smoothstep 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</a>
|
||||
template <typename genType>
|
||||
|
@ -267,97 +297,123 @@ namespace glm
|
|||
typename genType::value_type const & edge1,
|
||||
genType const & x);
|
||||
|
||||
//! Returns true if x holds a NaN (not a number)
|
||||
//! representation in the underlying implementation's set of
|
||||
//! floating point representations. Returns false otherwise,
|
||||
//! including for implementations with no NaN
|
||||
//! representations.
|
||||
//!
|
||||
/// Returns true if x holds a NaN (not a number)
|
||||
/// representation in the underlying implementation's set of
|
||||
/// floating point representations. Returns false otherwise,
|
||||
/// including for implementations with no NaN
|
||||
/// representations.
|
||||
///
|
||||
/// @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</a>
|
||||
template <typename genType>
|
||||
typename genType::bool_type isnan(genType const & x);
|
||||
|
||||
//! Returns true if x holds a positive infinity or negative
|
||||
//! infinity representation in the underlying implementation's
|
||||
//! set of floating point representations. Returns false
|
||||
//! otherwise, including for implementations with no infinity
|
||||
//! representations.
|
||||
//!
|
||||
/// Returns true if x holds a positive infinity or negative
|
||||
/// infinity representation in the underlying implementation's
|
||||
/// set of floating point representations. Returns false
|
||||
/// otherwise, including for implementations with no infinity
|
||||
/// representations.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml">GLSL isinf 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</a>
|
||||
template <typename genType>
|
||||
typename genType::bool_type isinf(genType const & x);
|
||||
|
||||
//! Returns a signed integer value representing
|
||||
//! the encoding of a floating-point value. The floatingpoint
|
||||
//! value's bit-level representation is preserved.
|
||||
//!
|
||||
/// Returns a signed integer value representing
|
||||
/// the encoding of a floating-point value. The floatingpoint
|
||||
/// value's bit-level representation is preserved.
|
||||
///
|
||||
/// @tparam genType Single-precision floating-point scalar or vector types.
|
||||
/// @tparam genIType Signed integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt 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</a>
|
||||
template <typename genType, typename genIType>
|
||||
genIType floatBitsToInt(genType const & value);
|
||||
|
||||
//! Returns a unsigned integer value representing
|
||||
//! the encoding of a floating-point value. The floatingpoint
|
||||
//! value's bit-level representation is preserved.
|
||||
//!
|
||||
/// Returns a unsigned integer value representing
|
||||
/// the encoding of a floating-point value. The floatingpoint
|
||||
/// value's bit-level representation is preserved.
|
||||
///
|
||||
/// @tparam genType Single-precision floating-point scalar or vector types.
|
||||
/// @tparam genUType Unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint 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</a>
|
||||
template <typename genType, typename genUType>
|
||||
genUType floatBitsToUint(genType const & value);
|
||||
|
||||
//! Returns a floating-point value corresponding to a signed
|
||||
//! integer encoding of a floating-point value.
|
||||
//! If an inf or NaN is passed in, it will not signal, and the
|
||||
//! resulting floating point value is unspecified. Otherwise,
|
||||
//! the bit-level representation is preserved.
|
||||
//!
|
||||
/// Returns a floating-point value corresponding to a signed
|
||||
/// integer encoding of a floating-point value.
|
||||
/// If an inf or NaN is passed in, it will not signal, and the
|
||||
/// resulting floating point value is unspecified. Otherwise,
|
||||
/// the bit-level representation is preserved.
|
||||
///
|
||||
/// @tparam genType Single-precision floating-point scalar or vector types.
|
||||
/// @tparam genIType Signed integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat 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</a>
|
||||
///
|
||||
/// @todo - Clarify this declaration, we don't need to actually specify the return type
|
||||
template <typename genType, typename genIType>
|
||||
genType intBitsToFloat(genIType const & value);
|
||||
|
||||
//! Returns a floating-point value corresponding to a
|
||||
//! unsigned integer encoding of a floating-point value.
|
||||
//! If an inf or NaN is passed in, it will not signal, and the
|
||||
//! resulting floating point value is unspecified. Otherwise,
|
||||
//! the bit-level representation is preserved.
|
||||
//!
|
||||
/// Returns a floating-point value corresponding to a
|
||||
/// unsigned integer encoding of a floating-point value.
|
||||
/// If an inf or NaN is passed in, it will not signal, and the
|
||||
/// resulting floating point value is unspecified. Otherwise,
|
||||
/// the bit-level representation is preserved.
|
||||
///
|
||||
/// @tparam genType Single-precision floating-point scalar or vector types.
|
||||
/// @tparam genUType Unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat 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</a>
|
||||
///
|
||||
/// @todo - Clarify this declaration, we don't need to actually specify the return type
|
||||
template <typename genType, typename genUType>
|
||||
genType uintBitsToFloat(genUType const & value);
|
||||
|
||||
//! Computes and returns a * b + c.
|
||||
//!
|
||||
/// Computes and returns a * b + c.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml">GLSL fma 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</a>
|
||||
template <typename genType>
|
||||
genType fma(genType const & a, genType const & b, genType const & c);
|
||||
|
||||
//! Splits x into a floating-point significand in the range
|
||||
//! [0.5, 1.0) and an integral exponent of two, such that:
|
||||
//! x = significand * exp(2, exponent)
|
||||
//!
|
||||
//! The significand is returned by the function and the
|
||||
//! exponent is returned in the parameter exp. For a
|
||||
//! floating-point value of zero, the significant and exponent
|
||||
//! are both zero. For a floating-point value that is an
|
||||
//! infinity or is not a number, the results are undefined.
|
||||
//!
|
||||
/// Splits x into a floating-point significand in the range
|
||||
/// [0.5, 1.0) and an integral exponent of two, such that:
|
||||
/// x = significand * exp(2, exponent)
|
||||
///
|
||||
/// The significand is returned by the function and the
|
||||
/// exponent is returned in the parameter exp. For a
|
||||
/// floating-point value of zero, the significant and exponent
|
||||
/// are both zero. For a floating-point value that is an
|
||||
/// infinity or is not a number, the results are undefined.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml">GLSL frexp 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</a>
|
||||
template <typename genType, typename genIType>
|
||||
genType frexp(genType const & x, genIType & exp);
|
||||
|
||||
//! Builds a floating-point number from x and the
|
||||
//! corresponding integral exponent of two in exp, returning:
|
||||
//! significand * exp(2, exponent)
|
||||
//!
|
||||
//! If this product is too large to be represented in the
|
||||
//! floating-point type, the result is undefined.
|
||||
//!
|
||||
/// Builds a floating-point number from x and the
|
||||
/// corresponding integral exponent of two in exp, returning:
|
||||
/// significand * exp(2, exponent)
|
||||
///
|
||||
/// If this product is too large to be represented in the
|
||||
/// floating-point type, the result is undefined.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml">GLSL ldexp 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</a>
|
||||
template <typename genType, typename genIType>
|
||||
|
|
|
@ -70,7 +70,7 @@ namespace detail
|
|||
return detail::Abs_<genFIType, std::numeric_limits<genFIType>::is_signed>::get(x);
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(abs)
|
||||
VECTORIZE_VEC(abs)
|
||||
|
||||
// sign
|
||||
//Try something like based on x >> 31 to get the sign bit
|
||||
|
@ -94,7 +94,7 @@ namespace detail
|
|||
return result;
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(sign)
|
||||
VECTORIZE_VEC(sign)
|
||||
|
||||
// floor
|
||||
template <>
|
||||
|
@ -111,7 +111,7 @@ namespace detail
|
|||
return ::std::floor(x);
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(floor)
|
||||
VECTORIZE_VEC(floor)
|
||||
|
||||
// trunc
|
||||
template <typename genType>
|
||||
|
@ -121,7 +121,7 @@ namespace detail
|
|||
return x < 0 ? -floor(-x) : floor(x);
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(trunc)
|
||||
VECTORIZE_VEC(trunc)
|
||||
|
||||
// round
|
||||
template <typename genType>
|
||||
|
@ -134,7 +134,7 @@ namespace detail
|
|||
return genType(int(x + genType(0.5)));
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(round)
|
||||
VECTORIZE_VEC(round)
|
||||
|
||||
/*
|
||||
// roundEven
|
||||
|
@ -161,7 +161,7 @@ namespace detail
|
|||
return genType(int(x + RoundValue));
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(roundEven)
|
||||
VECTORIZE_VEC(roundEven)
|
||||
|
||||
// ceil
|
||||
template <typename genType>
|
||||
|
@ -172,7 +172,7 @@ namespace detail
|
|||
return ::std::ceil(x);
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(ceil)
|
||||
VECTORIZE_VEC(ceil)
|
||||
|
||||
// fract
|
||||
template <typename genType>
|
||||
|
@ -186,7 +186,7 @@ namespace detail
|
|||
return x - ::std::floor(x);
|
||||
}
|
||||
|
||||
VECTORIZE_1PARAM(fract)
|
||||
VECTORIZE_VEC(fract)
|
||||
|
||||
// mod
|
||||
template <typename genType>
|
||||
|
@ -201,83 +201,8 @@ namespace detail
|
|||
return x - y * floor(x / y);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mod
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
typename detail::tvec2<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
mod(x.x, y),
|
||||
mod(x.y, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mod
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
typename detail::tvec3<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
mod(x.x, y),
|
||||
mod(x.y, y),
|
||||
mod(x.z, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mod
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
typename detail::tvec4<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
mod(x.x, y),
|
||||
mod(x.y, y),
|
||||
mod(x.z, y),
|
||||
mod(x.w, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mod
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
mod(x.x, y.x),
|
||||
mod(x.y, y.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mod
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
mod(x.x, y.x),
|
||||
mod(x.y, y.y),
|
||||
mod(x.z, y.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mod
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
mod(x.x, y.x),
|
||||
mod(x.y, y.y),
|
||||
mod(x.z, y.z),
|
||||
mod(x.w, y.w));
|
||||
}
|
||||
VECTORIZE_VEC_SCA(mod)
|
||||
VECTORIZE_VEC_VEC(mod)
|
||||
|
||||
// modf
|
||||
template <typename genType>
|
||||
|
@ -298,39 +223,39 @@ namespace detail
|
|||
GLM_FUNC_QUALIFIER detail::tvec2<valType> modf
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
detail::tvec2<valType> & i
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
modf(x.x, y.x),
|
||||
modf(x.y, y.y));
|
||||
modf(x.x, i.x),
|
||||
modf(x.y, i.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> modf
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
detail::tvec3<valType> & i
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
modf(x.x, y.x),
|
||||
modf(x.y, y.y),
|
||||
modf(x.z, y.z));
|
||||
modf(x.x, i.x),
|
||||
modf(x.y, i.y),
|
||||
modf(x.z, i.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> modf
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
detail::tvec4<valType> & i
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
modf(x.x, y.x),
|
||||
modf(x.y, y.y),
|
||||
modf(x.z, y.z),
|
||||
modf(x.w, y.w));
|
||||
modf(x.x, i.x),
|
||||
modf(x.y, i.y),
|
||||
modf(x.z, i.z),
|
||||
modf(x.w, i.w));
|
||||
}
|
||||
|
||||
//// Only valid if (INT_MIN <= x-y <= INT_MAX)
|
||||
|
@ -357,83 +282,8 @@ namespace detail
|
|||
return x < y ? x : y;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> min
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
typename detail::tvec2<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
min(x.x, y),
|
||||
min(x.y, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> min
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
typename detail::tvec3<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
min(x.x, y),
|
||||
min(x.y, y),
|
||||
min(x.z, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> min
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
typename detail::tvec4<T>::value_type const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
min(x.x, y),
|
||||
min(x.y, y),
|
||||
min(x.z, y),
|
||||
min(x.w, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> min
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
min(x.x, y.x),
|
||||
min(x.y, y.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> min
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
min(x.x, y.x),
|
||||
min(x.y, y.y),
|
||||
min(x.z, y.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> min
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
min(x.x, y.x),
|
||||
min(x.y, y.y),
|
||||
min(x.z, y.z),
|
||||
min(x.w, y.w));
|
||||
}
|
||||
VECTORIZE_VEC_SCA(min)
|
||||
VECTORIZE_VEC_VEC(min)
|
||||
|
||||
// max
|
||||
template <typename genType>
|
||||
|
@ -451,82 +301,8 @@ namespace detail
|
|||
return x > y ? x : y;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> max
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
typename detail::tvec2<T>::value_type y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
max(x.x, y),
|
||||
max(x.y, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> max
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
typename detail::tvec3<T>::value_type y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
max(x.x, y),
|
||||
max(x.y, y),
|
||||
max(x.z, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> max
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
typename detail::tvec4<T>::value_type y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
max(x.x, y),
|
||||
max(x.y, y),
|
||||
max(x.z, y),
|
||||
max(x.w, y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> max
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
max(x.x, y.x),
|
||||
max(x.y, y.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> max
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
max(x.x, y.x),
|
||||
max(x.y, y.y),
|
||||
max(x.z, y.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> max
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & y)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
max(x.x, y.x),
|
||||
max(x.y, y.y),
|
||||
max(x.z, y.z),
|
||||
max(x.w, y.w));
|
||||
}
|
||||
VECTORIZE_VEC_SCA(max)
|
||||
VECTORIZE_VEC_VEC(max)
|
||||
|
||||
// clamp
|
||||
template <typename valType>
|
||||
|
|
|
@ -42,6 +42,9 @@ namespace glm
|
|||
/// @{
|
||||
|
||||
/// Returns x raised to the y power.
|
||||
///
|
||||
/// @param x pow function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml">GLSL pow man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
|
@ -49,6 +52,9 @@ namespace glm
|
|||
genType pow(genType const & x, genType const & y);
|
||||
|
||||
/// Returns the natural exponentiation of x, i.e., e^x.
|
||||
///
|
||||
/// @param x exp function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml">GLSL exp man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
|
@ -58,6 +64,9 @@ namespace glm
|
|||
/// Returns the natural logarithm of x, i.e.,
|
||||
/// returns the value y which satisfies the equation x = e^y.
|
||||
/// Results are undefined if x <= 0.
|
||||
///
|
||||
/// @param x log function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml">GLSL log man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
|
@ -65,6 +74,9 @@ namespace glm
|
|||
genType log(genType const & x);
|
||||
|
||||
/// Returns 2 raised to the x power.
|
||||
///
|
||||
/// @param x exp2 function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml">GLSL exp2 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
|
@ -74,6 +86,9 @@ namespace glm
|
|||
/// Returns the base 2 log of x, i.e., returns the value y,
|
||||
/// which satisfies the equation x = 2 ^ y.
|
||||
///
|
||||
/// @param x log2 function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml">GLSL log2 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
template <typename genType>
|
||||
|
@ -81,6 +96,9 @@ namespace glm
|
|||
|
||||
/// Returns the positive square root of x.
|
||||
///
|
||||
/// @param x sqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml">GLSL sqrt man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
template <typename genType>
|
||||
|
@ -88,6 +106,9 @@ namespace glm
|
|||
|
||||
/// Returns the reciprocal of the positive square root of x.
|
||||
///
|
||||
/// @param x inversesqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision.
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml">GLSL inversesqrt man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2</a>
|
||||
template <typename genType>
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "_vectorize.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// pow
|
||||
|
@ -41,44 +43,7 @@ namespace glm
|
|||
return ::std::pow(x, y);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> pow
|
||||
(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
pow(x.x, y.x),
|
||||
pow(x.y, y.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> pow
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
pow(x.x, y.x),
|
||||
pow(x.y, y.y),
|
||||
pow(x.z, y.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> pow
|
||||
(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & y
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
pow(x.x, y.x),
|
||||
pow(x.y, y.y),
|
||||
pow(x.z, y.z),
|
||||
pow(x.w, y.w));
|
||||
}
|
||||
VECTORIZE_VEC_VEC(pow)
|
||||
|
||||
// exp
|
||||
template <typename genType>
|
||||
|
@ -92,41 +57,7 @@ namespace glm
|
|||
return ::std::exp(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> exp
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
exp(x.x),
|
||||
exp(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> exp
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
exp(x.x),
|
||||
exp(x.y),
|
||||
exp(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> exp
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
exp(x.x),
|
||||
exp(x.y),
|
||||
exp(x.z),
|
||||
exp(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(exp)
|
||||
|
||||
// log
|
||||
template <typename genType>
|
||||
|
@ -140,41 +71,7 @@ namespace glm
|
|||
return ::std::log(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> log
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
log(x.x),
|
||||
log(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> log
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
log(x.x),
|
||||
log(x.y),
|
||||
log(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> log
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
log(x.x),
|
||||
log(x.y),
|
||||
log(x.z),
|
||||
log(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(log)
|
||||
|
||||
//exp2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename genType>
|
||||
|
@ -188,41 +85,7 @@ namespace glm
|
|||
return ::std::exp(genType(0.69314718055994530941723212145818) * x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> exp2
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
exp2(x.x),
|
||||
exp2(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> exp2
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
exp2(x.x),
|
||||
exp2(x.y),
|
||||
exp2(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> exp2
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
exp2(x.x),
|
||||
exp2(x.y),
|
||||
exp2(x.z),
|
||||
exp2(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(exp2)
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
@ -255,44 +118,11 @@ namespace detail
|
|||
genType const & x
|
||||
)
|
||||
{
|
||||
assert(x > genType(0)); // log2 is only defined on the range (0, inf]
|
||||
return detail::compute_log2<detail::float_or_int_trait<genType>::ID>()(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> log2
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
log2(x.x),
|
||||
log2(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> log2
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
log2(x.x),
|
||||
log2(x.y),
|
||||
log2(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> log2
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
log2(x.x),
|
||||
log2(x.y),
|
||||
log2(x.z),
|
||||
log2(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(log2)
|
||||
|
||||
// sqrt
|
||||
template <typename genType>
|
||||
|
@ -306,41 +136,7 @@ namespace detail
|
|||
return genType(::std::sqrt(x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> sqrt
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
glm::sqrt(x.x),
|
||||
glm::sqrt(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> sqrt
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
glm::sqrt(x.x),
|
||||
glm::sqrt(x.y),
|
||||
glm::sqrt(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> sqrt
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
glm::sqrt(x.x),
|
||||
glm::sqrt(x.y),
|
||||
glm::sqrt(x.z),
|
||||
glm::sqrt(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(sqrt)
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType inversesqrt
|
||||
|
@ -353,40 +149,6 @@ namespace detail
|
|||
return genType(1) / ::std::sqrt(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> inversesqrt
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
inversesqrt(x.x),
|
||||
inversesqrt(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> inversesqrt
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
inversesqrt(x.x),
|
||||
inversesqrt(x.y),
|
||||
inversesqrt(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> inversesqrt
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
inversesqrt(x.x),
|
||||
inversesqrt(x.y),
|
||||
inversesqrt(x.z),
|
||||
inversesqrt(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(inversesqrt)
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -43,6 +43,8 @@ namespace glm
|
|||
|
||||
/// Returns the length of x, i.e., sqrt(x * x).
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml">GLSL length man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
template <typename genType>
|
||||
|
@ -50,6 +52,8 @@ namespace glm
|
|||
genType const & x);
|
||||
|
||||
/// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml">GLSL distance man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
|
@ -59,6 +63,8 @@ namespace glm
|
|||
genType const & p1);
|
||||
|
||||
/// Returns the dot product of x and y, i.e., result = x * y.
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml">GLSL dot man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
|
@ -68,13 +74,15 @@ namespace glm
|
|||
genType const & y);
|
||||
|
||||
/// Returns the cross product of x and y.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml">GLSL cross man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
template <typename T>
|
||||
detail::tvec3<T> cross(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y);
|
||||
template <typename valType>
|
||||
detail::tvec3<valType> cross(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y);
|
||||
|
||||
/// Returns a vector in the same direction as x but with length of 1.
|
||||
///
|
||||
|
@ -85,6 +93,8 @@ namespace glm
|
|||
genType const & x);
|
||||
|
||||
/// If dot(Nref, I) < 0.0, return N, otherwise, return -N.
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml">GLSL faceforward man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
|
@ -96,6 +106,8 @@ namespace glm
|
|||
|
||||
/// For the incident vector I and surface orientation N,
|
||||
/// returns the reflection direction : result = I - 2.0 * dot(N, I) * N.
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml">GLSL reflect man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
|
@ -107,6 +119,8 @@ namespace glm
|
|||
/// For the incident vector I and surface normal N,
|
||||
/// and the ratio of indices of refraction eta,
|
||||
/// return the refraction vector.
|
||||
///
|
||||
/// @tparam genType Floating-point vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5</a>
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "_vectorize.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// length
|
||||
|
|
|
@ -43,10 +43,12 @@ namespace glm
|
|||
/// @addtogroup core_func_integer
|
||||
/// @{
|
||||
|
||||
//! Adds 32-bit unsigned integer x and y, returning the sum
|
||||
//! modulo pow(2, 32). The value carry is set to 0 if the sum was
|
||||
//! less than pow(2, 32), or to 1 otherwise.
|
||||
//!
|
||||
/// Adds 32-bit unsigned integer x and y, returning the sum
|
||||
/// modulo pow(2, 32). The value carry is set to 0 if the sum was
|
||||
/// less than pow(2, 32), or to 1 otherwise.
|
||||
///
|
||||
/// @tparam genUType Unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml">GLSL uaddCarry man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genUType>
|
||||
|
@ -55,10 +57,12 @@ namespace glm
|
|||
genUType const & y,
|
||||
genUType & carry);
|
||||
|
||||
//! Subtracts the 32-bit unsigned integer y from x, returning
|
||||
//! the difference if non-negative, or pow(2, 32) plus the difference
|
||||
//! otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise.
|
||||
//!
|
||||
/// Subtracts the 32-bit unsigned integer y from x, returning
|
||||
/// the difference if non-negative, or pow(2, 32) plus the difference
|
||||
/// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise.
|
||||
///
|
||||
/// @tparam genUType Unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml">GLSL usubBorrow man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genUType>
|
||||
|
@ -67,10 +71,12 @@ namespace glm
|
|||
genUType const & y,
|
||||
genUType & borrow);
|
||||
|
||||
//! Multiplies 32-bit integers x and y, producing a 64-bit
|
||||
//! result. The 32 least-significant bits are returned in lsb.
|
||||
//! The 32 most-significant bits are returned in msb.
|
||||
//!
|
||||
/// Multiplies 32-bit integers x and y, producing a 64-bit
|
||||
/// result. The 32 least-significant bits are returned in lsb.
|
||||
/// The 32 most-significant bits are returned in msb.
|
||||
///
|
||||
/// @tparam genUType Unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml">GLSL umulExtended man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genUType>
|
||||
|
@ -80,10 +86,12 @@ namespace glm
|
|||
genUType & msb,
|
||||
genUType & lsb);
|
||||
|
||||
//! Multiplies 32-bit integers x and y, producing a 64-bit
|
||||
//! result. The 32 least-significant bits are returned in lsb.
|
||||
//! The 32 most-significant bits are returned in msb.
|
||||
//!
|
||||
/// Multiplies 32-bit integers x and y, producing a 64-bit
|
||||
/// result. The 32 least-significant bits are returned in lsb.
|
||||
/// The 32 most-significant bits are returned in msb.
|
||||
///
|
||||
/// @tparam genIType Signed integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml">GLSL imulExtended man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genIType>
|
||||
|
@ -93,17 +101,19 @@ namespace glm
|
|||
genIType & msb,
|
||||
genIType & lsb);
|
||||
|
||||
//! Extracts bits [offset, offset + bits - 1] from value,
|
||||
//! returning them in the least significant bits of the result.
|
||||
//! For unsigned data types, the most significant bits of the
|
||||
//! result will be set to zero. For signed data types, the
|
||||
//! most significant bits will be set to the value of bit offset + base – 1.
|
||||
//!
|
||||
//! If bits is zero, the result will be zero. The result will be
|
||||
//! undefined if offset or bits is negative, or if the sum of
|
||||
//! offset and bits is greater than the number of bits used
|
||||
//! to store the operand.
|
||||
//!
|
||||
/// Extracts bits [offset, offset + bits - 1] from value,
|
||||
/// returning them in the least significant bits of the result.
|
||||
/// For unsigned data types, the most significant bits of the
|
||||
/// result will be set to zero. For signed data types, the
|
||||
/// most significant bits will be set to the value of bit offset + base – 1.
|
||||
///
|
||||
/// If bits is zero, the result will be zero. The result will be
|
||||
/// undefined if offset or bits is negative, or if the sum of
|
||||
/// offset and bits is greater than the number of bits used
|
||||
/// to store the operand.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml">GLSL bitfieldExtract man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genIUType>
|
||||
|
@ -112,16 +122,18 @@ namespace glm
|
|||
int const & Offset,
|
||||
int const & Bits);
|
||||
|
||||
//! Returns the insertion the bits least-significant bits of insert into base.
|
||||
//!
|
||||
//! The result will have bits [offset, offset + bits - 1] taken
|
||||
//! from bits [0, bits – 1] of insert, and all other bits taken
|
||||
//! directly from the corresponding bits of base. If bits is
|
||||
//! zero, the result will simply be base. The result will be
|
||||
//! undefined if offset or bits is negative, or if the sum of
|
||||
//! offset and bits is greater than the number of bits used to
|
||||
//! store the operand.
|
||||
//!
|
||||
/// Returns the insertion the bits least-significant bits of insert into base.
|
||||
///
|
||||
/// The result will have bits [offset, offset + bits - 1] taken
|
||||
/// from bits [0, bits – 1] of insert, and all other bits taken
|
||||
/// directly from the corresponding bits of base. If bits is
|
||||
/// zero, the result will simply be base. The result will be
|
||||
/// undefined if offset or bits is negative, or if the sum of
|
||||
/// offset and bits is greater than the number of bits used to
|
||||
/// store the operand.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml">GLSL bitfieldInsert man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genIUType>
|
||||
|
@ -131,40 +143,54 @@ namespace glm
|
|||
int const & Offset,
|
||||
int const & Bits);
|
||||
|
||||
//! Returns the reversal of the bits of value.
|
||||
//! The bit numbered n of the result will be taken from bit (bits - 1) - n of value,
|
||||
//! where bits is the total number of bits used to represent value.
|
||||
//!
|
||||
/// Returns the reversal of the bits of value.
|
||||
/// The bit numbered n of the result will be taken from bit (bits - 1) - n of value,
|
||||
/// where bits is the total number of bits used to represent value.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml">GLSL bitfieldReverse man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename genIUType>
|
||||
genIUType bitfieldReverse(genIUType const & value);
|
||||
|
||||
//! Returns the number of bits set to 1 in the binary representation of value.
|
||||
//!
|
||||
/// Returns the number of bits set to 1 in the binary representation of value.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename T, template <typename> class C>
|
||||
typename C<T>::signed_type bitCount(C<T> const & Value);
|
||||
///
|
||||
/// @todo Clarify the declaration to specify that scalars are suported.
|
||||
template <typename T, template <typename> class genIUType>
|
||||
typename genIUType<T>::signed_type bitCount(genIUType<T> const & Value);
|
||||
|
||||
//! Returns the bit number of the least significant bit set to
|
||||
//! 1 in the binary representation of value.
|
||||
//! If value is zero, -1 will be returned.
|
||||
//!
|
||||
/// Returns the bit number of the least significant bit set to
|
||||
/// 1 in the binary representation of value.
|
||||
/// If value is zero, -1 will be returned.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename T, template <typename> class C>
|
||||
typename C<T>::signed_type findLSB(C<T> const & Value);
|
||||
///
|
||||
/// @todo Clarify the declaration to specify that scalars are suported.
|
||||
template <typename T, template <typename> class genIUType>
|
||||
typename genIUType<T>::signed_type findLSB(genIUType<T> const & Value);
|
||||
|
||||
//! Returns the bit number of the most significant bit in the binary representation of value.
|
||||
//! For positive integers, the result will be the bit number of the most significant bit set to 1.
|
||||
//! For negative integers, the result will be the bit number of the most significant
|
||||
//! bit set to 0. For a value of zero or negative one, -1 will be returned.
|
||||
//!
|
||||
/// Returns the bit number of the most significant bit in the binary representation of value.
|
||||
/// For positive integers, the result will be the bit number of the most significant bit set to 1.
|
||||
/// For negative integers, the result will be the bit number of the most significant
|
||||
/// bit set to 0. For a value of zero or negative one, -1 will be returned.
|
||||
///
|
||||
/// @tparam genIUType Signed or unsigned integer scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8</a>
|
||||
template <typename T, template <typename> class C>
|
||||
typename C<T>::signed_type findMSB(C<T> const & Value);
|
||||
///
|
||||
/// @todo Clarify the declaration to specify that scalars are suported.
|
||||
template <typename T, template <typename> class genIUType>
|
||||
typename genIUType<T>::signed_type findMSB(genIUType<T> const & Value);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "_vectorize.hpp"
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
#include <intrin.h>
|
||||
#pragma intrinsic(_BitScanReverse)
|
||||
|
@ -415,41 +416,7 @@ namespace glm
|
|||
return Out;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> bitfieldReverse
|
||||
(
|
||||
detail::tvec2<T> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
bitfieldReverse(value[0]),
|
||||
bitfieldReverse(value[1]));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> bitfieldReverse
|
||||
(
|
||||
detail::tvec3<T> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
bitfieldReverse(value[0]),
|
||||
bitfieldReverse(value[1]),
|
||||
bitfieldReverse(value[2]));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> bitfieldReverse
|
||||
(
|
||||
detail::tvec4<T> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
bitfieldReverse(value[0]),
|
||||
bitfieldReverse(value[1]),
|
||||
bitfieldReverse(value[2]),
|
||||
bitfieldReverse(value[3]));
|
||||
}
|
||||
VECTORIZE_VEC(bitfieldReverse)
|
||||
|
||||
// bitCount
|
||||
template <typename genIUType>
|
||||
|
|
|
@ -47,6 +47,8 @@ namespace glm
|
|||
|
||||
/// Multiply matrix x by matrix y component-wise, i.e.,
|
||||
/// result[i][j] is the scalar product of x[i][j] and y[i][j].
|
||||
///
|
||||
/// @tparam matType Floating-point matrix types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml">GLSL matrixCompMult man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
|
@ -58,15 +60,21 @@ namespace glm
|
|||
/// Treats the first parameter c as a column vector
|
||||
/// and the second parameter r as a row vector
|
||||
/// and does a linear algebraic matrix multiply c * r.
|
||||
///
|
||||
/// @tparam matType Floating-point matrix types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml">GLSL outerProduct man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
///
|
||||
/// @todo Clarify the declaration to specify that matType doesn't have to be provided when used.
|
||||
template <typename vecType, typename matType>
|
||||
matType outerProduct(
|
||||
vecType const & c,
|
||||
vecType const & r);
|
||||
|
||||
/// Returns the transposed matrix of x
|
||||
///
|
||||
/// @tparam matType Floating-point matrix types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml">GLSL transpose man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
|
@ -75,52 +83,64 @@ namespace glm
|
|||
matType const & x);
|
||||
|
||||
/// Return the determinant of a mat2 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
typename detail::tmat2x2<T>::value_type determinant(
|
||||
detail::tmat2x2<T> const & m);
|
||||
template <typename valType>
|
||||
typename detail::tmat2x2<valType>::value_type determinant(
|
||||
detail::tmat2x2<valType> const & m);
|
||||
|
||||
/// Return the determinant of a mat3 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
typename detail::tmat3x3<T>::value_type determinant(
|
||||
detail::tmat3x3<T> const & m);
|
||||
template <typename valType>
|
||||
typename detail::tmat3x3<valType>::value_type determinant(
|
||||
detail::tmat3x3<valType> const & m);
|
||||
|
||||
/// Return the determinant of a mat4 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
typename detail::tmat4x4<T>::value_type determinant(
|
||||
detail::tmat4x4<T> const & m);
|
||||
template <typename valType>
|
||||
typename detail::tmat4x4<valType>::value_type determinant(
|
||||
detail::tmat4x4<valType> const & m);
|
||||
|
||||
/// Return the inverse of a mat2 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
detail::tmat2x2<T> inverse(
|
||||
detail::tmat2x2<T> const & m);
|
||||
template <typename valType>
|
||||
detail::tmat2x2<valType> inverse(
|
||||
detail::tmat2x2<valType> const & m);
|
||||
|
||||
/// Return the inverse of a mat3 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> inverse(
|
||||
detail::tmat3x3<T> const & m);
|
||||
template <typename valType>
|
||||
detail::tmat3x3<valType> inverse(
|
||||
detail::tmat3x3<valType> const & m);
|
||||
|
||||
/// Return the inverse of a mat4 matrix.
|
||||
///
|
||||
/// @tparam valType Floating-point scalar types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6</a>
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> inverse(
|
||||
detail::tmat4x4<T> const & m);
|
||||
template <typename valType>
|
||||
detail::tmat4x4<valType> inverse(
|
||||
detail::tmat4x4<valType> const & m);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "_vectorize.hpp"
|
||||
|
||||
namespace glm
|
||||
{
|
||||
// matrixCompMult
|
||||
|
|
|
@ -44,6 +44,8 @@ namespace glm
|
|||
/// @{
|
||||
|
||||
/// Returns a 1D noise value based on the input value x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise1.xml">GLSL noise1 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13</a>
|
||||
|
@ -51,6 +53,8 @@ namespace glm
|
|||
typename genType::value_type noise1(genType const & x);
|
||||
|
||||
/// Returns a 2D noise value based on the input value x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise2.xml">GLSL noise2 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13</a>
|
||||
|
@ -58,6 +62,8 @@ namespace glm
|
|||
detail::tvec2<typename genType::value_type> noise2(genType const & x);
|
||||
|
||||
/// Returns a 3D noise value based on the input value x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise3.xml">GLSL noise3 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13</a>
|
||||
|
@ -65,6 +71,8 @@ namespace glm
|
|||
detail::tvec3<typename genType::value_type> noise3(genType const & x);
|
||||
|
||||
/// Returns a 4D noise value based on the input value x.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise4.xml">GLSL noise4 man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13</a>
|
||||
|
|
|
@ -26,134 +26,133 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> const & v)
|
||||
namespace glm
|
||||
{
|
||||
detail::uint16 A(detail::uint16(round(clamp(v.x, 0.0f, 1.0f) * 65535.0f)));
|
||||
detail::uint16 B(detail::uint16(round(clamp(v.y, 0.0f, 1.0f) * 65535.0f)));
|
||||
return detail::uint32((B << 16) | A);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & p)
|
||||
{
|
||||
detail::uint32 Mask16((1 << 16) - 1);
|
||||
detail::uint32 A((p >> 0) & Mask16);
|
||||
detail::uint32 B((p >> 16) & Mask16);
|
||||
return detail::tvec2<detail::float32>(
|
||||
A * 1.0f / 65535.0f,
|
||||
B * 1.0f / 65535.0f);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> const & v)
|
||||
{
|
||||
union iu
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> const & v)
|
||||
{
|
||||
detail::int16 i;
|
||||
detail::uint16 u;
|
||||
} A, B;
|
||||
detail::uint16 A(detail::uint16(round(clamp(v.x, 0.0f, 1.0f) * 65535.0f)));
|
||||
detail::uint16 B(detail::uint16(round(clamp(v.y, 0.0f, 1.0f) * 65535.0f)));
|
||||
return detail::uint32((B << 16) | A);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & p)
|
||||
{
|
||||
detail::uint32 Mask16((1 << 16) - 1);
|
||||
detail::uint32 A((p >> 0) & Mask16);
|
||||
detail::uint32 B((p >> 16) & Mask16);
|
||||
return detail::tvec2<detail::float32>(
|
||||
A * 1.0f / 65535.0f,
|
||||
B * 1.0f / 65535.0f);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> const & v)
|
||||
{
|
||||
union iu
|
||||
{
|
||||
detail::int16 i;
|
||||
detail::uint16 u;
|
||||
} A, B;
|
||||
|
||||
detail::tvec2<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 32767.0f;
|
||||
A.i = detail::int16(round(Unpack.x));
|
||||
B.i = detail::int16(round(Unpack.y));
|
||||
detail::uint32 Pack = (detail::uint32(B.u) << 16) | (detail::uint32(A.u) << 0);
|
||||
return Pack;
|
||||
}
|
||||
detail::tvec2<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 32767.0f;
|
||||
A.i = detail::int16(round(Unpack.x));
|
||||
B.i = detail::int16(round(Unpack.y));
|
||||
detail::uint32 Pack = (detail::uint32(B.u) << 16) | (detail::uint32(A.u) << 0);
|
||||
return Pack;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & p)
|
||||
{
|
||||
union iu
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & p)
|
||||
{
|
||||
detail::int16 i;
|
||||
detail::uint16 u;
|
||||
} A, B;
|
||||
union iu
|
||||
{
|
||||
detail::int16 i;
|
||||
detail::uint16 u;
|
||||
} A, B;
|
||||
|
||||
detail::uint32 Mask16((1 << 16) - 1);
|
||||
A.u = detail::uint16((p >> 0) & Mask16);
|
||||
B.u = detail::uint16((p >> 16) & Mask16);
|
||||
detail::tvec2<detail::float32> Pack(A.i, B.i);
|
||||
detail::uint32 Mask16((1 << 16) - 1);
|
||||
A.u = detail::uint16((p >> 0) & Mask16);
|
||||
B.u = detail::uint16((p >> 16) & Mask16);
|
||||
detail::tvec2<detail::float32> Pack(A.i, B.i);
|
||||
|
||||
return clamp(Pack * 1.0f / 32767.0f, -1.0f, 1.0f);
|
||||
}
|
||||
return clamp(Pack * 1.0f / 32767.0f, -1.0f, 1.0f);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> const & v)
|
||||
{
|
||||
detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f));
|
||||
return detail::uint32((D << 24) | (C << 16) | (B << 8) | A);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & p)
|
||||
{
|
||||
detail::uint32 Mask8((1 << 8) - 1);
|
||||
detail::uint32 A((p >> 0) & Mask8);
|
||||
detail::uint32 B((p >> 8) & Mask8);
|
||||
detail::uint32 C((p >> 16) & Mask8);
|
||||
detail::uint32 D((p >> 24) & Mask8);
|
||||
return detail::tvec4<detail::float32>(
|
||||
A * 1.0f / 255.0f,
|
||||
B * 1.0f / 255.0f,
|
||||
C * 1.0f / 255.0f,
|
||||
D * 1.0f / 255.0f);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> const & v)
|
||||
{
|
||||
union iu
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> const & v)
|
||||
{
|
||||
detail::int8 i;
|
||||
detail::uint8 u;
|
||||
} A, B, C, D;
|
||||
detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f));
|
||||
detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f));
|
||||
return detail::uint32((D << 24) | (C << 16) | (B << 8) | A);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & p)
|
||||
{
|
||||
detail::uint32 Mask8((1 << 8) - 1);
|
||||
detail::uint32 A((p >> 0) & Mask8);
|
||||
detail::uint32 B((p >> 8) & Mask8);
|
||||
detail::uint32 C((p >> 16) & Mask8);
|
||||
detail::uint32 D((p >> 24) & Mask8);
|
||||
return detail::tvec4<detail::float32>(
|
||||
A * 1.0f / 255.0f,
|
||||
B * 1.0f / 255.0f,
|
||||
C * 1.0f / 255.0f,
|
||||
D * 1.0f / 255.0f);
|
||||
}
|
||||
|
||||
detail::tvec4<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 127.0f;
|
||||
A.i = detail::int8(round(Unpack.x));
|
||||
B.i = detail::int8(round(Unpack.y));
|
||||
C.i = detail::int8(round(Unpack.z));
|
||||
D.i = detail::int8(round(Unpack.w));
|
||||
detail::uint32 Pack = (detail::uint32(D.u) << 24) | (detail::uint32(C.u) << 16) | (detail::uint32(B.u) << 8) | (detail::uint32(A.u) << 0);
|
||||
return Pack;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & p)
|
||||
{
|
||||
union iu
|
||||
GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> const & v)
|
||||
{
|
||||
detail::int8 i;
|
||||
detail::uint8 u;
|
||||
} A, B, C, D;
|
||||
union iu
|
||||
{
|
||||
detail::int8 i;
|
||||
detail::uint8 u;
|
||||
} A, B, C, D;
|
||||
|
||||
detail::uint32 Mask8((1 << 8) - 1);
|
||||
A.u = detail::uint8((p >> 0) & Mask8);
|
||||
B.u = detail::uint8((p >> 8) & Mask8);
|
||||
C.u = detail::uint8((p >> 16) & Mask8);
|
||||
D.u = detail::uint8((p >> 24) & Mask8);
|
||||
detail::tvec4<detail::float32> Pack(A.i, B.i, C.i, D.i);
|
||||
detail::tvec4<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 127.0f;
|
||||
A.i = detail::int8(round(Unpack.x));
|
||||
B.i = detail::int8(round(Unpack.y));
|
||||
C.i = detail::int8(round(Unpack.z));
|
||||
D.i = detail::int8(round(Unpack.w));
|
||||
detail::uint32 Pack = (detail::uint32(D.u) << 24) | (detail::uint32(C.u) << 16) | (detail::uint32(B.u) << 8) | (detail::uint32(A.u) << 0);
|
||||
return Pack;
|
||||
}
|
||||
|
||||
return clamp(Pack * 1.0f / 127.0f, -1.0f, 1.0f);
|
||||
}
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & p)
|
||||
{
|
||||
union iu
|
||||
{
|
||||
detail::int8 i;
|
||||
detail::uint8 u;
|
||||
} A, B, C, D;
|
||||
|
||||
detail::uint32 Mask8((1 << 8) - 1);
|
||||
A.u = detail::uint8((p >> 0) & Mask8);
|
||||
B.u = detail::uint8((p >> 8) & Mask8);
|
||||
C.u = detail::uint8((p >> 16) & Mask8);
|
||||
D.u = detail::uint8((p >> 24) & Mask8);
|
||||
detail::tvec4<detail::float32> Pack(A.i, B.i, C.i, D.i);
|
||||
|
||||
return clamp(Pack * 1.0f / 127.0f, -1.0f, 1.0f);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2<detail::uint32> const & v)
|
||||
{
|
||||
return *(double*)&v;
|
||||
}
|
||||
GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2<detail::uint32> const & v)
|
||||
{
|
||||
return *(double*)&v;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<uint> unpackDouble2x32(double const & v)
|
||||
{
|
||||
return *(detail::tvec2<uint>*)&v;
|
||||
}
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<uint> unpackDouble2x32(double const & v)
|
||||
{
|
||||
return *(detail::tvec2<uint>*)&v;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER uint packHalf2x16(detail::tvec2<float> const & v)
|
||||
{
|
||||
detail::tvec2<detail::hdata> Pack(detail::toFloat16(v.x), detail::toFloat16(v.y));
|
||||
return *(uint*)&Pack;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v)
|
||||
{
|
||||
detail::tvec2<detail::hdata> Unpack = *(detail::tvec2<detail::hdata>*)&v;
|
||||
return vec2(detail::toFloat32(Unpack.x), detail::toFloat32(Unpack.y));
|
||||
}
|
||||
GLM_FUNC_QUALIFIER uint packHalf2x16(detail::tvec2<float> const & v)
|
||||
{
|
||||
detail::tvec2<detail::hdata> Pack(detail::toFloat16(v.x), detail::toFloat16(v.y));
|
||||
return *(uint*)&Pack;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v)
|
||||
{
|
||||
detail::tvec2<detail::hdata> Unpack = *(detail::tvec2<detail::hdata>*)&v;
|
||||
return vec2(detail::toFloat32(Unpack.x), detail::toFloat32(Unpack.y));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -45,119 +45,149 @@ namespace glm
|
|||
/// @addtogroup core_func_trigonometric
|
||||
/// @{
|
||||
|
||||
//! Converts degrees to radians and returns the result.
|
||||
//!
|
||||
/// Converts degrees to radians and returns the result.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType radians(genType const & degrees);
|
||||
|
||||
//! Converts radians to degrees and returns the result.
|
||||
//!
|
||||
/// Converts radians to degrees and returns the result.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType degrees(genType const & radians);
|
||||
|
||||
//! The standard trigonometric sine function.
|
||||
//! The values returned by this function will range from [-1, 1].
|
||||
//!
|
||||
/// The standard trigonometric sine function.
|
||||
/// The values returned by this function will range from [-1, 1].
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml">GLSL sin man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType sin(genType const & angle);
|
||||
|
||||
//! The standard trigonometric cosine function.
|
||||
//! The values returned by this function will range from [-1, 1].
|
||||
//!
|
||||
/// The standard trigonometric cosine function.
|
||||
/// The values returned by this function will range from [-1, 1].
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml">GLSL cos man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType cos(genType const & angle);
|
||||
|
||||
//! The standard trigonometric tangent function.
|
||||
//!
|
||||
/// The standard trigonometric tangent function.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml">GLSL tan man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType tan(genType const & angle);
|
||||
|
||||
//! Arc sine. Returns an angle whose sine is x.
|
||||
//! The range of values returned by this function is [-PI/2, PI/2].
|
||||
//! Results are undefined if |x| > 1.
|
||||
//!
|
||||
/// Arc sine. Returns an angle whose sine is x.
|
||||
/// The range of values returned by this function is [-PI/2, PI/2].
|
||||
/// Results are undefined if |x| > 1.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml">GLSL asin man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType asin(genType const & x);
|
||||
|
||||
//! Arc cosine. Returns an angle whose sine is x.
|
||||
//! The range of values returned by this function is [0, PI].
|
||||
//! Results are undefined if |x| > 1.
|
||||
//!
|
||||
/// Arc cosine. Returns an angle whose sine is x.
|
||||
/// The range of values returned by this function is [0, PI].
|
||||
/// Results are undefined if |x| > 1.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml">GLSL acos man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType acos(genType const & x);
|
||||
|
||||
//! 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.
|
||||
//!
|
||||
/// 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.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType atan(genType const & y, genType const & x);
|
||||
|
||||
//! Arc tangent. Returns an angle whose tangent is y_over_x.
|
||||
//! The range of values returned by this function is [-PI/2, PI/2].
|
||||
//!
|
||||
/// Arc tangent. Returns an angle whose tangent is y_over_x.
|
||||
/// The range of values returned by this function is [-PI/2, PI/2].
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType atan(genType const & y_over_x);
|
||||
|
||||
//! Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2
|
||||
//!
|
||||
/// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml">GLSL sinh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType sinh(genType const & angle);
|
||||
|
||||
//! Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2
|
||||
//!
|
||||
/// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml">GLSL cosh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType cosh(genType const & angle);
|
||||
|
||||
//! Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)
|
||||
//!
|
||||
/// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml">GLSL tanh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType tanh(genType const & angle);
|
||||
|
||||
//! Arc hyperbolic sine; returns the inverse of sinh.
|
||||
//!
|
||||
/// Arc hyperbolic sine; returns the inverse of sinh.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml">GLSL asinh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType asinh(genType const & x);
|
||||
|
||||
//! Arc hyperbolic cosine; returns the non-negative inverse
|
||||
//! of cosh. Results are undefined if x < 1.
|
||||
//!
|
||||
/// Arc hyperbolic cosine; returns the non-negative inverse
|
||||
/// of cosh. Results are undefined if x < 1.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml">GLSL acosh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
genType acosh(genType const & x);
|
||||
|
||||
//! Arc hyperbolic tangent; returns the inverse of tanh.
|
||||
//! Results are undefined if abs(x) >= 1.
|
||||
//!
|
||||
/// Arc hyperbolic tangent; returns the inverse of tanh.
|
||||
/// Results are undefined if abs(x) >= 1.
|
||||
///
|
||||
/// @tparam genType Floating-point scalar or vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml">GLSL atanh man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1</a>
|
||||
template <typename genType>
|
||||
|
|
|
@ -26,732 +26,221 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "_vectorize.hpp"
|
||||
|
||||
// radians
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType radians
|
||||
(
|
||||
genType const & degrees
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'radians' only accept floating-point input");
|
||||
// radians
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType radians
|
||||
(
|
||||
genType const & degrees
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'radians' only accept floating-point input");
|
||||
|
||||
const genType pi = genType(3.1415926535897932384626433832795);
|
||||
return degrees * (pi / genType(180));
|
||||
}
|
||||
genType const pi = genType(3.1415926535897932384626433832795);
|
||||
return degrees * (pi / genType(180));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> radians
|
||||
(
|
||||
detail::tvec2<T> const & degrees
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
radians(degrees.x),
|
||||
radians(degrees.y));
|
||||
}
|
||||
VECTORIZE_VEC(radians)
|
||||
|
||||
// degrees
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType degrees
|
||||
(
|
||||
genType const & radians
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'degrees' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> radians
|
||||
(
|
||||
detail::tvec3<T> const & degrees
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
radians(degrees.x),
|
||||
radians(degrees.y),
|
||||
radians(degrees.z));
|
||||
}
|
||||
const genType pi = genType(3.1415926535897932384626433832795);
|
||||
return radians * (genType(180) / pi);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> radians
|
||||
(
|
||||
detail::tvec4<T> const & degrees
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
radians(degrees.x),
|
||||
radians(degrees.y),
|
||||
radians(degrees.z),
|
||||
radians(degrees.w));
|
||||
}
|
||||
VECTORIZE_VEC(degrees)
|
||||
|
||||
// degrees
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType degrees
|
||||
(
|
||||
genType const & radians
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'degrees' only accept floating-point input");
|
||||
// sin
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sin
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sin' only accept floating-point input");
|
||||
|
||||
const genType pi = genType(3.1415926535897932384626433832795);
|
||||
return radians * (genType(180) / pi);
|
||||
}
|
||||
return ::std::sin(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> degrees
|
||||
(
|
||||
detail::tvec2<T> const & radians
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
degrees(radians.x),
|
||||
degrees(radians.y));
|
||||
}
|
||||
VECTORIZE_VEC(sin)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> degrees
|
||||
(
|
||||
detail::tvec3<T> const & radians
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
degrees(radians.x),
|
||||
degrees(radians.y),
|
||||
degrees(radians.z));
|
||||
}
|
||||
// cos
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cos(genType const & angle)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cos' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> degrees
|
||||
(
|
||||
detail::tvec4<T> const & radians
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
degrees(radians.x),
|
||||
degrees(radians.y),
|
||||
degrees(radians.z),
|
||||
degrees(radians.w));
|
||||
}
|
||||
return ::std::cos(angle);
|
||||
}
|
||||
|
||||
// sin
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sin
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sin' only accept floating-point input");
|
||||
VECTORIZE_VEC(cos)
|
||||
|
||||
return ::std::sin(angle);
|
||||
}
|
||||
// tan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType tan
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tan' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> sin
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
sin(angle.x),
|
||||
sin(angle.y));
|
||||
}
|
||||
return ::std::tan(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> sin
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
sin(angle.x),
|
||||
sin(angle.y),
|
||||
sin(angle.z));
|
||||
}
|
||||
VECTORIZE_VEC(tan)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> sin
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
sin(angle.x),
|
||||
sin(angle.y),
|
||||
sin(angle.z),
|
||||
sin(angle.w));
|
||||
}
|
||||
// asin
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asin
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asin' only accept floating-point input");
|
||||
|
||||
// cos
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cos(genType const & angle)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cos' only accept floating-point input");
|
||||
return ::std::asin(x);
|
||||
}
|
||||
|
||||
return ::std::cos(angle);
|
||||
}
|
||||
VECTORIZE_VEC(asin)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> cos
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
cos(angle.x),
|
||||
cos(angle.y));
|
||||
}
|
||||
// acos
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acos
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acos' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> cos
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
cos(angle.x),
|
||||
cos(angle.y),
|
||||
cos(angle.z));
|
||||
}
|
||||
return ::std::acos(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> cos
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
cos(angle.x),
|
||||
cos(angle.y),
|
||||
cos(angle.z),
|
||||
cos(angle.w));
|
||||
}
|
||||
VECTORIZE_VEC(acos)
|
||||
|
||||
// tan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType tan
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tan' only accept floating-point input");
|
||||
// atan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atan
|
||||
(
|
||||
genType const & y,
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
|
||||
|
||||
return ::std::tan(angle);
|
||||
}
|
||||
return ::std::atan2(y, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> tan
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
tan(angle.x),
|
||||
tan(angle.y));
|
||||
}
|
||||
VECTORIZE_VEC_VEC(atan)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> tan
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
tan(angle.x),
|
||||
tan(angle.y),
|
||||
tan(angle.z));
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atan
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> tan
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
tan(angle.x),
|
||||
tan(angle.y),
|
||||
tan(angle.z),
|
||||
tan(angle.w));
|
||||
}
|
||||
return ::std::atan(x);
|
||||
}
|
||||
|
||||
// asin
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asin
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asin' only accept floating-point input");
|
||||
VECTORIZE_VEC(atan)
|
||||
|
||||
return ::std::asin(x);
|
||||
}
|
||||
// sinh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sinh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sinh' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> asin
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
asin(x.x),
|
||||
asin(x.y));
|
||||
}
|
||||
return std::sinh(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> asin
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
asin(x.x),
|
||||
asin(x.y),
|
||||
asin(x.z));
|
||||
}
|
||||
VECTORIZE_VEC(sinh)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> asin
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
asin(x.x),
|
||||
asin(x.y),
|
||||
asin(x.z),
|
||||
asin(x.w));
|
||||
}
|
||||
// cosh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cosh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cosh' only accept floating-point input");
|
||||
|
||||
// acos
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acos
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acos' only accept floating-point input");
|
||||
return std::cosh(angle);
|
||||
}
|
||||
|
||||
return ::std::acos(x);
|
||||
}
|
||||
VECTORIZE_VEC(cosh)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> acos
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
acos(x.x),
|
||||
acos(x.y));
|
||||
}
|
||||
// tanh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType tanh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tanh' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> acos
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
acos(x.x),
|
||||
acos(x.y),
|
||||
acos(x.z));
|
||||
}
|
||||
return std::tanh(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> acos
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
acos(x.x),
|
||||
acos(x.y),
|
||||
acos(x.z),
|
||||
acos(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(tanh)
|
||||
|
||||
// atan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atan
|
||||
(
|
||||
genType const & y,
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
|
||||
|
||||
return ::std::atan2(y, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> atan
|
||||
(
|
||||
detail::tvec2<T> const & y,
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
atan(y.x, x.x),
|
||||
atan(y.y, x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> atan
|
||||
(
|
||||
detail::tvec3<T> const & y,
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
atan(y.x, x.x),
|
||||
atan(y.y, x.y),
|
||||
atan(y.z, x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> atan
|
||||
(
|
||||
detail::tvec4<T> const & y,
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
atan(y.x, x.x),
|
||||
atan(y.y, x.y),
|
||||
atan(y.z, x.z),
|
||||
atan(y.w, x.w));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atan
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input");
|
||||
|
||||
return ::std::atan(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> atan
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
atan(x.x),
|
||||
atan(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> atan
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
atan(x.x),
|
||||
atan(x.y),
|
||||
atan(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> atan
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
atan(x.x),
|
||||
atan(x.y),
|
||||
atan(x.z),
|
||||
atan(x.w));
|
||||
}
|
||||
|
||||
// sinh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sinh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sinh' only accept floating-point input");
|
||||
|
||||
return std::sinh(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> sinh
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
sinh(angle.x),
|
||||
sinh(angle.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> sinh
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
sinh(angle.x),
|
||||
sinh(angle.y),
|
||||
sinh(angle.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> sinh
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
sinh(angle.x),
|
||||
sinh(angle.y),
|
||||
sinh(angle.z),
|
||||
sinh(angle.w));
|
||||
}
|
||||
|
||||
// cosh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cosh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cosh' only accept floating-point input");
|
||||
|
||||
return std::cosh(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> cosh
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
cosh(angle.x),
|
||||
cosh(angle.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> cosh
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
cosh(angle.x),
|
||||
cosh(angle.y),
|
||||
cosh(angle.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> cosh
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
cosh(angle.x),
|
||||
cosh(angle.y),
|
||||
cosh(angle.z),
|
||||
cosh(angle.w));
|
||||
}
|
||||
|
||||
// tanh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType tanh
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tanh' only accept floating-point input");
|
||||
|
||||
return std::tanh(angle);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> tanh
|
||||
(
|
||||
detail::tvec2<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
tanh(angle.x),
|
||||
tanh(angle.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> tanh
|
||||
(
|
||||
detail::tvec3<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
tanh(angle.x),
|
||||
tanh(angle.y),
|
||||
tanh(angle.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> tanh
|
||||
(
|
||||
detail::tvec4<T> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
tanh(angle.x),
|
||||
tanh(angle.y),
|
||||
tanh(angle.z),
|
||||
tanh(angle.w));
|
||||
}
|
||||
|
||||
// asinh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asinh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asinh' only accept floating-point input");
|
||||
// asinh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asinh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asinh' only accept floating-point input");
|
||||
|
||||
return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x));
|
||||
}
|
||||
return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> asinh
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
asinh(x.x),
|
||||
asinh(x.y));
|
||||
}
|
||||
VECTORIZE_VEC(asinh)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> asinh
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
asinh(x.x),
|
||||
asinh(x.y),
|
||||
asinh(x.z));
|
||||
}
|
||||
// acosh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acosh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acosh' only accept floating-point input");
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> asinh
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
asinh(x.x),
|
||||
asinh(x.y),
|
||||
asinh(x.z),
|
||||
asinh(x.w));
|
||||
}
|
||||
if(x < genType(1))
|
||||
return genType(0);
|
||||
return log(x + sqrt(x * x - genType(1)));
|
||||
}
|
||||
|
||||
// acosh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acosh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acosh' only accept floating-point input");
|
||||
VECTORIZE_VEC(acosh)
|
||||
|
||||
if(x < genType(1))
|
||||
return genType(0);
|
||||
return log(x + sqrt(x * x - genType(1)));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> acosh
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
acosh(x.x),
|
||||
acosh(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> acosh
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
acosh(x.x),
|
||||
acosh(x.y),
|
||||
acosh(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> acosh
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
acosh(x.x),
|
||||
acosh(x.y),
|
||||
acosh(x.z),
|
||||
acosh(x.w));
|
||||
}
|
||||
|
||||
// atanh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atanh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atanh' only accept floating-point input");
|
||||
// atanh
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType atanh
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atanh' only accept floating-point input");
|
||||
|
||||
if(abs(x) >= genType(1))
|
||||
return 0;
|
||||
return genType(0.5) * log((genType(1) + x) / (genType(1) - x));
|
||||
}
|
||||
if(abs(x) >= genType(1))
|
||||
return 0;
|
||||
return genType(0.5) * log((genType(1) + x) / (genType(1) - x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> atanh
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
atanh(x.x),
|
||||
atanh(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> atanh
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
atanh(x.x),
|
||||
atanh(x.y),
|
||||
atanh(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> atanh
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
atanh(x.x),
|
||||
atanh(x.y),
|
||||
atanh(x.z),
|
||||
atanh(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(atanh)
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -48,65 +48,83 @@ namespace glm
|
|||
/// @addtogroup core_func_vector_relational
|
||||
/// @{
|
||||
|
||||
//! Returns the component-wise comparison result of x < y.
|
||||
//!
|
||||
/// Returns the component-wise comparison result of x < y.
|
||||
///
|
||||
/// @tparam vecType Floating-point or integer vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml">GLSL lessThan man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
//template <typename T, template <typename> class vecType>
|
||||
//GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThan(vecType<T> const & x, vecType<T> const & y);
|
||||
template <typename vecType>
|
||||
GLM_FUNC_QUALIFIER typename vecType::bool_type lessThan(vecType const & x, vecType const & y);
|
||||
|
||||
//! Returns the component-wise comparison of result x <= y.
|
||||
//!
|
||||
/// Returns the component-wise comparison of result x <= y.
|
||||
///
|
||||
/// @tparam vecType Floating-point or integer vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml">GLSL lessThanEqual man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThanEqual(vecType<T> const & x, vecType<T> const & y);
|
||||
|
||||
//! Returns the component-wise comparison of result x > y.
|
||||
//!
|
||||
/// Returns the component-wise comparison of result x > y.
|
||||
///
|
||||
/// @tparam vecType Floating-point or integer vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml">GLSL greaterThan man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER typename vecType<T>::bool_type greaterThan(vecType<T> const & x, vecType<T> const & y);
|
||||
|
||||
//! Returns the component-wise comparison of result x >= y.
|
||||
//!
|
||||
/// Returns the component-wise comparison of result x >= y.
|
||||
///
|
||||
/// @tparam vecType Floating-point or integer vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml">GLSL greaterThanEqual man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <typename T, template <typename> class vecType>
|
||||
typename vecType<T>::bool_type greaterThanEqual(vecType<T> const & x, vecType<T> const & y);
|
||||
|
||||
//! Returns the component-wise comparison of result x == y.
|
||||
//!
|
||||
/// Returns the component-wise comparison of result x == y.
|
||||
///
|
||||
/// @tparam vecType Floating-point, integer or boolean vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml">GLSL equal man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
//template <typename T, template <typename> class vecType>
|
||||
//GLM_FUNC_QUALIFIER typename vecType<T>::bool_type equal(vecType<T> const & x, vecType<T> const & y);
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER typename vecType<T>::bool_type equal(vecType<T> const & x, vecType<T> const & y);
|
||||
|
||||
//! Returns the component-wise comparison of result x != y.
|
||||
//!
|
||||
/// Returns the component-wise comparison of result x != y.
|
||||
///
|
||||
/// @tparam vecType Floating-point, integer or boolean vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml">GLSL notEqual man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <typename T, template <typename> class vecType>
|
||||
typename vecType<T>::bool_type notEqual(vecType<T> const & x, vecType<T> const & y);
|
||||
|
||||
//! Returns true if any component of x is true.
|
||||
//!
|
||||
/// Returns true if any component of x is true.
|
||||
///
|
||||
/// @tparam vecType Boolean vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml">GLSL any man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <template <typename> class vecType>
|
||||
bool any(vecType<bool> const & v);
|
||||
|
||||
//! Returns true if all components of x are true.
|
||||
//!
|
||||
/// Returns true if all components of x are true.
|
||||
///
|
||||
/// @tparam vecType Boolean vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml">GLSL all man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <template <typename> class vecType>
|
||||
bool all(vecType<bool> const & v);
|
||||
|
||||
//! Returns the component-wise logical complement of x.
|
||||
//! /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead.
|
||||
//!
|
||||
/// Returns the component-wise logical complement of x.
|
||||
/// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead.
|
||||
///
|
||||
/// @tparam vecType Boolean vector types.
|
||||
///
|
||||
/// @see - <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml">GLSL not man page</a>
|
||||
/// @see - <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7</a>
|
||||
template <template <typename> class vecType>
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -26,49 +26,55 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType row(
|
||||
genType const & m,
|
||||
int index,
|
||||
typename genType::row_type const & x)
|
||||
namespace glm
|
||||
{
|
||||
genType Result = m;
|
||||
for(typename genType::size_type i = 0; i < genType::row_size(); ++i)
|
||||
Result[i][index] = x[i];
|
||||
return Result;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType row
|
||||
(
|
||||
genType const & m,
|
||||
int index,
|
||||
typename genType::row_type const & x
|
||||
)
|
||||
{
|
||||
genType Result = m;
|
||||
for(typename genType::size_type i = 0; i < genType::row_size(); ++i)
|
||||
Result[i][index] = x[i];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::row_type row(
|
||||
genType const & m,
|
||||
int index)
|
||||
{
|
||||
typename genType::row_type Result;
|
||||
for(typename genType::size_type i = 0; i < genType::row_size(); ++i)
|
||||
Result[i] = m[i][index];
|
||||
return Result;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::row_type row
|
||||
(
|
||||
genType const & m,
|
||||
int index
|
||||
)
|
||||
{
|
||||
typename genType::row_type Result;
|
||||
for(typename genType::size_type i = 0; i < genType::row_size(); ++i)
|
||||
Result[i] = m[i][index];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType column(
|
||||
genType const & m,
|
||||
int index,
|
||||
typename genType::col_type const & x)
|
||||
{
|
||||
genType Result = m;
|
||||
Result[index] = x;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::col_type column(
|
||||
genType const & m,
|
||||
int index)
|
||||
{
|
||||
return m[index];
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType column
|
||||
(
|
||||
genType const & m,
|
||||
int index,
|
||||
typename genType::col_type const & x
|
||||
)
|
||||
{
|
||||
genType Result = m;
|
||||
Result[index] = x;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::col_type column
|
||||
(
|
||||
genType const & m,
|
||||
int index
|
||||
)
|
||||
{
|
||||
return m[index];
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
|
|
|
@ -26,129 +26,134 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> affineInverse
|
||||
(
|
||||
detail::tmat3x3<T> const & m
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat3x3<T> Result(m);
|
||||
Result[2] = detail::tvec3<T>(0, 0, 1);
|
||||
Result = transpose(Result);
|
||||
detail::tvec3<T> Translation = Result * detail::tvec3<T>(-detail::tvec2<T>(m[2]), m[2][2]);
|
||||
Result[2] = Translation;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> affineInverse
|
||||
(
|
||||
detail::tmat3x3<T> const & m
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<T> Result(m);
|
||||
Result[2] = detail::tvec3<T>(0, 0, 1);
|
||||
Result = transpose(Result);
|
||||
detail::tvec3<T> Translation = Result * detail::tvec3<T>(-detail::tvec2<T>(m[2]), m[2][2]);
|
||||
Result[2] = Translation;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> affineInverse
|
||||
(
|
||||
detail::tmat4x4<T> const & m
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(m);
|
||||
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
|
||||
Result = transpose(Result);
|
||||
detail::tvec4<T> Translation = Result * detail::tvec4<T>(-detail::tvec3<T>(m[3]), m[3][3]);
|
||||
Result[3] = Translation;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> affineInverse
|
||||
(
|
||||
detail::tmat4x4<T> const & m
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(m);
|
||||
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
|
||||
Result = transpose(Result);
|
||||
detail::tvec4<T> Translation = Result * detail::tvec4<T>(-detail::tvec3<T>(m[3]), m[3][3]);
|
||||
Result[3] = Translation;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> inverseTranspose(
|
||||
detail::tmat2x2<valType> const & m)
|
||||
{
|
||||
valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> inverseTranspose
|
||||
(
|
||||
detail::tmat2x2<valType> const & m
|
||||
)
|
||||
{
|
||||
valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];
|
||||
|
||||
detail::tmat2x2<valType> Inverse(
|
||||
+ m[1][1] / Determinant,
|
||||
- m[0][1] / Determinant,
|
||||
- m[1][0] / Determinant,
|
||||
+ m[0][0] / Determinant);
|
||||
detail::tmat2x2<valType> Inverse(
|
||||
+ m[1][1] / Determinant,
|
||||
- m[0][1] / Determinant,
|
||||
- m[1][0] / Determinant,
|
||||
+ m[0][0] / Determinant);
|
||||
|
||||
return Inverse;
|
||||
}
|
||||
return Inverse;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> inverseTranspose(
|
||||
detail::tmat3x3<valType> const & m)
|
||||
{
|
||||
valType Determinant =
|
||||
+ m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])
|
||||
- m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0])
|
||||
+ m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> inverseTranspose
|
||||
(
|
||||
detail::tmat3x3<valType> const & m
|
||||
)
|
||||
{
|
||||
valType Determinant =
|
||||
+ m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])
|
||||
- m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0])
|
||||
+ m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
|
||||
|
||||
detail::tmat3x3<valType> Inverse;
|
||||
Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
|
||||
Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
|
||||
Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
|
||||
Inverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);
|
||||
Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);
|
||||
Inverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
|
||||
Inverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
|
||||
Inverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);
|
||||
Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
|
||||
Inverse /= Determinant;
|
||||
detail::tmat3x3<valType> Inverse;
|
||||
Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
|
||||
Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
|
||||
Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
|
||||
Inverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);
|
||||
Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);
|
||||
Inverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
|
||||
Inverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
|
||||
Inverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);
|
||||
Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
|
||||
Inverse /= Determinant;
|
||||
|
||||
return Inverse;
|
||||
}
|
||||
return Inverse;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> inverseTranspose(
|
||||
detail::tmat4x4<valType> const & m)
|
||||
{
|
||||
valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
|
||||
valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
|
||||
valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
|
||||
valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
|
||||
valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
|
||||
valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
|
||||
valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
|
||||
valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
|
||||
valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
|
||||
valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
|
||||
valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
|
||||
valType SubFactor11 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
|
||||
valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
|
||||
valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
|
||||
valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
|
||||
valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
|
||||
valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
|
||||
valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
|
||||
valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> inverseTranspose
|
||||
(
|
||||
detail::tmat4x4<valType> const & m
|
||||
)
|
||||
{
|
||||
valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
|
||||
valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
|
||||
valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
|
||||
valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
|
||||
valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
|
||||
valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
|
||||
valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
|
||||
valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
|
||||
valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
|
||||
valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
|
||||
valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
|
||||
valType SubFactor11 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
|
||||
valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
|
||||
valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
|
||||
valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
|
||||
valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
|
||||
valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
|
||||
valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
|
||||
valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
|
||||
|
||||
detail::tmat4x4<valType> Inverse;
|
||||
Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02);
|
||||
Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04);
|
||||
Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05);
|
||||
Inverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05);
|
||||
detail::tmat4x4<valType> Inverse;
|
||||
Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02);
|
||||
Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04);
|
||||
Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05);
|
||||
Inverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05);
|
||||
|
||||
Inverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02);
|
||||
Inverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04);
|
||||
Inverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05);
|
||||
Inverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05);
|
||||
Inverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02);
|
||||
Inverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04);
|
||||
Inverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05);
|
||||
Inverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05);
|
||||
|
||||
Inverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08);
|
||||
Inverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10);
|
||||
Inverse[2][2] = + (m[0][0] * SubFactor11 - m[0][1] * SubFactor09 + m[0][3] * SubFactor12);
|
||||
Inverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor12);
|
||||
Inverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08);
|
||||
Inverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10);
|
||||
Inverse[2][2] = + (m[0][0] * SubFactor11 - m[0][1] * SubFactor09 + m[0][3] * SubFactor12);
|
||||
Inverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor12);
|
||||
|
||||
Inverse[3][0] = - (m[0][1] * SubFactor13 - m[0][2] * SubFactor14 + m[0][3] * SubFactor15);
|
||||
Inverse[3][1] = + (m[0][0] * SubFactor13 - m[0][2] * SubFactor16 + m[0][3] * SubFactor17);
|
||||
Inverse[3][2] = - (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][3] * SubFactor18);
|
||||
Inverse[3][3] = + (m[0][0] * SubFactor15 - m[0][1] * SubFactor17 + m[0][2] * SubFactor18);
|
||||
Inverse[3][0] = - (m[0][1] * SubFactor13 - m[0][2] * SubFactor14 + m[0][3] * SubFactor15);
|
||||
Inverse[3][1] = + (m[0][0] * SubFactor13 - m[0][2] * SubFactor16 + m[0][3] * SubFactor17);
|
||||
Inverse[3][2] = - (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][3] * SubFactor18);
|
||||
Inverse[3][3] = + (m[0][0] * SubFactor15 - m[0][1] * SubFactor17 + m[0][2] * SubFactor18);
|
||||
|
||||
valType Determinant =
|
||||
+ m[0][0] * Inverse[0][0]
|
||||
+ m[0][1] * Inverse[0][1]
|
||||
+ m[0][2] * Inverse[0][2]
|
||||
+ m[0][3] * Inverse[0][3];
|
||||
valType Determinant =
|
||||
+ m[0][0] * Inverse[0][0]
|
||||
+ m[0][1] * Inverse[0][1]
|
||||
+ m[0][2] * Inverse[0][2]
|
||||
+ m[0][3] * Inverse[0][3];
|
||||
|
||||
Inverse /= Determinant;
|
||||
Inverse /= Determinant;
|
||||
|
||||
return Inverse;
|
||||
}
|
||||
|
||||
return Inverse;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -26,388 +26,387 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat4x4<T> Result(m);
|
||||
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(m);
|
||||
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
T a = radians(angle);
|
||||
T c = cos(a);
|
||||
T s = sin(a);
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
T a = radians(angle);
|
||||
T c = cos(a);
|
||||
T s = sin(a);
|
||||
|
||||
detail::tvec3<T> axis = normalize(v);
|
||||
detail::tvec3<T> axis = normalize(v);
|
||||
|
||||
detail::tvec3<T> temp = (T(1) - c) * axis;
|
||||
detail::tvec3<T> temp = (T(1) - c) * axis;
|
||||
|
||||
detail::tmat4x4<T> Rotate(detail::tmat4x4<T>::null);
|
||||
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];
|
||||
detail::tmat4x4<T> Rotate(detail::tmat4x4<T>::null);
|
||||
Rotate[0][0] = c + temp[0] * axis[0];
|
||||
Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
|
||||
Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];
|
||||
|
||||
Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
|
||||
Rotate[1][1] = c + temp[1] * axis[1];
|
||||
Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
|
||||
Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
|
||||
Rotate[1][1] = c + temp[1] * axis[1];
|
||||
Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];
|
||||
|
||||
Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
|
||||
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
|
||||
Rotate[2][2] = c + temp[2] * axis[2];
|
||||
Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
|
||||
Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
|
||||
Rotate[2][2] = c + temp[2] * axis[2];
|
||||
|
||||
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
|
||||
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];
|
||||
Result[3] = m[3];
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
|
||||
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];
|
||||
Result[3] = m[3];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
|
||||
Result[0] = m[0] * v[0];
|
||||
Result[1] = m[1] * v[1];
|
||||
Result[2] = m[2] * v[2];
|
||||
Result[3] = m[3];
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(detail::tmat4x4<T>::null);
|
||||
Result[0] = m[0] * v[0];
|
||||
Result[1] = m[1] * v[1];
|
||||
Result[2] = m[2] * v[2];
|
||||
Result[3] = m[3];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[3] = detail::tvec4<T>(v, T(1));
|
||||
return m * Result;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[3] = detail::tvec4<T>(v, T(1));
|
||||
return m * Result;
|
||||
|
||||
//detail::tmat4x4<valType> Result(m);
|
||||
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
|
||||
//Result[3][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0];
|
||||
//Result[3][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1];
|
||||
//Result[3][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
|
||||
//Result[3][3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
|
||||
//return Result;
|
||||
}
|
||||
//detail::tmat4x4<valType> Result(m);
|
||||
Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
|
||||
//Result[3][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0];
|
||||
//Result[3][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1];
|
||||
//Result[3][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2];
|
||||
//Result[3][3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3];
|
||||
//return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
T a = radians(angle);
|
||||
T c = cos(a);
|
||||
T s = sin(a);
|
||||
detail::tmat4x4<T> Result;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
T a = radians(angle);
|
||||
T c = cos(a);
|
||||
T s = sin(a);
|
||||
detail::tmat4x4<T> Result;
|
||||
|
||||
detail::tvec3<T> axis = normalize(v);
|
||||
detail::tvec3<T> axis = normalize(v);
|
||||
|
||||
Result[0][0] = c + (1 - c) * axis.x * axis.x;
|
||||
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;
|
||||
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;
|
||||
Result[0][3] = 0;
|
||||
Result[0][0] = c + (1 - c) * axis.x * axis.x;
|
||||
Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z;
|
||||
Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y;
|
||||
Result[0][3] = 0;
|
||||
|
||||
Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;
|
||||
Result[1][1] = c + (1 - c) * axis.y * axis.y;
|
||||
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;
|
||||
Result[1][3] = 0;
|
||||
Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z;
|
||||
Result[1][1] = c + (1 - c) * axis.y * axis.y;
|
||||
Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x;
|
||||
Result[1][3] = 0;
|
||||
|
||||
Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;
|
||||
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;
|
||||
Result[2][2] = c + (1 - c) * axis.z * axis.z;
|
||||
Result[2][3] = 0;
|
||||
Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y;
|
||||
Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x;
|
||||
Result[2][2] = c + (1 - c) * axis.z * axis.z;
|
||||
Result[2][3] = 0;
|
||||
|
||||
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
|
||||
return m * Result;
|
||||
}
|
||||
Result[3] = detail::tvec4<T>(0, 0, 0, 1);
|
||||
return m * Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[0][0] = v.x;
|
||||
Result[1][1] = v.y;
|
||||
Result[2][2] = v.z;
|
||||
return m * Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale_slow
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[0][0] = v.x;
|
||||
Result[1][1] = v.y;
|
||||
Result[2][2] = v.z;
|
||||
return m * Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
|
||||
(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(1);
|
||||
Result[0][0] = valType(2) / (right - left);
|
||||
Result[1][1] = valType(2) / (top - bottom);
|
||||
Result[2][2] = - valType(2) / (zFar - zNear);
|
||||
Result[3][0] = - (right + left) / (right - left);
|
||||
Result[3][1] = - (top + bottom) / (top - bottom);
|
||||
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
|
||||
(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(1);
|
||||
Result[0][0] = valType(2) / (right - left);
|
||||
Result[1][1] = valType(2) / (top - bottom);
|
||||
Result[2][2] = - valType(2) / (zFar - zNear);
|
||||
Result[3][0] = - (right + left) / (right - left);
|
||||
Result[3][1] = - (top + bottom) / (top - bottom);
|
||||
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(1);
|
||||
Result[0][0] = valType(2) / (right - left);
|
||||
Result[1][1] = valType(2) / (top - bottom);
|
||||
Result[2][2] = - valType(1);
|
||||
Result[3][0] = - (right + left) / (right - left);
|
||||
Result[3][1] = - (top + bottom) / (top - bottom);
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(1);
|
||||
Result[0][0] = valType(2) / (right - left);
|
||||
Result[1][1] = valType(2) / (top - bottom);
|
||||
Result[2][2] = - valType(1);
|
||||
Result[3][0] = - (right + left) / (right - left);
|
||||
Result[3][1] = - (top + bottom) / (top - bottom);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> frustum
|
||||
(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top,
|
||||
valType const & nearVal,
|
||||
valType const & farVal
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(0);
|
||||
Result[0][0] = (valType(2) * nearVal) / (right - left);
|
||||
Result[1][1] = (valType(2) * nearVal) / (top - bottom);
|
||||
Result[2][0] = (right + left) / (right - left);
|
||||
Result[2][1] = (top + bottom) / (top - bottom);
|
||||
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
|
||||
Result[2][3] = valType(-1);
|
||||
Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> frustum
|
||||
(
|
||||
valType const & left,
|
||||
valType const & right,
|
||||
valType const & bottom,
|
||||
valType const & top,
|
||||
valType const & nearVal,
|
||||
valType const & farVal
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(0);
|
||||
Result[0][0] = (valType(2) * nearVal) / (right - left);
|
||||
Result[1][1] = (valType(2) * nearVal) / (top - bottom);
|
||||
Result[2][0] = (right + left) / (right - left);
|
||||
Result[2][1] = (top + bottom) / (top - bottom);
|
||||
Result[2][2] = -(farVal + nearVal) / (farVal - nearVal);
|
||||
Result[2][3] = valType(-1);
|
||||
Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspective
|
||||
(
|
||||
valType const & fovy,
|
||||
valType const & aspect,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
valType range = tan(radians(fovy / valType(2))) * zNear;
|
||||
valType left = -range * aspect;
|
||||
valType right = range * aspect;
|
||||
valType bottom = -range;
|
||||
valType top = range;
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspective
|
||||
(
|
||||
valType const & fovy,
|
||||
valType const & aspect,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
valType range = tan(radians(fovy / valType(2))) * zNear;
|
||||
valType left = -range * aspect;
|
||||
valType right = range * aspect;
|
||||
valType bottom = -range;
|
||||
valType top = range;
|
||||
|
||||
detail::tmat4x4<valType> Result(valType(0));
|
||||
Result[0][0] = (valType(2) * zNear) / (right - left);
|
||||
Result[1][1] = (valType(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
||||
Result[2][3] = - valType(1);
|
||||
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<valType> Result(valType(0));
|
||||
Result[0][0] = (valType(2) * zNear) / (right - left);
|
||||
Result[1][1] = (valType(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = - (zFar + zNear) / (zFar - zNear);
|
||||
Result[2][3] = - valType(1);
|
||||
Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspectiveFov
|
||||
(
|
||||
valType const & fov,
|
||||
valType const & width,
|
||||
valType const & height,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
valType rad = glm::radians(fov);
|
||||
valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);
|
||||
valType w = h * height / width;
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspectiveFov
|
||||
(
|
||||
valType const & fov,
|
||||
valType const & width,
|
||||
valType const & height,
|
||||
valType const & zNear,
|
||||
valType const & zFar
|
||||
)
|
||||
{
|
||||
valType rad = glm::radians(fov);
|
||||
valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad);
|
||||
valType w = h * height / width;
|
||||
|
||||
detail::tmat4x4<valType> Result(valType(0));
|
||||
Result[0][0] = w;
|
||||
Result[1][1] = h;
|
||||
Result[2][2] = (zFar + zNear) / (zFar - zNear);
|
||||
Result[2][3] = valType(1);
|
||||
Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<valType> Result(valType(0));
|
||||
Result[0][0] = w;
|
||||
Result[1][1] = h;
|
||||
Result[2][2] = (zFar + zNear) / (zFar - zNear);
|
||||
Result[2][3] = valType(1);
|
||||
Result[3][2] = -(valType(2) * zFar * zNear) / (zFar - zNear);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> infinitePerspective
|
||||
(
|
||||
T fovy,
|
||||
T aspect,
|
||||
T zNear
|
||||
)
|
||||
{
|
||||
T range = tan(radians(fovy / T(2))) * zNear;
|
||||
T left = -range * aspect;
|
||||
T right = range * aspect;
|
||||
T bottom = -range;
|
||||
T top = range;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> infinitePerspective
|
||||
(
|
||||
T fovy,
|
||||
T aspect,
|
||||
T zNear
|
||||
)
|
||||
{
|
||||
T range = tan(radians(fovy / T(2))) * zNear;
|
||||
T left = -range * aspect;
|
||||
T right = range * aspect;
|
||||
T bottom = -range;
|
||||
T top = range;
|
||||
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][0] = (T(2) * zNear) / (right - left);
|
||||
Result[1][1] = (T(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = - T(1);
|
||||
Result[2][3] = - T(1);
|
||||
Result[3][2] = - T(2) * zNear;
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][0] = (T(2) * zNear) / (right - left);
|
||||
Result[1][1] = (T(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = - T(1);
|
||||
Result[2][3] = - T(1);
|
||||
Result[3][2] = - T(2) * zNear;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> tweakedInfinitePerspective
|
||||
(
|
||||
T fovy,
|
||||
T aspect,
|
||||
T zNear
|
||||
)
|
||||
{
|
||||
T range = tan(radians(fovy / T(2))) * zNear;
|
||||
T left = -range * aspect;
|
||||
T right = range * aspect;
|
||||
T bottom = -range;
|
||||
T top = range;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> tweakedInfinitePerspective
|
||||
(
|
||||
T fovy,
|
||||
T aspect,
|
||||
T zNear
|
||||
)
|
||||
{
|
||||
T range = tan(radians(fovy / T(2))) * zNear;
|
||||
T left = -range * aspect;
|
||||
T right = range * aspect;
|
||||
T bottom = -range;
|
||||
T top = range;
|
||||
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][0] = (T(2) * zNear) / (right - left);
|
||||
Result[1][1] = (T(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = T(0.0001) - T(1);
|
||||
Result[2][3] = T(-1);
|
||||
Result[3][2] = - (T(0.0001) - T(2)) * zNear;
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][0] = (T(2) * zNear) / (right - left);
|
||||
Result[1][1] = (T(2) * zNear) / (top - bottom);
|
||||
Result[2][2] = T(0.0001) - T(1);
|
||||
Result[2][3] = T(-1);
|
||||
Result[3][2] = - (T(0.0001) - T(2)) * zNear;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> project
|
||||
(
|
||||
detail::tvec3<T> const & obj,
|
||||
detail::tmat4x4<T> const & model,
|
||||
detail::tmat4x4<T> const & proj,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> tmp = detail::tvec4<T>(obj, T(1));
|
||||
tmp = model * tmp;
|
||||
tmp = proj * tmp;
|
||||
template <typename T, typename U>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> project
|
||||
(
|
||||
detail::tvec3<T> const & obj,
|
||||
detail::tmat4x4<T> const & model,
|
||||
detail::tmat4x4<T> const & proj,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> tmp = detail::tvec4<T>(obj, T(1));
|
||||
tmp = model * tmp;
|
||||
tmp = proj * tmp;
|
||||
|
||||
tmp /= tmp.w;
|
||||
tmp = tmp * T(0.5) + T(0.5);
|
||||
tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
|
||||
tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
|
||||
tmp /= tmp.w;
|
||||
tmp = tmp * T(0.5) + T(0.5);
|
||||
tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]);
|
||||
tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]);
|
||||
|
||||
return detail::tvec3<T>(tmp);
|
||||
}
|
||||
return detail::tvec3<T>(tmp);
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> unProject
|
||||
(
|
||||
detail::tvec3<T> const & win,
|
||||
detail::tmat4x4<T> const & model,
|
||||
detail::tmat4x4<T> const & proj,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> inverse = glm::inverse(proj * model);
|
||||
template <typename T, typename U>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> unProject
|
||||
(
|
||||
detail::tvec3<T> const & win,
|
||||
detail::tmat4x4<T> const & model,
|
||||
detail::tmat4x4<T> const & proj,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> inverse = glm::inverse(proj * model);
|
||||
|
||||
detail::tvec4<T> tmp = detail::tvec4<T>(win, T(1));
|
||||
tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
|
||||
tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
|
||||
tmp = tmp * T(2) - T(1);
|
||||
detail::tvec4<T> tmp = detail::tvec4<T>(win, T(1));
|
||||
tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]);
|
||||
tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]);
|
||||
tmp = tmp * T(2) - T(1);
|
||||
|
||||
detail::tvec4<T> obj = inverse * tmp;
|
||||
obj /= obj.w;
|
||||
detail::tvec4<T> obj = inverse * tmp;
|
||||
obj /= obj.w;
|
||||
|
||||
return detail::tvec3<T>(obj);
|
||||
}
|
||||
return detail::tvec3<T>(obj);
|
||||
}
|
||||
|
||||
template <typename T, typename U>
|
||||
detail::tmat4x4<T> pickMatrix
|
||||
(
|
||||
detail::tvec2<T> const & center,
|
||||
detail::tvec2<T> const & delta,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
assert(delta.x > T(0) && delta.y > T(0));
|
||||
detail::tmat4x4<T> Result(1.0f);
|
||||
template <typename T, typename U>
|
||||
detail::tmat4x4<T> pickMatrix
|
||||
(
|
||||
detail::tvec2<T> const & center,
|
||||
detail::tvec2<T> const & delta,
|
||||
detail::tvec4<U> const & viewport
|
||||
)
|
||||
{
|
||||
assert(delta.x > T(0) && delta.y > T(0));
|
||||
detail::tmat4x4<T> Result(1.0f);
|
||||
|
||||
if(!(delta.x > T(0) && delta.y > T(0)))
|
||||
return Result; // Error
|
||||
if(!(delta.x > T(0) && delta.y > T(0)))
|
||||
return Result; // Error
|
||||
|
||||
detail::tvec3<T> Temp(
|
||||
(T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x,
|
||||
(T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y,
|
||||
T(0));
|
||||
detail::tvec3<T> Temp(
|
||||
(T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x,
|
||||
(T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y,
|
||||
T(0));
|
||||
|
||||
// Translate and scale the picked region to the entire window
|
||||
Result = translate(Result, Temp);
|
||||
return scale(Result, detail::tvec3<T>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1)));
|
||||
}
|
||||
// Translate and scale the picked region to the entire window
|
||||
Result = translate(Result, Temp);
|
||||
return scale(Result, detail::tvec3<T>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1)));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> lookAt
|
||||
(
|
||||
detail::tvec3<T> const & eye,
|
||||
detail::tvec3<T> const & center,
|
||||
detail::tvec3<T> const & up
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> f = normalize(center - eye);
|
||||
detail::tvec3<T> u = normalize(up);
|
||||
detail::tvec3<T> s = normalize(cross(f, u));
|
||||
u = cross(s, f);
|
||||
|
||||
detail::tmat4x4<T> Result(1);
|
||||
Result[0][0] = s.x;
|
||||
Result[1][0] = s.y;
|
||||
Result[2][0] = s.z;
|
||||
Result[0][1] = u.x;
|
||||
Result[1][1] = u.y;
|
||||
Result[2][1] = u.z;
|
||||
Result[0][2] =-f.x;
|
||||
Result[1][2] =-f.y;
|
||||
Result[2][2] =-f.z;
|
||||
/* Test this instead of translate3D
|
||||
Result[3][0] =-dot(s, eye);
|
||||
Result[3][1] =-dot(y, eye);
|
||||
Result[3][2] = dot(f, eye);
|
||||
*/
|
||||
return translate(Result, -eye);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> lookAt
|
||||
(
|
||||
detail::tvec3<T> const & eye,
|
||||
detail::tvec3<T> const & center,
|
||||
detail::tvec3<T> const & up
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> f = normalize(center - eye);
|
||||
detail::tvec3<T> u = normalize(up);
|
||||
detail::tvec3<T> s = normalize(cross(f, u));
|
||||
u = cross(s, f);
|
||||
|
||||
detail::tmat4x4<T> Result(1);
|
||||
Result[0][0] = s.x;
|
||||
Result[1][0] = s.y;
|
||||
Result[2][0] = s.z;
|
||||
Result[0][1] = u.x;
|
||||
Result[1][1] = u.y;
|
||||
Result[2][1] = u.z;
|
||||
Result[0][2] =-f.x;
|
||||
Result[1][2] =-f.y;
|
||||
Result[2][2] =-f.z;
|
||||
/* Test this instead of translate3D
|
||||
Result[3][0] =-dot(s, eye);
|
||||
Result[3][1] =-dot(y, eye);
|
||||
Result[3][2] = dot(f, eye);
|
||||
*/
|
||||
return translate(Result, -eye);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
1659
glm/gtc/noise.inl
1659
glm/gtc/noise.inl
File diff suppressed because it is too large
Load diff
|
@ -29,8 +29,8 @@
|
|||
#include <limits>
|
||||
|
||||
namespace glm{
|
||||
namespace detail{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER tquat<T>::tquat() :
|
||||
x(0),
|
||||
|
|
|
@ -9,200 +9,136 @@
|
|||
|
||||
#include <ctime>
|
||||
#include <cassert>
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER glm::half linearRand
|
||||
(
|
||||
glm::half const & Min,
|
||||
glm::half const & Max
|
||||
)
|
||||
namespace detail
|
||||
{
|
||||
return glm::half(float(std::rand()) / float(RAND_MAX) * (float(Max) - float(Min)) + float(Min));
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float linearRand
|
||||
(
|
||||
float const & Min,
|
||||
float const & Max
|
||||
)
|
||||
{
|
||||
return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min;
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double linearRand
|
||||
(
|
||||
double const & Min,
|
||||
double const & Max
|
||||
)
|
||||
{
|
||||
return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> linearRand
|
||||
(
|
||||
detail::tvec2<T> const & Min,
|
||||
detail::tvec2<T> const & Max
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
linearRand(Min.x, Max.x),
|
||||
linearRand(Min.y, Max.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> linearRand
|
||||
(
|
||||
detail::tvec3<T> const & Min,
|
||||
detail::tvec3<T> const & Max
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
linearRand(Min.x, Max.x),
|
||||
linearRand(Min.y, Max.y),
|
||||
linearRand(Min.z, Max.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> linearRand
|
||||
(
|
||||
detail::tvec4<T> const & Min,
|
||||
detail::tvec4<T> const & Max
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
linearRand(Min.x, Max.x),
|
||||
linearRand(Min.y, Max.y),
|
||||
linearRand(Min.z, Max.z),
|
||||
linearRand(Min.w, Max.w));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType gaussRand
|
||||
(
|
||||
genType const & Mean,
|
||||
genType const & Deviation
|
||||
)
|
||||
{
|
||||
genType w, x1, x2;
|
||||
|
||||
do
|
||||
{
|
||||
x1 = linearRand(genType(-1), genType(1));
|
||||
x2 = linearRand(genType(-1), genType(1));
|
||||
|
||||
w = x1 * x1 + x2 * x2;
|
||||
} while(w > genType(1));
|
||||
|
||||
return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> gaussRand
|
||||
(
|
||||
detail::tvec2<T> const & Mean,
|
||||
detail::tvec2<T> const & Deviation
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
gaussRand(Mean.x, Deviation.x),
|
||||
gaussRand(Mean.y, Deviation.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> gaussRand
|
||||
(
|
||||
detail::tvec3<T> const & Mean,
|
||||
detail::tvec3<T> const & Deviation
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
gaussRand(Mean.x, Deviation.x),
|
||||
gaussRand(Mean.y, Deviation.y),
|
||||
gaussRand(Mean.z, Deviation.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> gaussRand
|
||||
(
|
||||
detail::tvec4<T> const & Mean,
|
||||
detail::tvec4<T> const & Deviation
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
gaussRand(Mean.x, Deviation.x),
|
||||
gaussRand(Mean.y, Deviation.y),
|
||||
gaussRand(Mean.z, Deviation.z),
|
||||
gaussRand(Mean.w, Deviation.w));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> diskRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result(T(0));
|
||||
T LenRadius(T(0));
|
||||
|
||||
do
|
||||
struct compute_linearRand
|
||||
{
|
||||
Result = linearRand(detail::tvec2<T>(-Radius), detail::tvec2<T>(Radius));
|
||||
LenRadius = length(Result);
|
||||
}
|
||||
while(LenRadius > Radius);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result(T(0));
|
||||
T LenRadius(T(0));
|
||||
|
||||
do
|
||||
{
|
||||
Result = linearRand(detail::tvec3<T>(-Radius), detail::tvec3<T>(Radius));
|
||||
LenRadius = length(Result);
|
||||
}
|
||||
while(LenRadius > Radius);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = linearRand(T(0), T(6.283185307179586476925286766559f));
|
||||
return detail::tvec2<T>(cos(a), sin(a)) * Radius;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T z = linearRand(T(-1), T(1));
|
||||
T a = linearRand(T(0), T(6.283185307179586476925286766559f));
|
||||
|
||||
T r = sqrt(T(1) - z * z);
|
||||
|
||||
T x = r * cos(a);
|
||||
T y = r * sin(a);
|
||||
|
||||
return detail::tvec3<T>(x, y, z) * Radius;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T operator() (T const & Min, T const & Max) const
|
||||
{
|
||||
GLM_STATIC_ASSERT(0, "'linearRand' invalid template parameter type. GLM_GTC_random only supports floating-point template types.");
|
||||
return Min;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER half compute_linearRand::operator()<half> (half const & Min, half const & Max) const
|
||||
{
|
||||
return half(float(std::rand()) / float(RAND_MAX) * (float(Max) - float(Min)) + float(Min));
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float compute_linearRand::operator()<float> (float const & Min, float const & Max) const
|
||||
{
|
||||
return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min;
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double compute_linearRand::operator()<double> (double const & Min, double const & Max) const
|
||||
{
|
||||
return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min;
|
||||
}
|
||||
}//namespace detail
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType linearRand
|
||||
(
|
||||
genType const & Min,
|
||||
genType const & Max
|
||||
)
|
||||
{
|
||||
return detail::compute_linearRand()(Min, Max);
|
||||
}
|
||||
|
||||
VECTORIZE_VEC_VEC(linearRand)
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType gaussRand
|
||||
(
|
||||
genType const & Mean,
|
||||
genType const & Deviation
|
||||
)
|
||||
{
|
||||
genType w, x1, x2;
|
||||
|
||||
do
|
||||
{
|
||||
x1 = linearRand(genType(-1), genType(1));
|
||||
x2 = linearRand(genType(-1), genType(1));
|
||||
|
||||
w = x1 * x1 + x2 * x2;
|
||||
} while(w > genType(1));
|
||||
|
||||
return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean;
|
||||
}
|
||||
|
||||
VECTORIZE_VEC_VEC(gaussRand)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> diskRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result(T(0));
|
||||
T LenRadius(T(0));
|
||||
|
||||
do
|
||||
{
|
||||
Result = linearRand(detail::tvec2<T>(-Radius), detail::tvec2<T>(Radius));
|
||||
LenRadius = length(Result);
|
||||
}
|
||||
while(LenRadius > Radius);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result(T(0));
|
||||
T LenRadius(T(0));
|
||||
|
||||
do
|
||||
{
|
||||
Result = linearRand(detail::tvec3<T>(-Radius), detail::tvec3<T>(Radius));
|
||||
LenRadius = length(Result);
|
||||
}
|
||||
while(LenRadius > Radius);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = linearRand(T(0), T(6.283185307179586476925286766559f));
|
||||
return detail::tvec2<T>(cos(a), sin(a)) * Radius;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
|
||||
(
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T z = linearRand(T(-1), T(1));
|
||||
T a = linearRand(T(0), T(6.283185307179586476925286766559f));
|
||||
|
||||
T r = sqrt(T(1) - z * z);
|
||||
|
||||
T x = r * cos(a);
|
||||
T y = r * sin(a);
|
||||
|
||||
return detail::tvec3<T>(x, y, z) * Radius;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -26,165 +26,91 @@
|
|||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
namespace glm
|
||||
{
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER T swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x
|
||||
)
|
||||
{
|
||||
assert(int(x) < int(vecType<T>::value_size));
|
||||
return v[x];
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER T swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x
|
||||
)
|
||||
{
|
||||
assert(int(x) < int(vecType<T>::value_size));
|
||||
return v[x];
|
||||
}
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
v[x],
|
||||
v[y]);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y
|
||||
)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
v[x],
|
||||
v[y]);
|
||||
}
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y, comp z
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
v[x],
|
||||
v[y],
|
||||
v[z]);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y, comp z
|
||||
)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
v[x],
|
||||
v[y],
|
||||
v[z]);
|
||||
}
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y, comp z, comp w
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
|
||||
template <typename T, template <typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> swizzle
|
||||
(
|
||||
vecType<T> const & v,
|
||||
comp x, comp y, comp z, comp w
|
||||
)
|
||||
{
|
||||
return detail::tvec4<T>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T& swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x
|
||||
)
|
||||
{
|
||||
return v[x];
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T& swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x
|
||||
)
|
||||
{
|
||||
return v[x];
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref2<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y
|
||||
)
|
||||
{
|
||||
return detail::tref2<T>(v[x], v[y]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref2<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y
|
||||
)
|
||||
{
|
||||
return detail::tref2<T>(v[x], v[y]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref3<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y, comp z
|
||||
)
|
||||
{
|
||||
return detail::tref3<T>(v[x], v[y], v[z]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref4<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y, comp z, comp w
|
||||
)
|
||||
{
|
||||
return detail::tref4<T>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
/*
|
||||
template <comp x>
|
||||
GLM_FUNC_QUALIFIER float& swizzle
|
||||
(
|
||||
detail::tvec4<float> & v
|
||||
)
|
||||
{
|
||||
return v[x];
|
||||
}
|
||||
|
||||
template <comp x>
|
||||
GLM_FUNC_QUALIFIER int& swizzle
|
||||
(
|
||||
detail::tvec4<int> & v
|
||||
)
|
||||
{
|
||||
return v[x];
|
||||
}
|
||||
|
||||
template <comp x, comp y>
|
||||
GLM_FUNC_QUALIFIER detail::tref2<float> swizzle
|
||||
(
|
||||
detail::tvec4<float> & v
|
||||
)
|
||||
{
|
||||
return detail::tref2<float>(v[x], v[y]);
|
||||
}
|
||||
|
||||
template <comp x, comp y>
|
||||
GLM_FUNC_QUALIFIER detail::tref2<int> swizzle
|
||||
(
|
||||
detail::tvec4<int> & v
|
||||
)
|
||||
{
|
||||
return detail::tref2<int>(v[x], v[y]);
|
||||
}
|
||||
|
||||
template <comp x, comp y, comp z>
|
||||
GLM_FUNC_QUALIFIER detail::tref3<float> swizzle
|
||||
(
|
||||
detail::tvec4<float> & v
|
||||
)
|
||||
{
|
||||
return detail::tref3<float>(v[x], v[y], v[z]);
|
||||
}
|
||||
|
||||
template <comp x, comp y, comp z>
|
||||
GLM_FUNC_QUALIFIER detail::tref3<int> swizzle
|
||||
(
|
||||
detail::tvec4<int> & v
|
||||
)
|
||||
{
|
||||
return detail::tref3<int>(v[x], v[y], v[z]);
|
||||
}
|
||||
|
||||
template <comp x, comp y, comp z, comp w>
|
||||
GLM_FUNC_QUALIFIER detail::tref4<float> swizzle
|
||||
(
|
||||
detail::tvec4<float> & v
|
||||
)
|
||||
{
|
||||
return detail::tref4<float>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
|
||||
template <comp x, comp y, comp z, comp w>
|
||||
GLM_FUNC_QUALIFIER detail::tref4<int> swizzle
|
||||
(
|
||||
detail::tvec4<int> & v
|
||||
)
|
||||
{
|
||||
return detail::tref4<int>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
*/
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref3<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y, comp z
|
||||
)
|
||||
{
|
||||
return detail::tref3<T>(v[x], v[y], v[z]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tref4<T> swizzle
|
||||
(
|
||||
detail::tvec4<T> & v,
|
||||
comp x, comp y, comp z, comp w
|
||||
)
|
||||
{
|
||||
return detail::tref4<T>(v[x], v[y], v[z], v[w]);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
1264
glm/gtx/bit.inl
1264
glm/gtx/bit.inl
File diff suppressed because it is too large
Load diff
|
@ -10,28 +10,27 @@
|
|||
#ifndef glm_gtx_closest_point
|
||||
#define glm_gtx_closest_point
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> closestPointOnLine
|
||||
(
|
||||
detail::tvec3<valType> const & point,
|
||||
detail::tvec3<valType> const & a,
|
||||
detail::tvec3<valType> const & b
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
valType LineLength = distance(a, b);
|
||||
detail::tvec3<valType> Vector = point - a;
|
||||
detail::tvec3<valType> LineDirection = (b - a) / LineLength;
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> closestPointOnLine
|
||||
(
|
||||
detail::tvec3<valType> const & point,
|
||||
detail::tvec3<valType> const & a,
|
||||
detail::tvec3<valType> const & b
|
||||
)
|
||||
{
|
||||
valType LineLength = distance(a, b);
|
||||
detail::tvec3<valType> Vector = point - a;
|
||||
detail::tvec3<valType> LineDirection = (b - a) / LineLength;
|
||||
|
||||
// Project Vector to LineDirection to get the distance of point from a
|
||||
valType Distance = dot(Vector, LineDirection);
|
||||
|
||||
if(Distance <= valType(0)) return a;
|
||||
if(Distance >= LineLength) return b;
|
||||
return a + LineDirection * Distance;
|
||||
}
|
||||
// Project Vector to LineDirection to get the distance of point from a
|
||||
valType Distance = dot(Vector, LineDirection);
|
||||
|
||||
if(Distance <= valType(0)) return a;
|
||||
if(Distance >= LineLength) return b;
|
||||
return a + LineDirection * Distance;
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
#endif//glm_gtx_closest_point
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -7,144 +7,143 @@
|
|||
// File : glm/gtx/color_space.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rgbColor(const detail::tvec3<T>& hsvColor)
|
||||
namespace glm
|
||||
{
|
||||
detail::tvec3<T> hsv = hsvColor;
|
||||
detail::tvec3<T> rgbColor;
|
||||
|
||||
if(hsv.y == T(0))
|
||||
// achromatic (grey)
|
||||
rgbColor = detail::tvec3<T>(hsv.z);
|
||||
else
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rgbColor(const detail::tvec3<T>& hsvColor)
|
||||
{
|
||||
T sector = floor(hsv.x / T(60));
|
||||
T frac = (hsv.x / T(60)) - sector;
|
||||
// factorial part of h
|
||||
T o = hsv.z * (T(1) - hsv.y);
|
||||
T p = hsv.z * (T(1) - hsv.y * frac);
|
||||
T q = hsv.z * (T(1) - hsv.y * (T(1) - frac));
|
||||
detail::tvec3<T> hsv = hsvColor;
|
||||
detail::tvec3<T> rgbColor;
|
||||
|
||||
switch(int(sector))
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = q;
|
||||
rgbColor.b = o;
|
||||
break;
|
||||
case 1:
|
||||
rgbColor.r = p;
|
||||
rgbColor.g = hsv.z;
|
||||
rgbColor.b = o;
|
||||
break;
|
||||
case 2:
|
||||
rgbColor.r = o;
|
||||
rgbColor.g = hsv.z;
|
||||
rgbColor.b = q;
|
||||
break;
|
||||
case 3:
|
||||
rgbColor.r = o;
|
||||
rgbColor.g = p;
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 4:
|
||||
rgbColor.r = q;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 5:
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = p;
|
||||
break;
|
||||
}
|
||||
if(hsv.y == T(0))
|
||||
// achromatic (grey)
|
||||
rgbColor = detail::tvec3<T>(hsv.z);
|
||||
else
|
||||
{
|
||||
T sector = floor(hsv.x / T(60));
|
||||
T frac = (hsv.x / T(60)) - sector;
|
||||
// factorial part of h
|
||||
T o = hsv.z * (T(1) - hsv.y);
|
||||
T p = hsv.z * (T(1) - hsv.y * frac);
|
||||
T q = hsv.z * (T(1) - hsv.y * (T(1) - frac));
|
||||
|
||||
switch(int(sector))
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = q;
|
||||
rgbColor.b = o;
|
||||
break;
|
||||
case 1:
|
||||
rgbColor.r = p;
|
||||
rgbColor.g = hsv.z;
|
||||
rgbColor.b = o;
|
||||
break;
|
||||
case 2:
|
||||
rgbColor.r = o;
|
||||
rgbColor.g = hsv.z;
|
||||
rgbColor.b = q;
|
||||
break;
|
||||
case 3:
|
||||
rgbColor.r = o;
|
||||
rgbColor.g = p;
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 4:
|
||||
rgbColor.r = q;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = hsv.z;
|
||||
break;
|
||||
case 5:
|
||||
rgbColor.r = hsv.z;
|
||||
rgbColor.g = o;
|
||||
rgbColor.b = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rgbColor;
|
||||
}
|
||||
|
||||
return rgbColor;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> hsvColor(const detail::tvec3<T>& rgbColor)
|
||||
{
|
||||
detail::tvec3<T> 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;
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> hsvColor(const detail::tvec3<T>& rgbColor)
|
||||
{
|
||||
detail::tvec3<T> 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 != T(0))
|
||||
{
|
||||
hsv.y = Delta / hsv.z;
|
||||
T h = T(0);
|
||||
if(Max != T(0))
|
||||
{
|
||||
hsv.y = Delta / hsv.z;
|
||||
T h = T(0);
|
||||
|
||||
if(rgbColor.r == Max)
|
||||
// between yellow & magenta
|
||||
h = T(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta;
|
||||
else if(rgbColor.g == Max)
|
||||
// between cyan & yellow
|
||||
h = T(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta;
|
||||
else
|
||||
// between magenta & cyan
|
||||
h = T(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta;
|
||||
if(rgbColor.r == Max)
|
||||
// between yellow & magenta
|
||||
h = T(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta;
|
||||
else if(rgbColor.g == Max)
|
||||
// between cyan & yellow
|
||||
h = T(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta;
|
||||
else
|
||||
// between magenta & cyan
|
||||
h = T(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta;
|
||||
|
||||
if(h < T(0))
|
||||
hsv.x = h + T(360);
|
||||
if(h < T(0))
|
||||
hsv.x = h + T(360);
|
||||
else
|
||||
hsv.x = h;
|
||||
}
|
||||
else
|
||||
hsv.x = h;
|
||||
{
|
||||
// If r = g = b = 0 then s = 0, h is undefined
|
||||
hsv.y = T(0);
|
||||
hsv.x = T(0);
|
||||
}
|
||||
|
||||
return hsv;
|
||||
}
|
||||
else
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> saturation(const T s)
|
||||
{
|
||||
// If r = g = b = 0 then s = 0, h is undefined
|
||||
hsv.y = T(0);
|
||||
hsv.x = T(0);
|
||||
detail::tvec3<T> rgbw = detail::tvec3<T>(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;
|
||||
|
||||
detail::tmat4x4<T> 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;
|
||||
}
|
||||
|
||||
return hsv;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> saturation(const T s, const detail::tvec3<T>& color)
|
||||
{
|
||||
return detail::tvec3<T>(saturation(s) * detail::tvec4<T>(color, T(0)));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> saturation(const T s)
|
||||
{
|
||||
detail::tvec3<T> rgbw = detail::tvec3<T>(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;
|
||||
|
||||
detail::tmat4x4<T> 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> saturation(const T s, const detail::tvec3<T>& color)
|
||||
{
|
||||
return detail::tvec3<T>(saturation(s) * detail::tvec4<T>(color, T(0)));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> saturation(const T s, const detail::tvec4<T>& color)
|
||||
{
|
||||
return saturation(s) * color;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T luminosity(const detail::tvec3<T>& color)
|
||||
{
|
||||
const detail::tvec3<T> tmp = detail::tvec3<T>(0.33, 0.59, 0.11);
|
||||
return dot(color, tmp);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> saturation(const T s, const detail::tvec4<T>& color)
|
||||
{
|
||||
return saturation(s) * color;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T luminosity(const detail::tvec3<T>& color)
|
||||
{
|
||||
const detail::tvec3<T> tmp = detail::tvec3<T>(0.33, 0.59, 0.11);
|
||||
return dot(color, tmp);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,59 +7,58 @@
|
|||
// File : glm/gtx/color_space_YCoCg.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCg
|
||||
(
|
||||
detail::tvec3<valType> const & rgbColor
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
result.x/*Y */ = rgbColor.r / valType(4) + rgbColor.g / valType(2) + rgbColor.b / valType(4);
|
||||
result.y/*Co*/ = rgbColor.r / valType(2) + rgbColor.g * valType(0) - rgbColor.b / valType(2);
|
||||
result.z/*Cg*/ = - rgbColor.r / valType(4) + rgbColor.g / valType(2) - rgbColor.b / valType(4);
|
||||
return result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCg
|
||||
(
|
||||
detail::tvec3<valType> const & rgbColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
result.x/*Y */ = rgbColor.r / valType(4) + rgbColor.g / valType(2) + rgbColor.b / valType(4);
|
||||
result.y/*Co*/ = rgbColor.r / valType(2) + rgbColor.g * valType(0) - rgbColor.b / valType(2);
|
||||
result.z/*Cg*/ = - rgbColor.r / valType(4) + rgbColor.g / valType(2) - rgbColor.b / valType(4);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCgR
|
||||
(
|
||||
detail::tvec3<valType> const & rgbColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
result.x/*Y */ = rgbColor.g / valType(2) + (rgbColor.r + rgbColor.b) / valType(4);
|
||||
result.y/*Co*/ = rgbColor.r - rgbColor.b;
|
||||
result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / valType(2);
|
||||
return result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCgR
|
||||
(
|
||||
detail::tvec3<valType> const & rgbColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
result.x/*Y */ = rgbColor.g / valType(2) + (rgbColor.r + rgbColor.b) / valType(4);
|
||||
result.y/*Co*/ = rgbColor.r - rgbColor.b;
|
||||
result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / valType(2);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCg2rgb
|
||||
(
|
||||
detail::tvec3<valType> const & YCoCgColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> 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 valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCgR2rgb
|
||||
(
|
||||
detail::tvec3<valType> const & YCoCgRColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
valType tmp = YCoCgRColor.x - (YCoCgRColor.z / valType(2));
|
||||
result.g = YCoCgRColor.z + tmp;
|
||||
result.b = tmp - (YCoCgRColor.y / valType(2));
|
||||
result.r = result.b + YCoCgRColor.y;
|
||||
return result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCg2rgb
|
||||
(
|
||||
detail::tvec3<valType> const & YCoCgColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> 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 valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCgR2rgb
|
||||
(
|
||||
detail::tvec3<valType> const & YCoCgRColor
|
||||
)
|
||||
{
|
||||
detail::tvec3<valType> result;
|
||||
valType tmp = YCoCgRColor.x - (YCoCgRColor.z / valType(2));
|
||||
result.g = YCoCgRColor.z + tmp;
|
||||
result.b = tmp - (YCoCgRColor.y / valType(2));
|
||||
result.r = result.b + YCoCgRColor.y;
|
||||
return result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,131 +7,130 @@
|
|||
// File : glm/gtx/compatibility.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
// isfinite
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isfinite(
|
||||
genType const & x)
|
||||
namespace glm
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _finite(x);
|
||||
#else//(GLM_COMPILER & GLM_COMPILER_GCC)
|
||||
return std::isfinite(x) != 0;
|
||||
#endif
|
||||
}
|
||||
// isfinite
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isfinite(
|
||||
genType const & x)
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _finite(x);
|
||||
#else//(GLM_COMPILER & GLM_COMPILER_GCC)
|
||||
return std::isfinite(x) != 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isfinite(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isfinite(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isfinite(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isfinite(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isfinite(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z),
|
||||
isfinite(x.w));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isfinite(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isfinite(x.x),
|
||||
isfinite(x.y),
|
||||
isfinite(x.z),
|
||||
isfinite(x.w));
|
||||
}
|
||||
|
||||
// isinf
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isinf(
|
||||
genType const & x)
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF;
|
||||
#else
|
||||
return std::isinf(x) != 0;
|
||||
#endif
|
||||
}
|
||||
// isinf
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isinf(
|
||||
genType const & x)
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF;
|
||||
#else
|
||||
return std::isinf(x) != 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isinf(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isinf(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isinf(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y),
|
||||
isinf(x.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isinf(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y),
|
||||
isinf(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isinf(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y),
|
||||
isinf(x.z),
|
||||
isinf(x.w));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isinf(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isinf(x.x),
|
||||
isinf(x.y),
|
||||
isinf(x.z),
|
||||
isinf(x.w));
|
||||
}
|
||||
|
||||
// isnan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isnan(genType const & x)
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _isnan(x);
|
||||
#else
|
||||
return std::isnan(x) != 0;
|
||||
#endif
|
||||
}
|
||||
// isnan
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isnan(genType const & x)
|
||||
{
|
||||
#if(GLM_COMPILER & GLM_COMPILER_VC)
|
||||
return _isnan(x);
|
||||
#else
|
||||
return std::isnan(x) != 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isnan(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isnan(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isnan(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y),
|
||||
isnan(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isnan(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y),
|
||||
isnan(x.z),
|
||||
isnan(x.w));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isnan(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y),
|
||||
isnan(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isnan(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isnan(x.x),
|
||||
isnan(x.y),
|
||||
isnan(x.z),
|
||||
isnan(x.w));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,42 +7,41 @@
|
|||
// File : gtx_component_wise.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compAdd(genType const & v)
|
||||
namespace glm
|
||||
{
|
||||
typename genType::size_type result = typename genType::value_type(0);
|
||||
for(typename genType::size_type i = 0; i < genType::value_size(); ++i)
|
||||
result += v[i];
|
||||
return result;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compAdd(genType const & v)
|
||||
{
|
||||
typename genType::size_type result = typename genType::value_type(0);
|
||||
for(typename genType::size_type i = 0; i < genType::value_size(); ++i)
|
||||
result += v[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMul(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(1);
|
||||
for(typename genType::size_type i = 0; i < genType::value_size(); ++i)
|
||||
result *= v[i];
|
||||
return result;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMul(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(1);
|
||||
for(typename genType::size_type i = 0; i < genType::value_size(); ++i)
|
||||
result *= v[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMin(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(v[0]);
|
||||
for(typename genType::size_type i = 1; i < genType::value_size(); ++i)
|
||||
result = min(result, v[i]);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMax(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(v[0]);
|
||||
for(typename genType::size_type i = 1; i < genType::value_size(); ++i)
|
||||
result = max(result, v[i]);
|
||||
return result;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMin(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(v[0]);
|
||||
for(typename genType::size_type i = 1; i < genType::value_size(); ++i)
|
||||
result = min(result, v[i]);
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type compMax(genType const & v)
|
||||
{
|
||||
typename genType::value_type result = typename genType::value_type(v[0]);
|
||||
for(typename genType::size_type i = 1; i < genType::value_size(); ++i)
|
||||
result = max(result, v[i]);
|
||||
return result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -20,773 +20,8 @@
|
|||
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
/// THE SOFTWARE.
|
||||
///
|
||||
/// @ref gtc_half_float
|
||||
/// @file glm/gtc/half_float.inl
|
||||
/// @date 2009-04-29 / 2011-06-05
|
||||
/// @ref gtx_constants
|
||||
/// @file glm/gtx/constants.inl
|
||||
/// @date 2011-10-14 / 2011-10-14
|
||||
/// @author Christophe Riccio
|
||||
///////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "../core/_detail.hpp"
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genIType>
|
||||
GLM_FUNC_QUALIFIER genIType mask
|
||||
(
|
||||
genIType const & count
|
||||
)
|
||||
{
|
||||
return ((genIType(1) << (count)) - genIType(1));
|
||||
}
|
||||
|
||||
template <typename valIType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valIType> mask
|
||||
(
|
||||
detail::tvec2<valIType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valIType>(
|
||||
mask(count[0]),
|
||||
mask(count[1]));
|
||||
}
|
||||
|
||||
template <typename valIType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valIType> mask
|
||||
(
|
||||
detail::tvec3<valIType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valIType>(
|
||||
mask(count[0]),
|
||||
mask(count[1]),
|
||||
mask(count[2]));
|
||||
}
|
||||
|
||||
template <typename valIType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valIType> mask
|
||||
(
|
||||
detail::tvec4<valIType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valIType>(
|
||||
mask(count[0]),
|
||||
mask(count[1]),
|
||||
mask(count[2]),
|
||||
mask(count[3]));
|
||||
}
|
||||
|
||||
// extractField
|
||||
template <typename genIType>
|
||||
GLM_FUNC_QUALIFIER genIType extractField
|
||||
(
|
||||
half const & value,
|
||||
genIType const & first,
|
||||
genIType const & count
|
||||
)
|
||||
{
|
||||
assert(first + count < sizeof(half));
|
||||
return (value._data() << first) >> ((sizeof(half) << 3) - count);
|
||||
}
|
||||
|
||||
template <typename genIType>
|
||||
GLM_FUNC_QUALIFIER genIType extractField
|
||||
(
|
||||
float const & value,
|
||||
genIType const & first,
|
||||
genIType const & count
|
||||
)
|
||||
{
|
||||
assert(first + count < sizeof(float));
|
||||
return (detail::uif32(value).i << first) >> ((sizeof(float) << 3) - count);
|
||||
}
|
||||
|
||||
template <typename genIType>
|
||||
GLM_FUNC_QUALIFIER genIType extractField
|
||||
(
|
||||
double const & value,
|
||||
genIType const & first,
|
||||
genIType const & count
|
||||
)
|
||||
{
|
||||
assert(first + count < sizeof(double));
|
||||
return (detail::uif64(value).i << first) >> ((sizeof(double) << genIType(3)) - count);
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER genIUType extractField
|
||||
(
|
||||
genIUType const & Value,
|
||||
sizeType const & First,
|
||||
sizeType const & Count
|
||||
)
|
||||
{
|
||||
sizeType GenSize = sizeof(genIUType) << 3;
|
||||
|
||||
assert(First + Count <= GenSize);
|
||||
|
||||
genIUType ShiftLeft = Count ? Value << (GenSize - (Count + First)) : 0;
|
||||
genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Count);
|
||||
|
||||
return ShiftBack;
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField
|
||||
(
|
||||
detail::tvec2<genIUType> const & value,
|
||||
sizeType const & first,
|
||||
sizeType const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec2<genIUType>(
|
||||
extractField(value[0], first, count),
|
||||
extractField(value[1], first, count));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField
|
||||
(
|
||||
detail::tvec3<genIUType> const & value,
|
||||
sizeType const & first,
|
||||
sizeType const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec3<genIUType>(
|
||||
extractField(value[0], first, count),
|
||||
extractField(value[1], first, count),
|
||||
extractField(value[2], first, count));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField
|
||||
(
|
||||
detail::tvec4<genIUType> const & value,
|
||||
sizeType const & first,
|
||||
sizeType const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec4<genIUType>(
|
||||
extractField(value[0], first, count),
|
||||
extractField(value[1], first, count),
|
||||
extractField(value[2], first, count),
|
||||
extractField(value[3], first, count));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField
|
||||
(
|
||||
detail::tvec2<genIUType> const & value,
|
||||
detail::tvec2<sizeType> const & first,
|
||||
detail::tvec2<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec2<genIUType>(
|
||||
extractField(value[0], first[0], count[0]),
|
||||
extractField(value[1], first[1], count[1]));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField
|
||||
(
|
||||
detail::tvec3<genIUType> const & value,
|
||||
detail::tvec3<sizeType> const & first,
|
||||
detail::tvec3<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec3<genIUType>(
|
||||
extractField(value[0], first[0], count[0]),
|
||||
extractField(value[1], first[1], count[1]),
|
||||
extractField(value[2], first[2], count[2]));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField
|
||||
(
|
||||
detail::tvec4<genIUType> const & value,
|
||||
detail::tvec4<sizeType> const & first,
|
||||
detail::tvec4<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec4<genIUType>(
|
||||
extractField(value[0], first[0], count[0]),
|
||||
extractField(value[1], first[1], count[1]),
|
||||
extractField(value[2], first[2], count[2]),
|
||||
extractField(value[3], first[3], count[3]));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField
|
||||
(
|
||||
genIUType const & value,
|
||||
detail::tvec2<sizeType> const & first,
|
||||
detail::tvec2<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec2<genIUType>(
|
||||
extractField(value, first[0], count[0]),
|
||||
extractField(value, first[1], count[1]));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField
|
||||
(
|
||||
genIUType const & value,
|
||||
detail::tvec3<sizeType> const & first,
|
||||
detail::tvec3<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec3<genIUType>(
|
||||
extractField(value, first[0], count[0]),
|
||||
extractField(value, first[1], count[1]),
|
||||
extractField(value, first[2], count[2]));
|
||||
}
|
||||
|
||||
template <typename genIUType, typename sizeType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField
|
||||
(
|
||||
genIUType const & value,
|
||||
detail::tvec4<sizeType> const & first,
|
||||
detail::tvec4<sizeType> const & count
|
||||
)
|
||||
{
|
||||
return detail::tvec4<genIUType>(
|
||||
extractField(value, first[0], count[0]),
|
||||
extractField(value, first[1], count[1]),
|
||||
extractField(value, first[2], count[2]),
|
||||
extractField(value, first[3], count[3]));
|
||||
}
|
||||
|
||||
// lowestBit
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER int lowestBit
|
||||
(
|
||||
genType const & Value
|
||||
)
|
||||
{
|
||||
assert(Value != genType(0)); // not valid call
|
||||
|
||||
genType Bit;
|
||||
for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){}
|
||||
return Bit;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<int> lowestBit
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<int>(
|
||||
lowestBit(value[0]),
|
||||
lowestBit(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<int> lowestBit
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<int>(
|
||||
lowestBit(value[0]),
|
||||
lowestBit(value[1]),
|
||||
lowestBit(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<int> lowestBit
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<int>(
|
||||
lowestBit(value[0]),
|
||||
lowestBit(value[1]),
|
||||
lowestBit(value[2]),
|
||||
lowestBit(value[3]));
|
||||
}
|
||||
|
||||
// highestBit
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER int highestBit
|
||||
(
|
||||
genType const & value
|
||||
)
|
||||
{
|
||||
assert(value != genType(0)); // not valid call
|
||||
|
||||
genType bit = genType(-1);
|
||||
for(genType tmp = value; tmp; tmp >>= 1, ++bit){}
|
||||
return bit;
|
||||
}
|
||||
|
||||
//template <>
|
||||
//GLM_FUNC_QUALIFIER int highestBit<int>
|
||||
//(
|
||||
// int value
|
||||
//)
|
||||
//{
|
||||
// int bit = -1;
|
||||
// for(int tmp = value; tmp; tmp >>= 1, ++bit);
|
||||
// return bit;
|
||||
//}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<int> highestBit
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<int>(
|
||||
highestBit(value[0]),
|
||||
highestBit(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<int> highestBit
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<int>(
|
||||
highestBit(value[0]),
|
||||
highestBit(value[1]),
|
||||
highestBit(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<int> highestBit
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<int>(
|
||||
highestBit(value[0]),
|
||||
highestBit(value[1]),
|
||||
highestBit(value[2]),
|
||||
highestBit(value[3]));
|
||||
}
|
||||
|
||||
// highestBitValue
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType highestBitValue
|
||||
(
|
||||
genType const & value
|
||||
)
|
||||
{
|
||||
genType tmp = value;
|
||||
genType result = genType(0);
|
||||
while(tmp)
|
||||
{
|
||||
result = (tmp & (~tmp + 1)); // grab lowest bit
|
||||
tmp &= ~result; // clear lowest bit
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<int> highestBitValue
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<int>(
|
||||
highestBitValue(value[0]),
|
||||
highestBitValue(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<int> highestBitValue
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<int>(
|
||||
highestBitValue(value[0]),
|
||||
highestBitValue(value[1]),
|
||||
highestBitValue(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<int> highestBitValue
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<int>(
|
||||
highestBitValue(value[0]),
|
||||
highestBitValue(value[1]),
|
||||
highestBitValue(value[2]),
|
||||
highestBitValue(value[3]));
|
||||
}
|
||||
|
||||
// isPowerOfTwo
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const & Value)
|
||||
{
|
||||
//detail::If<std::numeric_limits<genType>::is_signed>::apply(abs, Value);
|
||||
//return !(Value & (Value - 1));
|
||||
|
||||
// For old complier?
|
||||
genType Result = Value;
|
||||
if(std::numeric_limits<genType>::is_signed)
|
||||
Result = abs(Result);
|
||||
return !(Result & (Result - 1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isPowerOfTwo
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
isPowerOfTwo(value[0]),
|
||||
isPowerOfTwo(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isPowerOfTwo
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
isPowerOfTwo(value[0]),
|
||||
isPowerOfTwo(value[1]),
|
||||
isPowerOfTwo(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isPowerOfTwo
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
isPowerOfTwo(value[0]),
|
||||
isPowerOfTwo(value[1]),
|
||||
isPowerOfTwo(value[2]),
|
||||
isPowerOfTwo(value[3]));
|
||||
}
|
||||
|
||||
// powerOfTwoAbove
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const & value)
|
||||
{
|
||||
return isPowerOfTwo(value) ? value : highestBitValue(value) << 1;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> powerOfTwoAbove
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
powerOfTwoAbove(value[0]),
|
||||
powerOfTwoAbove(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> powerOfTwoAbove
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
powerOfTwoAbove(value[0]),
|
||||
powerOfTwoAbove(value[1]),
|
||||
powerOfTwoAbove(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> powerOfTwoAbove
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
powerOfTwoAbove(value[0]),
|
||||
powerOfTwoAbove(value[1]),
|
||||
powerOfTwoAbove(value[2]),
|
||||
powerOfTwoAbove(value[3]));
|
||||
}
|
||||
|
||||
// powerOfTwoBelow
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoBelow
|
||||
(
|
||||
genType const & value
|
||||
)
|
||||
{
|
||||
return isPowerOfTwo(value) ? value : highestBitValue(value);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> powerOfTwoBelow
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
powerOfTwoBelow(value[0]),
|
||||
powerOfTwoBelow(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> powerOfTwoBelow
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
powerOfTwoBelow(value[0]),
|
||||
powerOfTwoBelow(value[1]),
|
||||
powerOfTwoBelow(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> powerOfTwoBelow
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
powerOfTwoBelow(value[0]),
|
||||
powerOfTwoBelow(value[1]),
|
||||
powerOfTwoBelow(value[2]),
|
||||
powerOfTwoBelow(value[3]));
|
||||
}
|
||||
|
||||
// powerOfTwoNearest
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType powerOfTwoNearest
|
||||
(
|
||||
genType const & value
|
||||
)
|
||||
{
|
||||
if(isPowerOfTwo(value))
|
||||
return value;
|
||||
|
||||
genType prev = highestBitValue(value);
|
||||
genType next = prev << 1;
|
||||
return (next - value) < (value - prev) ? next : prev;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> powerOfTwoNearest
|
||||
(
|
||||
detail::tvec2<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
powerOfTwoNearest(value[0]),
|
||||
powerOfTwoNearest(value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> powerOfTwoNearest
|
||||
(
|
||||
detail::tvec3<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
powerOfTwoNearest(value[0]),
|
||||
powerOfTwoNearest(value[1]),
|
||||
powerOfTwoNearest(value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> powerOfTwoNearest
|
||||
(
|
||||
detail::tvec4<valType> const & value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
powerOfTwoNearest(value[0]),
|
||||
powerOfTwoNearest(value[1]),
|
||||
powerOfTwoNearest(value[2]),
|
||||
powerOfTwoNearest(value[3]));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bitRevert(genType const & In)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRevert' only accept integer values");
|
||||
|
||||
genType Out = 0;
|
||||
std::size_t BitSize = sizeof(genType) * 8;
|
||||
for(std::size_t i = 0; i < BitSize; ++i)
|
||||
if(In & (genType(1) << i))
|
||||
Out |= genType(1) << (BitSize - 1 - i);
|
||||
return Out;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> bitRevert
|
||||
(
|
||||
detail::tvec2<valType> const & Value
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
bitRevert(Value[0]),
|
||||
bitRevert(Value[1]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> bitRevert
|
||||
(
|
||||
detail::tvec3<valType> const & Value
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
bitRevert(Value[0]),
|
||||
bitRevert(Value[1]),
|
||||
bitRevert(Value[2]));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> bitRevert
|
||||
(
|
||||
detail::tvec4<valType> const & Value
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
bitRevert(Value[0]),
|
||||
bitRevert(Value[1]),
|
||||
bitRevert(Value[2]),
|
||||
bitRevert(Value[3]));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bitRotateRight(genType const & In, std::size_t Shift)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRotateRight' only accept integer values");
|
||||
|
||||
std::size_t BitSize = sizeof(genType) * 8;
|
||||
return (In << Shift) | (In >> (BitSize - Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> bitRotateRight
|
||||
(
|
||||
detail::tvec2<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
bitRotateRight(Value[0], Shift),
|
||||
bitRotateRight(Value[1], Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> bitRotateRight
|
||||
(
|
||||
detail::tvec3<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
bitRotateRight(Value[0], Shift),
|
||||
bitRotateRight(Value[1], Shift),
|
||||
bitRotateRight(Value[2], Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> bitRotateRight
|
||||
(
|
||||
detail::tvec4<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
bitRotateRight(Value[0], Shift),
|
||||
bitRotateRight(Value[1], Shift),
|
||||
bitRotateRight(Value[2], Shift),
|
||||
bitRotateRight(Value[3], Shift));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType bitRotateLeft(genType const & In, std::size_t Shift)
|
||||
{
|
||||
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRotateLeft' only accept integer values");
|
||||
|
||||
std::size_t BitSize = sizeof(genType) * 8;
|
||||
return (In >> Shift) | (In << (BitSize - Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> bitRotateLeft
|
||||
(
|
||||
detail::tvec2<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
bitRotateLeft(Value[0], Shift),
|
||||
bitRotateLeft(Value[1], Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> bitRotateLeft
|
||||
(
|
||||
detail::tvec3<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
bitRotateLeft(Value[0], Shift),
|
||||
bitRotateLeft(Value[1], Shift),
|
||||
bitRotateLeft(Value[2], Shift));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> bitRotateLeft
|
||||
(
|
||||
detail::tvec4<valType> const & Value,
|
||||
std::size_t Shift
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
bitRotateLeft(Value[0], Shift),
|
||||
bitRotateLeft(Value[1], Shift),
|
||||
bitRotateLeft(Value[2], Shift),
|
||||
bitRotateLeft(Value[3], Shift));
|
||||
}
|
||||
|
||||
template <typename genIUType>
|
||||
GLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne
|
||||
(
|
||||
genIUType const & Value,
|
||||
int const & FromBit,
|
||||
int const & ToBit
|
||||
)
|
||||
{
|
||||
assert(FromBit <= ToBit);
|
||||
assert(ToBit <= sizeof(genIUType) * std::size_t(8));
|
||||
|
||||
genIUType Result = Value;
|
||||
for(std::size_t i = 0; i <= ToBit; ++i)
|
||||
Result |= (1 << i);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename genIUType>
|
||||
GLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero
|
||||
(
|
||||
genIUType const & Value,
|
||||
int const & FromBit,
|
||||
int const & ToBit
|
||||
)
|
||||
{
|
||||
assert(FromBit <= ToBit);
|
||||
assert(ToBit <= sizeof(genIUType) * std::size_t(8));
|
||||
|
||||
genIUType Result = Value;
|
||||
for(std::size_t i = 0; i <= ToBit; ++i)
|
||||
Result &= ~(1 << i);
|
||||
return Result;
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,224 +7,223 @@
|
|||
// File : glm/gtx/epsilon.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool equalEpsilon
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y,
|
||||
genType const & epsilon
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return abs(x - y) < epsilon;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool equalEpsilon
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y,
|
||||
genType const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(x - y) < epsilon;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool notEqualEpsilon
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y,
|
||||
genType const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(x - y) >= epsilon;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool notEqualEpsilon
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y,
|
||||
genType const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(x - y) >= epsilon;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
valType const & epsilon)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
valType const & epsilon)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
valType const & epsilon)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon,
|
||||
abs(x.z - y.z) < epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
valType const & epsilon)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon,
|
||||
abs(x.z - y.z) < epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon,
|
||||
abs(x.z - y.z) < epsilon,
|
||||
abs(x.w - y.w) < epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon,
|
||||
abs(x.y - y.y) < epsilon,
|
||||
abs(x.z - y.z) < epsilon,
|
||||
abs(x.w - y.w) < epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon,
|
||||
abs(x.z - y.z) >= epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon,
|
||||
abs(x.z - y.z) >= epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon,
|
||||
abs(x.z - y.z) >= epsilon,
|
||||
abs(x.w - y.w) >= epsilon);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
valType const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon,
|
||||
abs(x.y - y.y) >= epsilon,
|
||||
abs(x.z - y.z) >= epsilon,
|
||||
abs(x.w - y.w) >= epsilon);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
detail::tvec2<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
detail::tvec2<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
detail::tvec4<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z,
|
||||
abs(x.w - y.w) < epsilon.w);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
detail::tvec4<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z,
|
||||
abs(x.w - y.w) < epsilon.w);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tquat<valType> const & x,
|
||||
detail::tquat<valType> const & y,
|
||||
detail::tquat<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z,
|
||||
abs(x.w - y.w) < epsilon.w);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> equalEpsilon
|
||||
(
|
||||
detail::tquat<valType> const & x,
|
||||
detail::tquat<valType> const & y,
|
||||
detail::tquat<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) < epsilon.x,
|
||||
abs(x.y - y.y) < epsilon.y,
|
||||
abs(x.z - y.z) < epsilon.z,
|
||||
abs(x.w - y.w) < epsilon.w);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
detail::tvec2<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y,
|
||||
detail::tvec2<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
detail::tvec4<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z,
|
||||
abs(x.w - y.w) >= epsilon.w);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tquat<valType> const & x,
|
||||
detail::tquat<valType> const & y,
|
||||
detail::tquat<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z,
|
||||
abs(x.w - y.w) >= epsilon.w);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y,
|
||||
detail::tvec4<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z,
|
||||
abs(x.w - y.w) >= epsilon.w);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> notEqualEpsilon
|
||||
(
|
||||
detail::tquat<valType> const & x,
|
||||
detail::tquat<valType> const & y,
|
||||
detail::tquat<valType> const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(x.x - y.x) >= epsilon.x,
|
||||
abs(x.y - y.y) >= epsilon.y,
|
||||
abs(x.z - y.z) >= epsilon.z,
|
||||
abs(x.w - y.w) >= epsilon.w);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,239 +7,238 @@
|
|||
// File : glm/gtx/euler_angles.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleX
|
||||
(
|
||||
valType const & angleX
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleX
|
||||
(
|
||||
valType const & angleX
|
||||
)
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
|
||||
return detail::tmat4x4<valType>(
|
||||
valType(1), valType(0), valType(0), valType(0),
|
||||
valType(0), cosX, sinX, valType(0),
|
||||
valType(0),-sinX, cosX, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
return detail::tmat4x4<valType>(
|
||||
valType(1), valType(0), valType(0), valType(0),
|
||||
valType(0), cosX, sinX, valType(0),
|
||||
valType(0),-sinX, cosX, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleY
|
||||
(
|
||||
valType const & angleY
|
||||
)
|
||||
{
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleY
|
||||
(
|
||||
valType const & angleY
|
||||
)
|
||||
{
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, valType(0), sinY, valType(0),
|
||||
valType(0), valType(1), valType(0), valType(0),
|
||||
-sinY, valType(0), cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, valType(0), sinY, valType(0),
|
||||
valType(0), valType(1), valType(0), valType(0),
|
||||
-sinY, valType(0), cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZ
|
||||
(
|
||||
valType const & angleZ
|
||||
)
|
||||
{
|
||||
valType cosZ = glm::cos(angleZ);
|
||||
valType sinZ = glm::sin(angleZ);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZ
|
||||
(
|
||||
valType const & angleZ
|
||||
)
|
||||
{
|
||||
valType cosZ = glm::cos(angleZ);
|
||||
valType sinZ = glm::sin(angleZ);
|
||||
|
||||
return detail::tmat4x4<valType>(
|
||||
cosZ, sinZ, valType(0), valType(0),
|
||||
-sinZ, cosZ, valType(0), valType(0),
|
||||
valType(0), valType(0), valType(1), valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
return detail::tmat4x4<valType>(
|
||||
cosZ, sinZ, valType(0), valType(0),
|
||||
-sinZ, cosZ, valType(0), valType(0),
|
||||
valType(0), valType(0), valType(1), valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXY
|
||||
(
|
||||
valType const & angleX,
|
||||
valType const & angleY
|
||||
)
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXY
|
||||
(
|
||||
valType const & angleX,
|
||||
valType const & angleY
|
||||
)
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, -sinX * sinY, cosX * sinY, valType(0),
|
||||
valType(0), cosX, sinX, valType(0),
|
||||
-sinY , -sinX * cosY, cosX * cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, -sinX * sinY, cosX * sinY, valType(0),
|
||||
valType(0), cosX, sinX, valType(0),
|
||||
-sinY , -sinX * cosY, cosX * cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYX
|
||||
(
|
||||
valType const & angleY,
|
||||
valType const & angleX
|
||||
)
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYX
|
||||
(
|
||||
valType const & angleY,
|
||||
valType const & angleX
|
||||
)
|
||||
{
|
||||
valType cosX = glm::cos(angleX);
|
||||
valType sinX = glm::sin(angleX);
|
||||
valType cosY = glm::cos(angleY);
|
||||
valType sinY = glm::sin(angleY);
|
||||
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, valType(0), sinY, valType(0),
|
||||
-sinX * sinY, cosX, sinX * cosY, valType(0),
|
||||
-cosX * sinY, -sinX, cosX * cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
return detail::tmat4x4<valType>(
|
||||
cosY, valType(0), sinY, valType(0),
|
||||
-sinX * sinY, cosX, sinX * cosY, valType(0),
|
||||
-cosX * sinY, -sinX, cosX * cosY, valType(0),
|
||||
valType(0), valType(0), valType(0), valType(1));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXZ
|
||||
(
|
||||
valType const & angleX,
|
||||
valType const & angleZ
|
||||
)
|
||||
{
|
||||
return eulerAngleX(angleX) * eulerAngleZ(angleZ);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXZ
|
||||
(
|
||||
valType const & angleX,
|
||||
valType const & angleZ
|
||||
)
|
||||
{
|
||||
return eulerAngleX(angleX) * eulerAngleZ(angleZ);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZX
|
||||
(
|
||||
valType const & angleZ,
|
||||
valType const & angleX
|
||||
)
|
||||
{
|
||||
return eulerAngleZ(angleZ) * eulerAngleX(angleX);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZX
|
||||
(
|
||||
valType const & angleZ,
|
||||
valType const & angleX
|
||||
)
|
||||
{
|
||||
return eulerAngleZ(angleZ) * eulerAngleX(angleX);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYXZ
|
||||
(
|
||||
valType const & yaw,
|
||||
valType const & pitch,
|
||||
valType const & roll
|
||||
)
|
||||
{
|
||||
valType tmp_ch = glm::cos(yaw);
|
||||
valType tmp_sh = glm::sin(yaw);
|
||||
valType tmp_cp = glm::cos(pitch);
|
||||
valType tmp_sp = glm::sin(pitch);
|
||||
valType tmp_cb = glm::cos(roll);
|
||||
valType tmp_sb = glm::sin(roll);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYXZ
|
||||
(
|
||||
valType const & yaw,
|
||||
valType const & pitch,
|
||||
valType const & roll
|
||||
)
|
||||
{
|
||||
valType tmp_ch = glm::cos(yaw);
|
||||
valType tmp_sh = glm::sin(yaw);
|
||||
valType tmp_cp = glm::cos(pitch);
|
||||
valType tmp_sp = glm::sin(pitch);
|
||||
valType tmp_cb = glm::cos(roll);
|
||||
valType tmp_sb = glm::sin(roll);
|
||||
|
||||
detail::tmat4x4<valType> 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;
|
||||
Result[0][3] = valType(0);
|
||||
Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;
|
||||
Result[1][1] = tmp_cb * tmp_cp;
|
||||
Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;
|
||||
Result[1][3] = valType(0);
|
||||
Result[2][0] = tmp_sh * tmp_cp;
|
||||
Result[2][1] = -tmp_sp;
|
||||
Result[2][2] = tmp_ch * tmp_cp;
|
||||
Result[2][3] = valType(0);
|
||||
Result[3][0] = valType(0);
|
||||
Result[3][1] = valType(0);
|
||||
Result[3][2] = valType(0);
|
||||
Result[3][3] = valType(1);
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<valType> 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;
|
||||
Result[0][3] = valType(0);
|
||||
Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;
|
||||
Result[1][1] = tmp_cb * tmp_cp;
|
||||
Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;
|
||||
Result[1][3] = valType(0);
|
||||
Result[2][0] = tmp_sh * tmp_cp;
|
||||
Result[2][1] = -tmp_sp;
|
||||
Result[2][2] = tmp_ch * tmp_cp;
|
||||
Result[2][3] = valType(0);
|
||||
Result[3][0] = valType(0);
|
||||
Result[3][1] = valType(0);
|
||||
Result[3][2] = valType(0);
|
||||
Result[3][3] = valType(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> yawPitchRoll
|
||||
(
|
||||
valType const & yaw,
|
||||
valType const & pitch,
|
||||
valType const & roll
|
||||
)
|
||||
{
|
||||
valType tmp_ch = glm::cos(yaw);
|
||||
valType tmp_sh = glm::sin(yaw);
|
||||
valType tmp_cp = glm::cos(pitch);
|
||||
valType tmp_sp = glm::sin(pitch);
|
||||
valType tmp_cb = glm::cos(roll);
|
||||
valType tmp_sb = glm::sin(roll);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> yawPitchRoll
|
||||
(
|
||||
valType const & yaw,
|
||||
valType const & pitch,
|
||||
valType const & roll
|
||||
)
|
||||
{
|
||||
valType tmp_ch = glm::cos(yaw);
|
||||
valType tmp_sh = glm::sin(yaw);
|
||||
valType tmp_cp = glm::cos(pitch);
|
||||
valType tmp_sp = glm::sin(pitch);
|
||||
valType tmp_cb = glm::cos(roll);
|
||||
valType tmp_sb = glm::sin(roll);
|
||||
|
||||
detail::tmat4x4<valType> 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;
|
||||
Result[0][3] = valType(0);
|
||||
Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;
|
||||
Result[1][1] = tmp_cb * tmp_cp;
|
||||
Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;
|
||||
Result[1][3] = valType(0);
|
||||
Result[2][0] = tmp_sh * tmp_cp;
|
||||
Result[2][1] = -tmp_sp;
|
||||
Result[2][2] = tmp_ch * tmp_cp;
|
||||
Result[2][3] = valType(0);
|
||||
Result[3][0] = valType(0);
|
||||
Result[3][1] = valType(0);
|
||||
Result[3][2] = valType(0);
|
||||
Result[3][3] = valType(1);
|
||||
return Result;
|
||||
}
|
||||
detail::tmat4x4<valType> 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;
|
||||
Result[0][3] = valType(0);
|
||||
Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb;
|
||||
Result[1][1] = tmp_cb * tmp_cp;
|
||||
Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb;
|
||||
Result[1][3] = valType(0);
|
||||
Result[2][0] = tmp_sh * tmp_cp;
|
||||
Result[2][1] = -tmp_sp;
|
||||
Result[2][2] = tmp_ch * tmp_cp;
|
||||
Result[2][3] = valType(0);
|
||||
Result[3][0] = valType(0);
|
||||
Result[3][1] = valType(0);
|
||||
Result[3][2] = valType(0);
|
||||
Result[3][3] = valType(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> orientate2
|
||||
(
|
||||
valType const & angle
|
||||
)
|
||||
{
|
||||
valType c = glm::cos(angle);
|
||||
valType s = glm::sin(angle);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> orientate2
|
||||
(
|
||||
valType const & angle
|
||||
)
|
||||
{
|
||||
valType c = glm::cos(angle);
|
||||
valType s = glm::sin(angle);
|
||||
|
||||
detail::tmat2x2<valType> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[1][0] = -s;
|
||||
Result[1][1] = c;
|
||||
return Result;
|
||||
}
|
||||
detail::tmat2x2<valType> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[1][0] = -s;
|
||||
Result[1][1] = c;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3
|
||||
(
|
||||
valType const & angle
|
||||
)
|
||||
{
|
||||
valType c = glm::cos(angle);
|
||||
valType s = glm::sin(angle);
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3
|
||||
(
|
||||
valType const & angle
|
||||
)
|
||||
{
|
||||
valType c = glm::cos(angle);
|
||||
valType s = glm::sin(angle);
|
||||
|
||||
detail::tmat3x3<valType> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[0][2] = 0.0f;
|
||||
Result[1][0] = -s;
|
||||
Result[1][1] = c;
|
||||
Result[1][2] = 0.0f;
|
||||
Result[2][0] = 0.0f;
|
||||
Result[2][1] = 0.0f;
|
||||
Result[2][2] = 1.0f;
|
||||
return Result;
|
||||
}
|
||||
detail::tmat3x3<valType> Result;
|
||||
Result[0][0] = c;
|
||||
Result[0][1] = s;
|
||||
Result[0][2] = 0.0f;
|
||||
Result[1][0] = -s;
|
||||
Result[1][1] = c;
|
||||
Result[1][2] = 0.0f;
|
||||
Result[2][0] = 0.0f;
|
||||
Result[2][1] = 0.0f;
|
||||
Result[2][2] = 1.0f;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3
|
||||
(
|
||||
detail::tvec3<valType> const & angles
|
||||
)
|
||||
{
|
||||
return detail::tmat3x3<valType>(yawPitchRoll(angles.x, angles.y, angles.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> orientate4
|
||||
(
|
||||
detail::tvec3<valType> const & angles
|
||||
)
|
||||
{
|
||||
return yawPitchRoll(angles.z, angles.x, angles.y);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3
|
||||
(
|
||||
detail::tvec3<valType> const & angles
|
||||
)
|
||||
{
|
||||
return detail::tmat3x3<valType>(yawPitchRoll(angles.x, angles.y, angles.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> orientate4
|
||||
(
|
||||
detail::tvec3<valType> const & angles
|
||||
)
|
||||
{
|
||||
return yawPitchRoll(angles.z, angles.x, angles.y);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,50 +7,49 @@
|
|||
// File : glm/gtx/extend.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
genType extend
|
||||
(
|
||||
genType const & Origin,
|
||||
genType const & Source,
|
||||
genType const & Distance
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
template <typename genType>
|
||||
genType extend
|
||||
(
|
||||
genType const & Origin,
|
||||
genType const & Source,
|
||||
genType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
detail::tvec2<valType> extend
|
||||
(
|
||||
detail::tvec2<valType> const & Origin,
|
||||
detail::tvec2<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
template <typename valType>
|
||||
detail::tvec2<valType> extend
|
||||
(
|
||||
detail::tvec2<valType> const & Origin,
|
||||
detail::tvec2<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
detail::tvec3<valType> extend
|
||||
(
|
||||
detail::tvec3<valType> const & Origin,
|
||||
detail::tvec3<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
detail::tvec4<valType> extend
|
||||
(
|
||||
detail::tvec4<valType> const & Origin,
|
||||
detail::tvec4<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
template <typename valType>
|
||||
detail::tvec3<valType> extend
|
||||
(
|
||||
detail::tvec3<valType> const & Origin,
|
||||
detail::tvec3<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
detail::tvec4<valType> extend
|
||||
(
|
||||
detail::tvec4<valType> const & Origin,
|
||||
detail::tvec4<valType> const & Source,
|
||||
valType const & Distance
|
||||
)
|
||||
{
|
||||
return Origin + (Source - Origin) * Distance;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -54,17 +54,17 @@ namespace glm
|
|||
|
||||
//! Faster than the common pow function but less accurate.
|
||||
//! From GLM_GTX_fast_exponential extension.
|
||||
template <typename valType>
|
||||
valType fastPow(
|
||||
valType const & x,
|
||||
valType const & y);
|
||||
template <typename genType>
|
||||
genType fastPow(
|
||||
genType const & x,
|
||||
genType const & y);
|
||||
|
||||
//! Faster than the common pow function but less accurate.
|
||||
//! From GLM_GTX_fast_exponential extension.
|
||||
template <typename T, typename U>
|
||||
T fastPow(
|
||||
const T& x,
|
||||
const U& y);
|
||||
template <typename genTypeT, typename genTypeU>
|
||||
genTypeT fastPow(
|
||||
genTypeT const & x,
|
||||
genTypeU const & y);
|
||||
|
||||
//! Faster than the common exp function but less accurate.
|
||||
//! From GLM_GTX_fast_exponential extension.
|
||||
|
|
|
@ -7,284 +7,144 @@
|
|||
// File : glm/gtx/fast_exponential.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
// fastPow:
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastPow(const T x, const T y)
|
||||
namespace glm
|
||||
{
|
||||
return exp(y * log(x));
|
||||
}
|
||||
// fastPow:
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastPow(genType const & x, genType const & y)
|
||||
{
|
||||
return exp(y * log(x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastPow(
|
||||
const detail::tvec2<T>& x,
|
||||
const detail::tvec2<T>& y)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y));
|
||||
}
|
||||
VECTORIZE_VEC_VEC(fastPow)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastPow(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastPow(const T x, int y)
|
||||
{
|
||||
T f = T(1);
|
||||
for(int i = 0; i < y; ++i)
|
||||
f *= x;
|
||||
return f;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastPow(
|
||||
const detail::tvec4<T>& x,
|
||||
const detail::tvec4<T>& y)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z),
|
||||
fastPow(x.w, y.w));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastPow(
|
||||
const detail::tvec2<T>& x,
|
||||
const detail::tvec2<int>& y)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastPow(const T x, int y)
|
||||
{
|
||||
T f = T(1);
|
||||
for(int i = 0; i < y; ++i)
|
||||
f *= x;
|
||||
return f;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastPow(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<int>& y)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastPow(
|
||||
const detail::tvec2<T>& x,
|
||||
const detail::tvec2<int>& y)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastPow(
|
||||
const detail::tvec4<T>& x,
|
||||
const detail::tvec4<int>& y)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z),
|
||||
fastPow(x.w, y.w));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastPow(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<int>& y)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z));
|
||||
}
|
||||
// fastExp
|
||||
// Note: This function provides accurate results only for value between -1 and 1, else avoid it.
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastExp(const T x)
|
||||
{
|
||||
// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.
|
||||
// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));
|
||||
T x2 = x * x;
|
||||
T x3 = x2 * x;
|
||||
T x4 = x3 * x;
|
||||
T x5 = x4 * x;
|
||||
return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333));
|
||||
}
|
||||
/* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance
|
||||
GLM_FUNC_QUALIFIER float fastExp(float x)
|
||||
{
|
||||
const float e = 2.718281828f;
|
||||
const float IntegerPart = floor(x);
|
||||
const float FloatPart = x - IntegerPart;
|
||||
float z = 1.f;
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastPow(
|
||||
const detail::tvec4<T>& x,
|
||||
const detail::tvec4<int>& y)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastPow(x.x, y.x),
|
||||
fastPow(x.y, y.y),
|
||||
fastPow(x.z, y.z),
|
||||
fastPow(x.w, y.w));
|
||||
}
|
||||
for(int i = 0; i < int(IntegerPart); ++i)
|
||||
z *= e;
|
||||
|
||||
// fastExp
|
||||
// Note: This function provides accurate results only for value between -1 and 1, else avoid it.
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastExp(const T x)
|
||||
{
|
||||
// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.
|
||||
// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));
|
||||
T x2 = x * x;
|
||||
T x3 = x2 * x;
|
||||
T x4 = x3 * x;
|
||||
T x5 = x4 * x;
|
||||
return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333));
|
||||
}
|
||||
/* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance
|
||||
GLM_FUNC_QUALIFIER float fastExp(float x)
|
||||
{
|
||||
const float e = 2.718281828f;
|
||||
const float IntegerPart = floor(x);
|
||||
const float FloatPart = x - IntegerPart;
|
||||
float z = 1.f;
|
||||
const float x2 = FloatPart * FloatPart;
|
||||
const float x3 = x2 * FloatPart;
|
||||
const float x4 = x3 * FloatPart;
|
||||
const float x5 = x4 * FloatPart;
|
||||
return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f));
|
||||
}
|
||||
|
||||
for(int i = 0; i < int(IntegerPart); ++i)
|
||||
z *= e;
|
||||
// Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers
|
||||
GLM_FUNC_QUALIFIER float fastExp(float x)
|
||||
{
|
||||
// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.
|
||||
// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));
|
||||
float x2 = x * x;
|
||||
float x3 = x2 * x;
|
||||
float x4 = x3 * x;
|
||||
float x5 = x4 * x;
|
||||
float x6 = x5 * x;
|
||||
float x7 = x6 * x;
|
||||
float x8 = x7 * x;
|
||||
return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);;
|
||||
}
|
||||
*/
|
||||
|
||||
const float x2 = FloatPart * FloatPart;
|
||||
const float x3 = x2 * FloatPart;
|
||||
const float x4 = x3 * FloatPart;
|
||||
const float x5 = x4 * FloatPart;
|
||||
return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f));
|
||||
}
|
||||
VECTORIZE_VEC(fastExp)
|
||||
|
||||
// Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers
|
||||
GLM_FUNC_QUALIFIER float fastExp(float x)
|
||||
{
|
||||
// This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower.
|
||||
// return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f))));
|
||||
float x2 = x * x;
|
||||
float x3 = x2 * x;
|
||||
float x4 = x3 * x;
|
||||
float x5 = x4 * x;
|
||||
float x6 = x5 * x;
|
||||
float x7 = x6 * x;
|
||||
float x8 = x7 * x;
|
||||
return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);;
|
||||
}
|
||||
*/
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastExp(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastExp(x.x),
|
||||
fastExp(x.y));
|
||||
}
|
||||
// fastLog
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLog(genType const & x)
|
||||
{
|
||||
return std::log(x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastExp(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastExp(x.x),
|
||||
fastExp(x.y),
|
||||
fastExp(x.z));
|
||||
}
|
||||
/* Slower than the VC7.1 function...
|
||||
GLM_FUNC_QUALIFIER float fastLog(float x)
|
||||
{
|
||||
float y1 = (x - 1.0f) / (x + 1.0f);
|
||||
float y2 = y1 * y1;
|
||||
return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f)));
|
||||
}
|
||||
*/
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastExp(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastExp(x.x),
|
||||
fastExp(x.y),
|
||||
fastExp(x.z),
|
||||
fastExp(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(fastLog)
|
||||
|
||||
// fastLog
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastLog(const T x)
|
||||
{
|
||||
return std::log(x);
|
||||
}
|
||||
//fastExp2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastExp2(genType const & x)
|
||||
{
|
||||
return fastExp(0.69314718055994530941723212145818f * x);
|
||||
}
|
||||
|
||||
/* Slower than the VC7.1 function...
|
||||
GLM_FUNC_QUALIFIER float fastLog(float x)
|
||||
{
|
||||
float y1 = (x - 1.0f) / (x + 1.0f);
|
||||
float y2 = y1 * y1;
|
||||
return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f)));
|
||||
}
|
||||
*/
|
||||
VECTORIZE_VEC(fastExp2)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastLog(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastLog(x.x),
|
||||
fastLog(x.y));
|
||||
}
|
||||
// fastLog2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLog2(genType const & x)
|
||||
{
|
||||
return fastLog(x) / 0.69314718055994530941723212145818f;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastLog(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastLog(x.x),
|
||||
fastLog(x.y),
|
||||
fastLog(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastLog(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastLog(x.x),
|
||||
fastLog(x.y),
|
||||
fastLog(x.z),
|
||||
fastLog(x.w));
|
||||
}
|
||||
|
||||
//fastExp2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastExp2(const T x)
|
||||
{
|
||||
return fastExp(0.69314718055994530941723212145818f * x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastExp2(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastExp2(x.x),
|
||||
fastExp2(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastExp2(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastExp2(x.x),
|
||||
fastExp2(x.y),
|
||||
fastExp2(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastExp2(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastExp2(x.x),
|
||||
fastExp2(x.y),
|
||||
fastExp2(x.z),
|
||||
fastExp2(x.w));
|
||||
}
|
||||
|
||||
// fastLog2, ln2 = 0.69314718055994530941723212145818f
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastLog2(const T x)
|
||||
{
|
||||
return fastLog(x) / 0.69314718055994530941723212145818f;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastLog2(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastLog2(x.x),
|
||||
fastLog2(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastLog2(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastLog2(x.x),
|
||||
fastLog2(x.y),
|
||||
fastLog2(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastLog2(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastLog2(x.x),
|
||||
fastLog2(x.y),
|
||||
fastLog2(x.z),
|
||||
fastLog2(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(fastLog2)
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -2,232 +2,137 @@
|
|||
// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Created : 2006-01-04
|
||||
// Updated : 2008-10-07
|
||||
// Updated : 2011-10-14
|
||||
// Licence : This source is under MIT License
|
||||
// File : glm/gtx/fast_square_root.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
// fastSqrt
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastSqrt
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return genType(1) / fastInverseSqrt(x);
|
||||
}
|
||||
// fastSqrt
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastSqrt
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fastSqrt' only accept floating-point input");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastSqrt
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
fastSqrt(x.x),
|
||||
fastSqrt(x.y));
|
||||
}
|
||||
return genType(1) / fastInverseSqrt(x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastSqrt
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
fastSqrt(x.x),
|
||||
fastSqrt(x.y),
|
||||
fastSqrt(x.z));
|
||||
}
|
||||
VECTORIZE_VEC(fastSqrt)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastSqrt
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
fastSqrt(x.x),
|
||||
fastSqrt(x.y),
|
||||
fastSqrt(x.z),
|
||||
fastSqrt(x.w));
|
||||
}
|
||||
// fastInversesqrt
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastInverseSqrt
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
genType tmp = x;
|
||||
float xhalf = 0.5f * float(tmp);
|
||||
uint i = *(uint*)&x;
|
||||
i = 0x5f375a86 - (i >> 1);
|
||||
//x = *(float*)&i;
|
||||
//x = *((float*)(char*)&i);
|
||||
tmp = detail::uif(i).f;
|
||||
tmp = tmp * (1.5f - xhalf * tmp * tmp);
|
||||
return genType(tmp);
|
||||
}
|
||||
|
||||
// fastInversesqrt
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastInverseSqrt
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
genType tmp = x;
|
||||
float xhalf = 0.5f * float(tmp);
|
||||
uint i = *(uint*)&x;
|
||||
i = 0x5f375a86 - (i >> 1);
|
||||
//x = *(float*)&i;
|
||||
//x = *((float*)(char*)&i);
|
||||
tmp = detail::uif(i).f;
|
||||
tmp = tmp * (1.5f - xhalf * tmp * tmp);
|
||||
return genType(tmp);
|
||||
}
|
||||
VECTORIZE_VEC(fastInverseSqrt)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastInverseSqrt
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
fastInverseSqrt(x.x),
|
||||
fastInverseSqrt(x.y));
|
||||
}
|
||||
// fastLength
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLength
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
return abs(x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastInverseSqrt
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
fastInverseSqrt(x.x),
|
||||
fastInverseSqrt(x.y),
|
||||
fastInverseSqrt(x.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastInverseSqrt
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
fastInverseSqrt(x.x),
|
||||
fastInverseSqrt(x.y),
|
||||
fastInverseSqrt(x.z),
|
||||
fastInverseSqrt(x.w));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
|
||||
// fastLength
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastLength
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
return abs(x);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
// fastDistance
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastDistance
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
// fastNormalize
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastNormalize
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
return x > genType(0) ? genType(1) : -genType(1);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastLength
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
|
||||
return fastSqrt(sqr);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
|
||||
// fastDistance
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastDistance
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastDistance
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastDistance
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastDistance
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
)
|
||||
{
|
||||
return fastLength(y - x);
|
||||
}
|
||||
|
||||
// fastNormalize
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastNormalize
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
return x > genType(0) ? genType(1) : -genType(1);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
|
||||
return x * fastInverseSqrt(sqr);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -2,267 +2,76 @@
|
|||
// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Created : 2006-01-08
|
||||
// Updated : 2006-01-08
|
||||
// Updated : 2011-10-14
|
||||
// Licence : This source is under MIT License
|
||||
// File : glm/gtx/fast_trigonometry.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
// sin
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastSin(const T x)
|
||||
namespace glm
|
||||
{
|
||||
return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040));
|
||||
}
|
||||
// sin
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastSin(T const & x)
|
||||
{
|
||||
return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastSin(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastSin(x.x),
|
||||
fastSin(x.y));
|
||||
}
|
||||
VECTORIZE_VEC(fastSin)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastSin(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastSin(x.x),
|
||||
fastSin(x.y),
|
||||
fastSin(x.z));
|
||||
}
|
||||
// cos
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastCos(T const & x)
|
||||
{
|
||||
return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastSin(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastSin(x.x),
|
||||
fastSin(x.y),
|
||||
fastSin(x.z),
|
||||
fastSin(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(fastCos)
|
||||
|
||||
// cos
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastCos(const T x)
|
||||
{
|
||||
return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888));
|
||||
}
|
||||
// tan
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastTan(T const & 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastCos(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastCos(x.x),
|
||||
fastCos(x.y));
|
||||
}
|
||||
VECTORIZE_VEC(fastTan)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastCos(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastCos(x.x),
|
||||
fastCos(x.y),
|
||||
fastCos(x.z));
|
||||
}
|
||||
// asin
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAsin(T const & 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastCos(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastCos(x.x),
|
||||
fastCos(x.y),
|
||||
fastCos(x.z),
|
||||
fastCos(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(fastAsin)
|
||||
|
||||
// tan
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastTan(const 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));
|
||||
}
|
||||
// acos
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAcos(T const & x)
|
||||
{
|
||||
return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2)
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastTan(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastTan(x.x),
|
||||
fastTan(x.y));
|
||||
}
|
||||
VECTORIZE_VEC(fastAcos)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastTan(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastTan(x.x),
|
||||
fastTan(x.y),
|
||||
fastTan(x.z));
|
||||
}
|
||||
// atan
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(T const & y, T const & x)
|
||||
{
|
||||
T sgn = sign(y) * sign(x);
|
||||
return abs(fastAtan(y / x)) * sgn;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastTan(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastTan(x.x),
|
||||
fastTan(x.y),
|
||||
fastTan(x.z),
|
||||
fastTan(x.w));
|
||||
}
|
||||
VECTORIZE_VEC_VEC(fastAtan)
|
||||
|
||||
// asin
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAsin(const 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>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(T const & 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> detail::tvec2<T> fastAsin(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastAsin(x.x),
|
||||
fastAsin(x.y));
|
||||
}
|
||||
|
||||
template <typename T> detail::tvec3<T> fastAsin(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastAsin(x.x),
|
||||
fastAsin(x.y),
|
||||
fastAsin(x.z));
|
||||
}
|
||||
|
||||
template <typename T> detail::tvec4<T> fastAsin(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastAsin(x.x),
|
||||
fastAsin(x.y),
|
||||
fastAsin(x.z),
|
||||
fastAsin(x.w));
|
||||
}
|
||||
|
||||
// acos
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAcos(const T x)
|
||||
{
|
||||
return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2)
|
||||
}
|
||||
|
||||
template <typename T> detail::tvec2<T> fastAcos(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastAcos(x.x),
|
||||
fastAcos(x.y));
|
||||
}
|
||||
|
||||
template <typename T> detail::tvec3<T> fastAcos(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastAcos(x.x),
|
||||
fastAcos(x.y),
|
||||
fastAcos(x.z));
|
||||
}
|
||||
|
||||
template <typename T> detail::tvec4<T> fastAcos(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastAcos(x.x),
|
||||
fastAcos(x.y),
|
||||
fastAcos(x.z),
|
||||
fastAcos(x.w));
|
||||
}
|
||||
|
||||
// atan
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(const T y, const T x)
|
||||
{
|
||||
T sgn = sign(y) * sign(x);
|
||||
return abs(fastAtan(y / x)) * sgn;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastAtan(
|
||||
const detail::tvec2<T>& y,
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastAtan(y.x, x.x),
|
||||
fastAtan(y.y, x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastAtan(
|
||||
const detail::tvec3<T>& y,
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastAtan(y.x, x.x),
|
||||
fastAtan(y.y, x.y),
|
||||
fastAtan(y.z, x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastAtan(
|
||||
const detail::tvec4<T>& y,
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastAtan(y.x, x.x),
|
||||
fastAtan(y.y, x.y),
|
||||
fastAtan(y.z, x.z),
|
||||
fastAtan(y.w, x.w));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T fastAtan(const 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> fastAtan(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return detail::tvec2<T>(
|
||||
fastAtan(x.x),
|
||||
fastAtan(x.y));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> fastAtan(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return detail::tvec3<T>(
|
||||
fastAtan(x.x),
|
||||
fastAtan(x.y),
|
||||
fastAtan(x.z));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> fastAtan(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return detail::tvec4<T>(
|
||||
fastAtan(x.x),
|
||||
fastAtan(x.y),
|
||||
fastAtan(x.z),
|
||||
fastAtan(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(fastAtan)
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,38 +7,37 @@
|
|||
// File : glm/gtx/gradient_paint.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
valType radialGradient
|
||||
(
|
||||
detail::tvec2<valType> const & Center,
|
||||
valType const & Radius,
|
||||
detail::tvec2<valType> const & Focal,
|
||||
detail::tvec2<valType> const & Position
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tvec2<valType> F = Focal - Center;
|
||||
detail::tvec2<valType> D = Position - Focal;
|
||||
valType Radius2 = pow2(Radius);
|
||||
valType Fx2 = pow2(F.x);
|
||||
valType Fy2 = pow2(F.y);
|
||||
template <typename valType>
|
||||
valType radialGradient
|
||||
(
|
||||
detail::tvec2<valType> const & Center,
|
||||
valType const & Radius,
|
||||
detail::tvec2<valType> const & Focal,
|
||||
detail::tvec2<valType> const & Position
|
||||
)
|
||||
{
|
||||
detail::tvec2<valType> F = Focal - Center;
|
||||
detail::tvec2<valType> D = Position - Focal;
|
||||
valType Radius2 = pow2(Radius);
|
||||
valType Fx2 = pow2(F.x);
|
||||
valType Fy2 = pow2(F.y);
|
||||
|
||||
valType Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x));
|
||||
valType Denominator = Radius2 - (Fx2 + Fy2);
|
||||
return Numerator / Denominator;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
valType linearGradient
|
||||
(
|
||||
detail::tvec2<valType> const & Point0,
|
||||
detail::tvec2<valType> const & Point1,
|
||||
detail::tvec2<valType> const & Position
|
||||
)
|
||||
{
|
||||
detail::tvec2<valType> Dist = Point1 - Point0;
|
||||
return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist);
|
||||
}
|
||||
valType Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x));
|
||||
valType Denominator = Radius2 - (Fx2 + Fy2);
|
||||
return Numerator / Denominator;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
valType linearGradient
|
||||
(
|
||||
detail::tvec2<valType> const & Point0,
|
||||
detail::tvec2<valType> const & Point1,
|
||||
detail::tvec2<valType> const & Position
|
||||
)
|
||||
{
|
||||
detail::tvec2<valType> Dist = Point1 - Point0;
|
||||
return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,24 +7,27 @@
|
|||
// File : glm/gtx/handed_coordinate_space.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool rightHanded(
|
||||
detail::tvec3<T> const & tangent,
|
||||
detail::tvec3<T> const & binormal,
|
||||
detail::tvec3<T> const & normal)
|
||||
namespace glm
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) > T(0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool leftHanded(
|
||||
detail::tvec3<T> const & tangent,
|
||||
detail::tvec3<T> const & binormal,
|
||||
detail::tvec3<T> const & normal)
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) < T(0);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool rightHanded
|
||||
(
|
||||
detail::tvec3<T> const & tangent,
|
||||
detail::tvec3<T> const & binormal,
|
||||
detail::tvec3<T> const & normal
|
||||
)
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) > T(0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool leftHanded
|
||||
(
|
||||
detail::tvec3<T> const & tangent,
|
||||
detail::tvec3<T> const & binormal,
|
||||
detail::tvec3<T> const & normal
|
||||
)
|
||||
{
|
||||
return dot(cross(normal, tangent), binormal) < T(0);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -55,57 +55,57 @@ namespace glm
|
|||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> boxInertia3(
|
||||
const T Mass,
|
||||
const detail::tvec3<T>& Scale);
|
||||
T const & Mass,
|
||||
detail::tvec3<T> const & Scale);
|
||||
|
||||
//! Build an inertia matrix for a box.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> boxInertia4(
|
||||
const T Mass,
|
||||
const detail::tvec3<T>& Scale);
|
||||
T const & Mass,
|
||||
detail::tvec3<T> const & Scale);
|
||||
|
||||
//! Build an inertia matrix for a disk.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> diskInertia3(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
//! Build an inertia matrix for a disk.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> diskInertia4(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
//! Build an inertia matrix for a ball.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> ballInertia3(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
//! Build an inertia matrix for a ball.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> ballInertia4(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
//! Build an inertia matrix for a sphere.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> sphereInertia3(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
//! Build an inertia matrix for a sphere.
|
||||
//! From GLM_GTX_inertia extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> sphereInertia4(
|
||||
const T Mass,
|
||||
const T Radius);
|
||||
T const & Mass,
|
||||
T const & Radius);
|
||||
|
||||
/// @}
|
||||
}// namespace glm
|
||||
|
|
|
@ -7,93 +7,108 @@
|
|||
// File : glm/gtx/inertia.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> boxInertia3(
|
||||
const T Mass,
|
||||
const detail::tvec3<T>& Scale)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat3x3<T> Result(T(1));
|
||||
Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> boxInertia3
|
||||
(
|
||||
T const & Mass,
|
||||
detail::tvec3<T> const & Scale
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<T> Result(T(1));
|
||||
Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> boxInertia4(
|
||||
const T Mass,
|
||||
const detail::tvec3<T>& Scale)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> boxInertia4
|
||||
(
|
||||
T const & Mass,
|
||||
detail::tvec3<T> const & Scale
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(1));
|
||||
Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12);
|
||||
Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> diskInertia3(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = Mass * Radius * Radius / T(2);
|
||||
detail::tmat3x3<T> Result(a);
|
||||
Result[2][2] *= T(2);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> diskInertia3
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = Mass * Radius * Radius / T(2);
|
||||
detail::tmat3x3<T> Result(a);
|
||||
Result[2][2] *= T(2);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> diskInertia4(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = Mass * Radius * Radius / T(2);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[2][2] *= T(2);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> diskInertia4
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = Mass * Radius * Radius / T(2);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[2][2] *= T(2);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> ballInertia3(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(5);
|
||||
return detail::tmat3x3<T>(a);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> ballInertia3
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(5);
|
||||
return detail::tmat3x3<T>(a);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> ballInertia4(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(5);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> ballInertia4
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(5);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> sphereInertia3(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(3);
|
||||
return detail::tmat3x3<T>(a);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> sphereInertia4(
|
||||
const T Mass,
|
||||
const T Radius)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(3);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> sphereInertia3
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(3);
|
||||
return detail::tmat3x3<T>(a);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> sphereInertia4
|
||||
(
|
||||
T const & Mass,
|
||||
T const & Radius
|
||||
)
|
||||
{
|
||||
T a = T(2) * Mass * Radius * Radius / T(3);
|
||||
detail::tmat4x4<T> Result(a);
|
||||
Result[3][3] = T(1);
|
||||
return Result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,11 +7,13 @@
|
|||
// File : glm/gtx/int_10_10_10_2.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
GLM_FUNC_QUALIFIER dword uint10_10_10_2_cast(glm::vec4 const & v)
|
||||
namespace glm
|
||||
{
|
||||
return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 | uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30);
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER dword uint10_10_10_2_cast
|
||||
(
|
||||
glm::vec4 const & v
|
||||
)
|
||||
{
|
||||
return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 | uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,35 +7,35 @@
|
|||
// File : glm/gtx/integer.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
// pow
|
||||
GLM_FUNC_QUALIFIER int pow(int x, int y)
|
||||
namespace glm
|
||||
{
|
||||
if(y == 0)
|
||||
return 1;
|
||||
int result = x;
|
||||
for(int i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
// pow
|
||||
GLM_FUNC_QUALIFIER int pow(int x, int y)
|
||||
{
|
||||
if(y == 0)
|
||||
return 1;
|
||||
int result = x;
|
||||
for(int i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
|
||||
// sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387
|
||||
GLM_FUNC_QUALIFIER int sqrt(int x)
|
||||
{
|
||||
if(x <= 1) return x;
|
||||
// sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387
|
||||
GLM_FUNC_QUALIFIER int sqrt(int x)
|
||||
{
|
||||
if(x <= 1) return x;
|
||||
|
||||
int NextTrial = x >> 1;
|
||||
int CurrentAnswer;
|
||||
int NextTrial = x >> 1;
|
||||
int CurrentAnswer;
|
||||
|
||||
do
|
||||
{
|
||||
CurrentAnswer = NextTrial;
|
||||
NextTrial = (NextTrial + x / NextTrial) >> 1;
|
||||
} while(NextTrial < CurrentAnswer);
|
||||
do
|
||||
{
|
||||
CurrentAnswer = NextTrial;
|
||||
NextTrial = (NextTrial + x / NextTrial) >> 1;
|
||||
} while(NextTrial < CurrentAnswer);
|
||||
|
||||
return CurrentAnswer;
|
||||
}
|
||||
return CurrentAnswer;
|
||||
}
|
||||
|
||||
// Henry Gordon Dietz: http://aggregate.org/MAGIC/
|
||||
namespace detail
|
||||
|
@ -69,132 +69,132 @@ namespace detail
|
|||
};
|
||||
}//namespace detail
|
||||
|
||||
// Henry Gordon Dietz: http://aggregate.org/MAGIC/
|
||||
unsigned int floor_log2(unsigned int x)
|
||||
{
|
||||
x |= (x >> 1);
|
||||
x |= (x >> 2);
|
||||
x |= (x >> 4);
|
||||
x |= (x >> 8);
|
||||
x |= (x >> 16);
|
||||
// Henry Gordon Dietz: http://aggregate.org/MAGIC/
|
||||
unsigned int floor_log2(unsigned int x)
|
||||
{
|
||||
x |= (x >> 1);
|
||||
x |= (x >> 2);
|
||||
x |= (x >> 4);
|
||||
x |= (x >> 8);
|
||||
x |= (x >> 16);
|
||||
|
||||
return(detail::ones32(x) - 1);
|
||||
}
|
||||
return(detail::ones32(x) - 1);
|
||||
}
|
||||
|
||||
// mod
|
||||
GLM_FUNC_QUALIFIER int mod(int x, int y)
|
||||
{
|
||||
return x - y * (x / y);
|
||||
}
|
||||
// mod
|
||||
GLM_FUNC_QUALIFIER int mod(int x, int y)
|
||||
{
|
||||
return x - y * (x / y);
|
||||
}
|
||||
|
||||
// factorial (!12 max, integer only)
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType factorial(genType const & x)
|
||||
{
|
||||
genType Temp = x;
|
||||
genType Result;
|
||||
for(Result = 1; Temp > 1; --Temp)
|
||||
Result *= Temp;
|
||||
return Result;
|
||||
}
|
||||
// factorial (!12 max, integer only)
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType factorial(genType const & x)
|
||||
{
|
||||
genType Temp = x;
|
||||
genType Result;
|
||||
for(Result = 1; Temp > 1; --Temp)
|
||||
Result *= Temp;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> factorial(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> factorial(
|
||||
detail::tvec2<valType> const & x)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> factorial(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> factorial(
|
||||
detail::tvec3<valType> const & x)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> factorial(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z),
|
||||
factorial(x.w));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> factorial(
|
||||
detail::tvec4<valType> const & x)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
factorial(x.x),
|
||||
factorial(x.y),
|
||||
factorial(x.z),
|
||||
factorial(x.w));
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER uint pow(uint x, uint y)
|
||||
{
|
||||
uint result = x;
|
||||
for(uint i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
GLM_FUNC_QUALIFIER uint pow(uint x, uint y)
|
||||
{
|
||||
uint result = x;
|
||||
for(uint i = 1; i < y; ++i)
|
||||
result *= x;
|
||||
return result;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER uint sqrt(uint x)
|
||||
{
|
||||
if(x <= 1) return x;
|
||||
GLM_FUNC_QUALIFIER uint sqrt(uint x)
|
||||
{
|
||||
if(x <= 1) return x;
|
||||
|
||||
uint NextTrial = x >> 1;
|
||||
uint CurrentAnswer;
|
||||
uint NextTrial = x >> 1;
|
||||
uint CurrentAnswer;
|
||||
|
||||
do
|
||||
{
|
||||
CurrentAnswer = NextTrial;
|
||||
NextTrial = (NextTrial + x / NextTrial) >> 1;
|
||||
} while(NextTrial < CurrentAnswer);
|
||||
do
|
||||
{
|
||||
CurrentAnswer = NextTrial;
|
||||
NextTrial = (NextTrial + x / NextTrial) >> 1;
|
||||
} while(NextTrial < CurrentAnswer);
|
||||
|
||||
return CurrentAnswer;
|
||||
}
|
||||
return CurrentAnswer;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER uint mod(uint x, uint y)
|
||||
{
|
||||
return x - y * (x / y);
|
||||
}
|
||||
GLM_FUNC_QUALIFIER uint mod(uint x, uint y)
|
||||
{
|
||||
return x - y * (x / y);
|
||||
}
|
||||
|
||||
#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC))
|
||||
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
return 31u - findMSB(x);
|
||||
}
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
return 31u - findMSB(x);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
int y, m, n;
|
||||
// Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt
|
||||
GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x)
|
||||
{
|
||||
int y, m, n;
|
||||
|
||||
y = -int(x >> 16); // If left half of x is 0,
|
||||
m = (y >> 16) & 16; // set n = 16. If left half
|
||||
n = 16 - m; // is nonzero, set n = 0 and
|
||||
x = x >> m; // shift x right 16.
|
||||
// Now x is of the form 0000xxxx.
|
||||
y = x - 0x100; // If positions 8-15 are 0,
|
||||
m = (y >> 16) & 8; // add 8 to n and shift x left 8.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
y = -int(x >> 16); // If left half of x is 0,
|
||||
m = (y >> 16) & 16; // set n = 16. If left half
|
||||
n = 16 - m; // is nonzero, set n = 0 and
|
||||
x = x >> m; // shift x right 16.
|
||||
// Now x is of the form 0000xxxx.
|
||||
y = x - 0x100; // If positions 8-15 are 0,
|
||||
m = (y >> 16) & 8; // add 8 to n and shift x left 8.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
|
||||
y = x - 0x1000; // If positions 12-15 are 0,
|
||||
m = (y >> 16) & 4; // add 4 to n and shift x left 4.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
y = x - 0x1000; // If positions 12-15 are 0,
|
||||
m = (y >> 16) & 4; // add 4 to n and shift x left 4.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
|
||||
y = x - 0x4000; // If positions 14-15 are 0,
|
||||
m = (y >> 16) & 2; // add 2 to n and shift x left 2.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
y = x - 0x4000; // If positions 14-15 are 0,
|
||||
m = (y >> 16) & 2; // add 2 to n and shift x left 2.
|
||||
n = n + m;
|
||||
x = x << m;
|
||||
|
||||
y = x >> 14; // Set y = 0, 1, 2, or 3.
|
||||
m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp.
|
||||
return unsigned(n + 2 - m);
|
||||
}
|
||||
y = x >> 14; // Set y = 0, 1, 2, or 3.
|
||||
m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp.
|
||||
return unsigned(n + 2 - m);
|
||||
}
|
||||
|
||||
#endif//(GLM_COMPILER)
|
||||
|
||||
|
|
|
@ -10,188 +10,187 @@
|
|||
#include <cfloat>
|
||||
#include <limits>
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRayTriangle
|
||||
(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & v0, genType const & v1, genType const & v2,
|
||||
genType & baryPosition
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
genType e1 = v1 - v0;
|
||||
genType e2 = v2 - v0;
|
||||
|
||||
genType p = glm::cross(dir, e2);
|
||||
|
||||
typename genType::value_type a = glm::dot(e1, p);
|
||||
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
if(a < Epsilon)
|
||||
return false;
|
||||
|
||||
typename genType::value_type f = typename genType::value_type(1.0f) / a;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
baryPosition.z = f * glm::dot(e2, q);
|
||||
|
||||
return baryPosition.z >= typename genType::value_type(0.0f);
|
||||
}
|
||||
|
||||
//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>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineTriangle
|
||||
(
|
||||
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 && det < Epsilon)
|
||||
return false;
|
||||
float inv_det = typename genType::value_type(1) / det;
|
||||
|
||||
genType tvec = orig - vert0;
|
||||
|
||||
position.y = dot(tvec, pvec) * inv_det;
|
||||
if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1))
|
||||
return false;
|
||||
|
||||
genType qvec = cross(tvec, edge1);
|
||||
|
||||
position.z = dot(dir, qvec) * 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;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRaySphere
|
||||
(
|
||||
genType const & rayStarting, genType const & rayDirection,
|
||||
genType const & sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & position, genType & normal
|
||||
)
|
||||
{
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
|
||||
typename genType::value_type a = dot(rayDirection, rayDirection);
|
||||
typename genType::value_type b = typename genType::value_type(2) * dot(rayStarting, rayDirection);
|
||||
typename genType::value_type c = dot(rayStarting, rayStarting) - sphereRadius * sphereRadius;
|
||||
typename genType::value_type d = b * b - typename genType::value_type(4) * a * c;
|
||||
typename genType::value_type e = sqrt(d);
|
||||
typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a);
|
||||
typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a);
|
||||
|
||||
if(x1 > Epsilon)
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRayTriangle
|
||||
(
|
||||
genType const & orig, genType const & dir,
|
||||
genType const & v0, genType const & v1, genType const & v2,
|
||||
genType & baryPosition
|
||||
)
|
||||
{
|
||||
position = rayStarting + rayDirection * sphereRadius;
|
||||
normal = (position - sphereCenter) / sphereRadius;
|
||||
genType e1 = v1 - v0;
|
||||
genType e2 = v2 - v0;
|
||||
|
||||
genType p = glm::cross(dir, e2);
|
||||
|
||||
typename genType::value_type a = glm::dot(e1, p);
|
||||
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
if(a < Epsilon)
|
||||
return false;
|
||||
|
||||
typename genType::value_type f = typename genType::value_type(1.0f) / a;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
baryPosition.z = f * glm::dot(e2, q);
|
||||
|
||||
return baryPosition.z >= typename genType::value_type(0.0f);
|
||||
}
|
||||
|
||||
//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>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineTriangle
|
||||
(
|
||||
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 && det < Epsilon)
|
||||
return false;
|
||||
float inv_det = typename genType::value_type(1) / det;
|
||||
|
||||
genType tvec = orig - vert0;
|
||||
|
||||
position.y = dot(tvec, pvec) * inv_det;
|
||||
if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1))
|
||||
return false;
|
||||
|
||||
genType qvec = cross(tvec, edge1);
|
||||
|
||||
position.z = dot(dir, qvec) * 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;
|
||||
|
||||
return true;
|
||||
}
|
||||
else if(x2 > Epsilon)
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectRaySphere
|
||||
(
|
||||
genType const & rayStarting, genType const & rayDirection,
|
||||
genType const & sphereCenter, typename genType::value_type sphereRadius,
|
||||
genType & position, genType & normal
|
||||
)
|
||||
{
|
||||
position = rayStarting + rayDirection * sphereRadius;
|
||||
normal = (position - sphereCenter) / sphereRadius;
|
||||
return true;
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
|
||||
typename genType::value_type a = dot(rayDirection, rayDirection);
|
||||
typename genType::value_type b = typename genType::value_type(2) * dot(rayStarting, rayDirection);
|
||||
typename genType::value_type c = dot(rayStarting, rayStarting) - sphereRadius * sphereRadius;
|
||||
typename genType::value_type d = b * b - typename genType::value_type(4) * a * c;
|
||||
typename genType::value_type e = sqrt(d);
|
||||
typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a);
|
||||
typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a);
|
||||
|
||||
if(x1 > Epsilon)
|
||||
{
|
||||
position = rayStarting + rayDirection * sphereRadius;
|
||||
normal = (position - sphereCenter) / sphereRadius;
|
||||
return true;
|
||||
}
|
||||
else if(x2 > Epsilon)
|
||||
{
|
||||
position = rayStarting + rayDirection * sphereRadius;
|
||||
normal = (position - sphereCenter) / sphereRadius;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineSphere
|
||||
(
|
||||
genType const & point0, genType const & point1,
|
||||
genType const & center, typename genType::value_type radius,
|
||||
genType & position, genType & normal
|
||||
)
|
||||
{
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
|
||||
genType dir = point1 - point0;
|
||||
typename genType::value_type a = dot(dir, dir);
|
||||
typename genType::value_type b = typename genType::value_type(2) * dot(center, dir);
|
||||
typename genType::value_type c = dot(center, center) - radius * radius;
|
||||
typename genType::value_type d = b * b - typename genType::value_type(4) * a * c;
|
||||
typename genType::value_type e = sqrt(d);
|
||||
typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a);
|
||||
typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a);
|
||||
|
||||
if(x1 > Epsilon)
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool intersectLineSphere
|
||||
(
|
||||
genType const & point0, genType const & point1,
|
||||
genType const & center, typename genType::value_type radius,
|
||||
genType & position, genType & normal
|
||||
)
|
||||
{
|
||||
position = center + dir * radius;
|
||||
normal = (position - center) / radius;
|
||||
return true;
|
||||
}
|
||||
else if(x2 > Epsilon)
|
||||
{
|
||||
position = center + dir * radius;
|
||||
normal = (position - center) / radius;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon();
|
||||
|
||||
genType dir = point1 - point0;
|
||||
typename genType::value_type a = dot(dir, dir);
|
||||
typename genType::value_type b = typename genType::value_type(2) * dot(center, dir);
|
||||
typename genType::value_type c = dot(center, center) - radius * radius;
|
||||
typename genType::value_type d = b * b - typename genType::value_type(4) * a * c;
|
||||
typename genType::value_type e = sqrt(d);
|
||||
typename genType::value_type x1 = (-b - e) / (typename genType::value_type(2) * a);
|
||||
typename genType::value_type x2 = (-b + e) / (typename genType::value_type(2) * a);
|
||||
|
||||
if(x1 > Epsilon)
|
||||
{
|
||||
position = center + dir * radius;
|
||||
normal = (position - center) / radius;
|
||||
return true;
|
||||
}
|
||||
else if(x2 > Epsilon)
|
||||
{
|
||||
position = center + dir * radius;
|
||||
normal = (position - center) / radius;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,82 +7,20 @@
|
|||
// File : glm/gtx/log_base.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType log(
|
||||
genType const & x,
|
||||
genType const & base)
|
||||
namespace glm
|
||||
{
|
||||
assert(x != genType(0));
|
||||
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 valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> log(
|
||||
detail::tvec2<valType> const & v,
|
||||
valType const & base)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
log(v.x, base),
|
||||
log(v.y, base));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> log(
|
||||
detail::tvec3<valType> const & v,
|
||||
valType const & base)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
log(v.x, base),
|
||||
log(v.y, base),
|
||||
log(v.z, base));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> log(
|
||||
detail::tvec4<valType> const & v,
|
||||
valType const & base)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
log(v.x, base),
|
||||
log(v.y, base),
|
||||
log(v.z, base),
|
||||
log(v.w, base));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> log(
|
||||
detail::tvec2<valType> const & v,
|
||||
detail::tvec2<valType> const & base)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
log(v.x, base.x),
|
||||
log(v.y, base.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> log(
|
||||
detail::tvec3<valType> const & v,
|
||||
detail::tvec3<valType> const & base)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
log(v.x, base.x),
|
||||
log(v.y, base.y),
|
||||
log(v.z, base.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> log(
|
||||
detail::tvec4<valType> const & v,
|
||||
detail::tvec4<valType> const & base)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
log(v.x, base.x),
|
||||
log(v.y, base.y),
|
||||
log(v.z, base.z),
|
||||
log(v.w, base.w));
|
||||
}
|
||||
return glm::log(x) / glm::log(base);
|
||||
}
|
||||
|
||||
VECTORIZE_VEC_SCA(log)
|
||||
VECTORIZE_VEC_VEC(log)
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,34 +7,38 @@
|
|||
// File : glm/gtx/matrix_cross_product.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> matrixCross3(
|
||||
detail::tvec3<T> const & x)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat3x3<T> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
Result[2][0] = x.y;
|
||||
Result[1][2] = x.x;
|
||||
Result[2][1] = -x.x;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> matrixCross3
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<T> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
Result[2][0] = x.y;
|
||||
Result[1][2] = x.x;
|
||||
Result[2][1] = -x.x;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> matrixCross4(
|
||||
detail::tvec3<T> const & x)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
Result[2][0] = x.y;
|
||||
Result[1][2] = x.x;
|
||||
Result[2][1] = -x.x;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> matrixCross4
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> Result(T(0));
|
||||
Result[0][1] = x.z;
|
||||
Result[1][0] = -x.z;
|
||||
Result[0][2] = -x.y;
|
||||
Result[2][0] = x.y;
|
||||
Result[1][2] = x.x;
|
||||
Result[2][1] = -x.x;
|
||||
return Result;
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,107 +7,112 @@
|
|||
// File : glm/gtx/matrix_interpolation.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void axisAngle(
|
||||
detail::tmat4x4<T> const & mat,
|
||||
detail::tvec3<T> & axis,
|
||||
T & angle)
|
||||
namespace glm
|
||||
{
|
||||
T epsilon = (T)0.01;
|
||||
T epsilon2 = (T)0.1;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER void axisAngle
|
||||
(
|
||||
detail::tmat4x4<T> const & mat,
|
||||
detail::tvec3<T> & axis,
|
||||
T & angle
|
||||
)
|
||||
{
|
||||
T epsilon = (T)0.01;
|
||||
T epsilon2 = (T)0.1;
|
||||
|
||||
if ((fabs(mat[1][0] - mat[0][1]) < epsilon) && (fabs(mat[2][0] - mat[0][2]) < epsilon) && (fabs(mat[2][1] - mat[1][2]) < epsilon)) {
|
||||
if ((fabs(mat[1][0] + mat[0][1]) < epsilon2) && (fabs(mat[2][0] + mat[0][2]) < epsilon2) && (fabs(mat[2][1] + mat[1][2]) < epsilon2) && (fabs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) {
|
||||
angle = (T)0.0;
|
||||
axis.x = (T)1.0;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.0;
|
||||
return;
|
||||
}
|
||||
angle = 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;
|
||||
if ((xx > yy) && (xx > zz)) {
|
||||
if (xx < epsilon) {
|
||||
axis.x = (T)0.0;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
axis.x = sqrt(xx);
|
||||
axis.y = xy / axis.x;
|
||||
axis.z = xz / axis.x;
|
||||
}
|
||||
} else if (yy > zz) {
|
||||
if (yy < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
axis.y = sqrt(yy);
|
||||
axis.x = xy / axis.y;
|
||||
axis.z = yz / axis.y;
|
||||
}
|
||||
} else {
|
||||
if (zz < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.0;
|
||||
} else {
|
||||
axis.z = sqrt(zz);
|
||||
axis.x = xz / axis.z;
|
||||
axis.y = yz / axis.z;
|
||||
}
|
||||
}
|
||||
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]));
|
||||
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;
|
||||
}
|
||||
if ((fabs(mat[1][0] - mat[0][1]) < epsilon) && (fabs(mat[2][0] - mat[0][2]) < epsilon) && (fabs(mat[2][1] - mat[1][2]) < epsilon)) {
|
||||
if ((fabs(mat[1][0] + mat[0][1]) < epsilon2) && (fabs(mat[2][0] + mat[0][2]) < epsilon2) && (fabs(mat[2][1] + mat[1][2]) < epsilon2) && (fabs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) {
|
||||
angle = (T)0.0;
|
||||
axis.x = (T)1.0;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.0;
|
||||
return;
|
||||
}
|
||||
angle = 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;
|
||||
if ((xx > yy) && (xx > zz)) {
|
||||
if (xx < epsilon) {
|
||||
axis.x = (T)0.0;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
axis.x = sqrt(xx);
|
||||
axis.y = xy / axis.x;
|
||||
axis.z = xz / axis.x;
|
||||
}
|
||||
} else if (yy > zz) {
|
||||
if (yy < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.0;
|
||||
axis.z = (T)0.7071;
|
||||
} else {
|
||||
axis.y = sqrt(yy);
|
||||
axis.x = xy / axis.y;
|
||||
axis.z = yz / axis.y;
|
||||
}
|
||||
} else {
|
||||
if (zz < epsilon) {
|
||||
axis.x = (T)0.7071;
|
||||
axis.y = (T)0.7071;
|
||||
axis.z = (T)0.0;
|
||||
} else {
|
||||
axis.z = sqrt(zz);
|
||||
axis.x = xz / axis.z;
|
||||
axis.y = yz / axis.z;
|
||||
}
|
||||
}
|
||||
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]));
|
||||
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;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> axisAngleMatrix(
|
||||
detail::tvec3<T> const & axis,
|
||||
T const angle)
|
||||
{
|
||||
T c = cos(angle);
|
||||
T s = sin(angle);
|
||||
T t = T(1) - c;
|
||||
detail::tvec3<T> n = normalize(axis);
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> axisAngleMatrix
|
||||
(
|
||||
detail::tvec3<T> const & axis,
|
||||
T const angle
|
||||
)
|
||||
{
|
||||
T c = cos(angle);
|
||||
T s = sin(angle);
|
||||
T t = T(1) - c;
|
||||
detail::tvec3<T> n = normalize(axis);
|
||||
|
||||
return detail::tmat4x4<T>(
|
||||
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)
|
||||
);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> interpolate(
|
||||
detail::tmat4x4<T> const & m1,
|
||||
detail::tmat4x4<T> const & m2,
|
||||
T const delta)
|
||||
{
|
||||
detail::tmat4x4<T> dltRotation = m2 * transpose(m1);
|
||||
detail::tvec3<T> dltAxis;
|
||||
T dltAngle;
|
||||
axisAngle(dltRotation, dltAxis, dltAngle);
|
||||
detail::tmat4x4<T> out = axisAngleMatrix(dltAxis, dltAngle * delta) * rotationMatrix(m1);
|
||||
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]);
|
||||
return out;
|
||||
}
|
||||
return detail::tmat4x4<T>(
|
||||
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)
|
||||
);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> interpolate
|
||||
(
|
||||
detail::tmat4x4<T> const & m1,
|
||||
detail::tmat4x4<T> const & m2,
|
||||
T const delta
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<T> dltRotation = m2 * transpose(m1);
|
||||
detail::tvec3<T> dltAxis;
|
||||
T dltAngle;
|
||||
axisAngle(dltRotation, dltAxis, dltAngle);
|
||||
detail::tmat4x4<T> out = axisAngleMatrix(dltAxis, dltAngle * delta) * rotationMatrix(m1);
|
||||
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]);
|
||||
return out;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -55,85 +55,85 @@ namespace glm
|
|||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat2x2<T> rowMajor2(
|
||||
const detail::tvec2<T>& v1,
|
||||
const detail::tvec2<T>& v2);
|
||||
detail::tvec2<T> const & v1,
|
||||
detail::tvec2<T> const & v2);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat2x2<T> rowMajor2(
|
||||
const detail::tmat2x2<T>& m);
|
||||
detail::tmat2x2<T> const & m);
|
||||
|
||||
//! Build a row major matrix from row vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3);
|
||||
detail::tvec3<T> const & v1,
|
||||
detail::tvec3<T> const & v2,
|
||||
detail::tvec3<T> const & v3);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tmat3x3<T>& m);
|
||||
detail::tmat3x3<T> const & m);
|
||||
|
||||
//! Build a row major matrix from row vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4);
|
||||
detail::tvec4<T> const & v1,
|
||||
detail::tvec4<T> const & v2,
|
||||
detail::tvec4<T> const & v3,
|
||||
detail::tvec4<T> const & v4);
|
||||
|
||||
//! Build a row major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tmat4x4<T>& m);
|
||||
detail::tmat4x4<T> const & m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat2x2<T> colMajor2(
|
||||
const detail::tvec2<T>& v1,
|
||||
const detail::tvec2<T>& v2);
|
||||
detail::tvec2<T> const & v1,
|
||||
detail::tvec2<T> const & v2);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat2x2<T> colMajor2(
|
||||
const detail::tmat2x2<T>& m);
|
||||
detail::tmat2x2<T> const & m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> colMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3);
|
||||
detail::tvec3<T> const & v1,
|
||||
detail::tvec3<T> const & v2,
|
||||
detail::tvec3<T> const & v3);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat3x3<T> colMajor3(
|
||||
const detail::tmat3x3<T>& m);
|
||||
detail::tmat3x3<T> const & m);
|
||||
|
||||
//! Build a column major matrix from column vectors.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> colMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4);
|
||||
detail::tvec4<T> const & v1,
|
||||
detail::tvec4<T> const & v2,
|
||||
detail::tvec4<T> const & v3,
|
||||
detail::tvec4<T> const & v4);
|
||||
|
||||
//! Build a column major matrix from other matrix.
|
||||
//! From GLM_GTX_matrix_major_storage extension.
|
||||
template <typename T>
|
||||
detail::tmat4x4<T> colMajor4(
|
||||
const detail::tmat4x4<T>& m);
|
||||
detail::tmat4x4<T> const & m);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,166 +7,167 @@
|
|||
// File : glm/gtx/matrix_major_storage.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2(
|
||||
const detail::tvec2<T>& v1,
|
||||
const detail::tvec2<T>& v2)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat2x2<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2
|
||||
(
|
||||
detail::tvec2<T> const & v1,
|
||||
detail::tvec2<T> const & v2
|
||||
)
|
||||
{
|
||||
detail::tmat2x2<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2(
|
||||
const detail::tmat2x2<T>& m)
|
||||
{
|
||||
detail::tmat2x2<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2(
|
||||
const detail::tmat2x2<T>& m)
|
||||
{
|
||||
detail::tmat2x2<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3)
|
||||
{
|
||||
detail::tmat3x3<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
Result[2][1] = v2.z;
|
||||
Result[0][2] = v3.x;
|
||||
Result[1][2] = v3.y;
|
||||
Result[2][2] = v3.z;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3)
|
||||
{
|
||||
detail::tmat3x3<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
Result[2][1] = v2.z;
|
||||
Result[0][2] = v3.x;
|
||||
Result[1][2] = v3.y;
|
||||
Result[2][2] = v3.z;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tmat3x3<T>& m)
|
||||
{
|
||||
detail::tmat3x3<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
Result[1][2] = m[2][1];
|
||||
Result[2][0] = m[0][2];
|
||||
Result[2][1] = m[1][2];
|
||||
Result[2][2] = m[2][2];
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3(
|
||||
const detail::tmat3x3<T>& m)
|
||||
{
|
||||
detail::tmat3x3<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
Result[1][2] = m[2][1];
|
||||
Result[2][0] = m[0][2];
|
||||
Result[2][1] = m[1][2];
|
||||
Result[2][2] = m[2][2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4)
|
||||
{
|
||||
detail::tmat4x4<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
Result[3][0] = v1.w;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
Result[2][1] = v2.z;
|
||||
Result[3][1] = v2.w;
|
||||
Result[0][2] = v3.x;
|
||||
Result[1][2] = v3.y;
|
||||
Result[2][2] = v3.z;
|
||||
Result[3][2] = v3.w;
|
||||
Result[0][3] = v4.x;
|
||||
Result[1][3] = v4.y;
|
||||
Result[2][3] = v4.z;
|
||||
Result[3][3] = v4.w;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4)
|
||||
{
|
||||
detail::tmat4x4<T> Result;
|
||||
Result[0][0] = v1.x;
|
||||
Result[1][0] = v1.y;
|
||||
Result[2][0] = v1.z;
|
||||
Result[3][0] = v1.w;
|
||||
Result[0][1] = v2.x;
|
||||
Result[1][1] = v2.y;
|
||||
Result[2][1] = v2.z;
|
||||
Result[3][1] = v2.w;
|
||||
Result[0][2] = v3.x;
|
||||
Result[1][2] = v3.y;
|
||||
Result[2][2] = v3.z;
|
||||
Result[3][2] = v3.w;
|
||||
Result[0][3] = v4.x;
|
||||
Result[1][3] = v4.y;
|
||||
Result[2][3] = v4.z;
|
||||
Result[3][3] = v4.w;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tmat4x4<T>& m)
|
||||
{
|
||||
detail::tmat4x4<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
Result[0][3] = m[3][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
Result[1][2] = m[2][1];
|
||||
Result[1][3] = m[3][1];
|
||||
Result[2][0] = m[0][2];
|
||||
Result[2][1] = m[1][2];
|
||||
Result[2][2] = m[2][2];
|
||||
Result[2][3] = m[3][2];
|
||||
Result[3][0] = m[0][3];
|
||||
Result[3][1] = m[1][3];
|
||||
Result[3][2] = m[2][3];
|
||||
Result[3][3] = m[3][3];
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4(
|
||||
const detail::tmat4x4<T>& m)
|
||||
{
|
||||
detail::tmat4x4<T> Result;
|
||||
Result[0][0] = m[0][0];
|
||||
Result[0][1] = m[1][0];
|
||||
Result[0][2] = m[2][0];
|
||||
Result[0][3] = m[3][0];
|
||||
Result[1][0] = m[0][1];
|
||||
Result[1][1] = m[1][1];
|
||||
Result[1][2] = m[2][1];
|
||||
Result[1][3] = m[3][1];
|
||||
Result[2][0] = m[0][2];
|
||||
Result[2][1] = m[1][2];
|
||||
Result[2][2] = m[2][2];
|
||||
Result[2][3] = m[3][2];
|
||||
Result[3][0] = m[0][3];
|
||||
Result[3][1] = m[1][3];
|
||||
Result[3][2] = m[2][3];
|
||||
Result[3][3] = m[3][3];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2(
|
||||
const detail::tvec2<T>& v1,
|
||||
const detail::tvec2<T>& v2)
|
||||
{
|
||||
return detail::tmat2x2<T>(v1, v2);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2(
|
||||
const detail::tvec2<T>& v1,
|
||||
const detail::tvec2<T>& v2)
|
||||
{
|
||||
return detail::tmat2x2<T>(v1, v2);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2(
|
||||
const detail::tmat2x2<T>& m)
|
||||
{
|
||||
return detail::tmat2x2<T>(m);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2(
|
||||
const detail::tmat2x2<T>& m)
|
||||
{
|
||||
return detail::tmat2x2<T>(m);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3)
|
||||
{
|
||||
return detail::tmat3x3<T>(v1, v2, v3);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3(
|
||||
const detail::tvec3<T>& v1,
|
||||
const detail::tvec3<T>& v2,
|
||||
const detail::tvec3<T>& v3)
|
||||
{
|
||||
return detail::tmat3x3<T>(v1, v2, v3);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3(
|
||||
const detail::tmat3x3<T>& m)
|
||||
{
|
||||
return detail::tmat3x3<T>(m);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3(
|
||||
const detail::tmat3x3<T>& m)
|
||||
{
|
||||
return detail::tmat3x3<T>(m);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4)
|
||||
{
|
||||
return detail::tmat4x4<T>(v1, v2, v3, v4);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4(
|
||||
const detail::tmat4x4<T>& m)
|
||||
{
|
||||
return detail::tmat4x4<T>(m);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4(
|
||||
const detail::tvec4<T>& v1,
|
||||
const detail::tvec4<T>& v2,
|
||||
const detail::tvec4<T>& v3,
|
||||
const detail::tvec4<T>& v4)
|
||||
{
|
||||
return detail::tmat4x4<T>(v1, v2, v3, v4);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4(
|
||||
const detail::tmat4x4<T>& m)
|
||||
{
|
||||
return detail::tmat4x4<T>(m);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,119 +7,118 @@
|
|||
// File : glm/gtx/matrix_operation.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> diagonal2x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat2x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<valType> diagonal2x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat2x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x3<valType> diagonal2x3
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat2x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x3<valType> diagonal2x3
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat2x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x4<valType> diagonal2x4
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat2x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x4<valType> diagonal2x4
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat2x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x2<valType> diagonal3x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x2<valType> diagonal3x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> diagonal3x3
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<valType> diagonal3x3
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x4<valType> diagonal3x4
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x4<valType> diagonal3x4
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat3x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> diagonal4x4
|
||||
(
|
||||
detail::tvec4<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
Result[3][3] = v[3];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> diagonal4x4
|
||||
(
|
||||
detail::tvec4<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x4<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
Result[3][3] = v[3];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x3<valType> diagonal4x3
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x2<valType> diagonal4x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x3<valType> diagonal4x3
|
||||
(
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x3<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
Result[2][2] = v[2];
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x2<valType> diagonal4x2
|
||||
(
|
||||
detail::tvec2<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tmat4x2<valType> Result(valType(1));
|
||||
Result[0][0] = v[0];
|
||||
Result[1][1] = v[1];
|
||||
return Result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -56,57 +56,57 @@ namespace glm
|
|||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNull(
|
||||
const detail::tmat2x2<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat2x2<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix a null matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNull(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat3x3<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix a null matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNull(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix an identity matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename genType>
|
||||
bool isIdentity(
|
||||
const genType& m,
|
||||
const typename genType::value_type epsilon = std::numeric_limits<typename genType::value_type>::epsilon());
|
||||
genType const & m,
|
||||
typename genType::value_type const & epsilon = std::numeric_limits<typename genType::value_type>::epsilon());
|
||||
|
||||
//! Return if a matrix a normalized matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNormalized(
|
||||
const detail::tmat2x2<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat2x2<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix a normalized matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNormalized(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat3x3<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix a normalized matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename T>
|
||||
bool isNormalized(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const T epsilon = std::numeric_limits<T>::epsilon());
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & epsilon = std::numeric_limits<T>::epsilon());
|
||||
|
||||
//! Return if a matrix an orthonormalized matrix.
|
||||
//! From GLM_GTX_matrix_query extension.
|
||||
template<typename genType>
|
||||
bool isOrthogonal(
|
||||
const genType& m,
|
||||
const typename genType::value_type epsilon = std::numeric_limits<typename genType::value_type>::epsilon());
|
||||
genType const & m,
|
||||
typename genType::value_type const & epsilon = std::numeric_limits<typename genType::value_type>::epsilon());
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -10,131 +10,145 @@
|
|||
// - GLM core
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull(
|
||||
const detail::tmat2x2<T>& m,
|
||||
const T epsilon)
|
||||
namespace glm
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 2 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const T epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 3 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const T epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 4 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isIdentity(
|
||||
const genType& m,
|
||||
const typename genType::value_type epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(typename genType::value_type i = typename genType::value_type(0); result && i < genType::col_size(); ++i)
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull
|
||||
(
|
||||
detail::tmat2x2<T> const & m,
|
||||
T const & epsilon)
|
||||
{
|
||||
for(typename genType::value_type j = typename genType::value_type(0); result && j < i ; ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 2 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull
|
||||
(
|
||||
detail::tmat3x3<T> const & m,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 3 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNull
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 4 ; ++i)
|
||||
result = isNull(m[i], epsilon);
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isIdentity
|
||||
(
|
||||
genType const & m,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(typename genType::value_type i = typename genType::value_type(0); result && i < genType::col_size(); ++i)
|
||||
{
|
||||
for(typename genType::value_type j = typename genType::value_type(0); result && j < i ; ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
if(result)
|
||||
result = abs(m[i][i] - typename genType::value_type(1)) <= epsilon;
|
||||
for(typename genType::value_type j = i + typename genType::value_type(1); result && j < genType::row_size(); ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized
|
||||
(
|
||||
detail::tmat2x2<T> const & m,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 2; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 2; ++i)
|
||||
{
|
||||
detail::tvec2<T> v;
|
||||
for(int j = 0; j < 2; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized
|
||||
(
|
||||
detail::tmat3x3<T> const & m,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 3; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 3; ++i)
|
||||
{
|
||||
detail::tvec3<T> v;
|
||||
for(int j = 0; j < 3; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 4; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 4; ++i)
|
||||
{
|
||||
detail::tvec4<T> v;
|
||||
for(int j = 0; j < 4; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isOrthogonal
|
||||
(
|
||||
genType const & m,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < genType::col_size() - 1; ++i)
|
||||
for(int j= i + 1; result && j < genType::col_size(); ++j)
|
||||
result = areOrthogonal(m[i], m[j], epsilon);
|
||||
|
||||
if(result)
|
||||
result = abs(m[i][i] - typename genType::value_type(1)) <= epsilon;
|
||||
for(typename genType::value_type j = i + typename genType::value_type(1); result && j < genType::row_size(); ++j)
|
||||
result = abs(m[i][j]) <= epsilon;
|
||||
{
|
||||
genType tmp = transpose(m);
|
||||
for(int i = 0; result && i < genType::col_size() - 1 ; ++i)
|
||||
for(int j = i + 1; result && j < genType::col_size(); ++j)
|
||||
result = areOrthogonal(tmp[i], tmp[j], epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(
|
||||
const detail::tmat2x2<T>& m,
|
||||
const T epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 2; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 2; ++i)
|
||||
{
|
||||
detail::tvec2<T> v;
|
||||
for(int j = 0; j < 2; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const T epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 3; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 3; ++i)
|
||||
{
|
||||
detail::tvec3<T> v;
|
||||
for(int j = 0; j < 3; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const T epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < 4; ++i)
|
||||
result = isNormalized(m[i], epsilon);
|
||||
for(int i = 0; result && i < 4; ++i)
|
||||
{
|
||||
detail::tvec4<T> v;
|
||||
for(int j = 0; j < 4; ++j)
|
||||
v[j] = m[j][i];
|
||||
result = isNormalized(v, epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isOrthogonal(
|
||||
const genType& m,
|
||||
const typename genType::value_type epsilon)
|
||||
{
|
||||
bool result = true;
|
||||
for(int i = 0; result && i < genType::col_size() - 1; ++i)
|
||||
for(int j= i + 1; result && j < genType::col_size(); ++j)
|
||||
result = areOrthogonal(m[i], m[j], epsilon);
|
||||
|
||||
if(result)
|
||||
{
|
||||
genType tmp = transpose(m);
|
||||
for(int i = 0; result && i < genType::col_size() - 1 ; ++i)
|
||||
for(int j = i + 1; result && j < genType::col_size(); ++j)
|
||||
result = areOrthogonal(tmp[i], tmp[j], epsilon);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,15 +7,16 @@
|
|||
// File : glm/gtx/mixed_product.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType mixedProduct(
|
||||
detail::tvec3<valType> const & v1,
|
||||
detail::tvec3<valType> const & v2,
|
||||
detail::tvec3<valType> const & v3)
|
||||
namespace glm
|
||||
{
|
||||
return dot(cross(v1, v2), v3);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType mixedProduct
|
||||
(
|
||||
detail::tvec3<valType> const & v1,
|
||||
detail::tvec3<valType> const & v2,
|
||||
detail::tvec3<valType> const & v3
|
||||
)
|
||||
{
|
||||
return dot(cross(v1, v2), v3);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -10,184 +10,111 @@
|
|||
// - GLM core
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
//////////////////////
|
||||
// higherMultiple
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType higherMultiple
|
||||
(
|
||||
genType const & Source,
|
||||
genType const & Multiple
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
genType Tmp = Source % Multiple;
|
||||
return Tmp ? Source + Multiple - Tmp : Source;
|
||||
}
|
||||
//////////////////////
|
||||
// higherMultiple
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER detail::thalf higherMultiple
|
||||
(
|
||||
detail::thalf const & SourceH,
|
||||
detail::thalf const & MultipleH
|
||||
)
|
||||
{
|
||||
float Source = SourceH.toFloat();
|
||||
float Multiple = MultipleH.toFloat();
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType higherMultiple
|
||||
(
|
||||
genType const & Source,
|
||||
genType const & Multiple
|
||||
)
|
||||
{
|
||||
genType Tmp = Source % Multiple;
|
||||
return Tmp ? Source + Multiple - Tmp : Source;
|
||||
}
|
||||
|
||||
int Tmp = int(float(Source)) % int(Multiple);
|
||||
return detail::thalf(Tmp ? Source + Multiple - float(Tmp) : Source);
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER detail::thalf higherMultiple
|
||||
(
|
||||
detail::thalf const & SourceH,
|
||||
detail::thalf const & MultipleH
|
||||
)
|
||||
{
|
||||
float Source = SourceH.toFloat();
|
||||
float Multiple = MultipleH.toFloat();
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float higherMultiple
|
||||
(
|
||||
float const & Source,
|
||||
float const & Multiple
|
||||
)
|
||||
{
|
||||
int Tmp = int(Source) % int(Multiple);
|
||||
return Tmp ? Source + Multiple - float(Tmp) : Source;
|
||||
}
|
||||
int Tmp = int(float(Source)) % int(Multiple);
|
||||
return detail::thalf(Tmp ? Source + Multiple - float(Tmp) : Source);
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double higherMultiple
|
||||
(
|
||||
double const & Source,
|
||||
double const & Multiple
|
||||
)
|
||||
{
|
||||
long Tmp = long(Source) % long(Multiple);
|
||||
return Tmp ? Source + Multiple - double(Tmp) : Source;
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float higherMultiple
|
||||
(
|
||||
float const & Source,
|
||||
float const & Multiple
|
||||
)
|
||||
{
|
||||
int Tmp = int(Source) % int(Multiple);
|
||||
return Tmp ? Source + Multiple - float(Tmp) : Source;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> higherMultiple
|
||||
(
|
||||
detail::tvec2<T> const & Source,
|
||||
detail::tvec2<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = higherMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double higherMultiple
|
||||
(
|
||||
double const & Source,
|
||||
double const & Multiple
|
||||
)
|
||||
{
|
||||
long Tmp = long(Source) % long(Multiple);
|
||||
return Tmp ? Source + Multiple - double(Tmp) : Source;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> higherMultiple
|
||||
(
|
||||
detail::tvec3<T> const & Source,
|
||||
detail::tvec3<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = higherMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
VECTORIZE_VEC_VEC(higherMultiple)
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> higherMultiple
|
||||
(
|
||||
detail::tvec4<T> const & Source,
|
||||
detail::tvec4<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = higherMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
//////////////////////
|
||||
// lowerMultiple
|
||||
|
||||
//////////////////////
|
||||
// lowerMultiple
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType lowerMultiple
|
||||
(
|
||||
genType const & Source,
|
||||
genType const & Multiple
|
||||
)
|
||||
{
|
||||
genType Tmp = Source % Multiple;
|
||||
return Tmp ? Source - Tmp : Source;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType lowerMultiple
|
||||
(
|
||||
genType const & Source,
|
||||
genType const & Multiple
|
||||
)
|
||||
{
|
||||
genType Tmp = Source % Multiple;
|
||||
return Tmp ? Source - Tmp : Source;
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER detail::thalf lowerMultiple
|
||||
(
|
||||
detail::thalf const & SourceH,
|
||||
detail::thalf const & MultipleH
|
||||
)
|
||||
{
|
||||
float Source = SourceH.toFloat();
|
||||
float Multiple = MultipleH.toFloat();
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER detail::thalf lowerMultiple
|
||||
(
|
||||
detail::thalf const & SourceH,
|
||||
detail::thalf const & MultipleH
|
||||
)
|
||||
{
|
||||
float Source = SourceH.toFloat();
|
||||
float Multiple = MultipleH.toFloat();
|
||||
int Tmp = int(float(Source)) % int(float(Multiple));
|
||||
return detail::thalf(Tmp ? Source - float(Tmp) : Source);
|
||||
}
|
||||
|
||||
int Tmp = int(float(Source)) % int(float(Multiple));
|
||||
return detail::thalf(Tmp ? Source - float(Tmp) : Source);
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float lowerMultiple
|
||||
(
|
||||
float const & Source,
|
||||
float const & Multiple
|
||||
)
|
||||
{
|
||||
int Tmp = int(Source) % int(Multiple);
|
||||
return Tmp ? Source - float(Tmp) : Source;
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER float lowerMultiple
|
||||
(
|
||||
float const & Source,
|
||||
float const & Multiple
|
||||
)
|
||||
{
|
||||
int Tmp = int(Source) % int(Multiple);
|
||||
return Tmp ? Source - float(Tmp) : Source;
|
||||
}
|
||||
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double lowerMultiple
|
||||
(
|
||||
double const & Source,
|
||||
double const & Multiple
|
||||
)
|
||||
{
|
||||
long Tmp = long(Source) % long(Multiple);
|
||||
return Tmp ? Source - double(Tmp) : Source;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> lowerMultiple
|
||||
(
|
||||
detail::tvec2<T> const & Source,
|
||||
detail::tvec2<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = lowerMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> lowerMultiple
|
||||
(
|
||||
detail::tvec3<T> const & Source,
|
||||
detail::tvec3<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = lowerMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> lowerMultiple
|
||||
(
|
||||
detail::tvec4<T> const & Source,
|
||||
detail::tvec4<T> const & Multiple
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = lowerMultiple(Source[i], Multiple[i]);
|
||||
return Result;
|
||||
}
|
||||
template <>
|
||||
GLM_FUNC_QUALIFIER double lowerMultiple
|
||||
(
|
||||
double const & Source,
|
||||
double const & Multiple
|
||||
)
|
||||
{
|
||||
long Tmp = long(Source) % long(Multiple);
|
||||
return Tmp ? Source - double(Tmp) : Source;
|
||||
}
|
||||
|
||||
VECTORIZE_VEC_VEC(lowerMultiple)
|
||||
}//namespace glm
|
||||
|
|
|
@ -56,99 +56,73 @@ namespace glm
|
|||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T length2(
|
||||
const T x);
|
||||
T const & x);
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T length2(
|
||||
const detail::tvec2<T> & x);
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T length2(
|
||||
const detail::tvec3<T>& x);
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T length2(
|
||||
const detail::tvec4<T>& x);
|
||||
template <typename genType>
|
||||
typename genType::value_type length2(
|
||||
genType const & x);
|
||||
|
||||
//! Returns the squared length of x.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T length2(
|
||||
const detail::tquat<T>& q);
|
||||
detail::tquat<T> const & q);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const T p0,
|
||||
const T p1);
|
||||
T const & p0,
|
||||
T const & p1);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec2<T>& p0,
|
||||
const detail::tvec2<T>& p1);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec3<T>& p0,
|
||||
const detail::tvec3<T>& p1);
|
||||
|
||||
//! Returns the squared distance between p0 and p1, i.e., length(p0 - p1).
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec4<T>& p0,
|
||||
const detail::tvec4<T>& p1);
|
||||
template <typename genType>
|
||||
typename genType::value_type distance2(
|
||||
genType const & p0,
|
||||
genType const & p1);
|
||||
|
||||
//! Returns the L1 norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T l1Norm(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y);
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y);
|
||||
|
||||
//! Returns the L1 norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T l1Norm(
|
||||
const detail::tvec3<T>& v);
|
||||
detail::tvec3<T> const & v);
|
||||
|
||||
//! Returns the L2 norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T l2Norm(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y);
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y);
|
||||
|
||||
//! Returns the L2 norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T l2Norm(
|
||||
const detail::tvec3<T>& x);
|
||||
detail::tvec3<T> const & x);
|
||||
|
||||
//! Returns the L norm between x and y.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T lxNorm(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y,
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & y,
|
||||
unsigned int Depth);
|
||||
|
||||
//! Returns the L norm of v.
|
||||
//! From GLM_GTX_norm extension.
|
||||
template <typename T>
|
||||
T lxNorm(
|
||||
const detail::tvec3<T>& x,
|
||||
detail::tvec3<T> const & x,
|
||||
unsigned int Depth);
|
||||
|
||||
/// @}
|
||||
|
|
230
glm/gtx/norm.inl
230
glm/gtx/norm.inl
|
@ -7,120 +7,150 @@
|
|||
// File : glm/gtx/norm.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2(
|
||||
const T x)
|
||||
namespace glm
|
||||
{
|
||||
return x * x;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
T const & x
|
||||
)
|
||||
{
|
||||
return x * x;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2(
|
||||
const detail::tvec2<T>& x)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
detail::tvec2<T> const & x
|
||||
)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2(
|
||||
const detail::tvec3<T>& x)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
detail::tvec3<T> const & x
|
||||
)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2(
|
||||
const detail::tvec4<T>& x)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
detail::tvec4<T> const & x
|
||||
)
|
||||
{
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2(
|
||||
const detail::tquat<T>& q)
|
||||
{
|
||||
return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T length2
|
||||
(
|
||||
detail::tquat<T> const & q
|
||||
)
|
||||
{
|
||||
return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const T p0,
|
||||
const T p1)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
T const & p0,
|
||||
T const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec2<T>& p0,
|
||||
const detail::tvec2<T>& p1)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
detail::tvec2<T> const & p0,
|
||||
detail::tvec2<T> const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec3<T>& p0,
|
||||
const detail::tvec3<T>& p1)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
detail::tvec3<T> const & p0,
|
||||
detail::tvec3<T> const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
T distance2(
|
||||
const detail::tvec4<T>& p0,
|
||||
const detail::tvec4<T>& p1)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T distance2
|
||||
(
|
||||
detail::tvec4<T> const & p0,
|
||||
detail::tvec4<T> const & p1
|
||||
)
|
||||
{
|
||||
return length2(p1 - p0);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l1Norm(
|
||||
const detail::tvec3<T>& a,
|
||||
const detail::tvec3<T>& b)
|
||||
{
|
||||
return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l1Norm
|
||||
(
|
||||
detail::tvec3<T> const & a,
|
||||
detail::tvec3<T> const & b
|
||||
)
|
||||
{
|
||||
return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l1Norm(
|
||||
const detail::tvec3<T>& v)
|
||||
{
|
||||
return abs(v.x) + abs(v.y) + abs(v.z);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l1Norm
|
||||
(
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
return abs(v.x) + abs(v.y) + abs(v.z);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l2Norm(
|
||||
const detail::tvec3<T>& a,
|
||||
const detail::tvec3<T>& b)
|
||||
{
|
||||
return length(b - a);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l2Norm
|
||||
(
|
||||
detail::tvec3<T> const & a,
|
||||
detail::tvec3<T> const & b
|
||||
)
|
||||
{
|
||||
return length(b - a);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l2Norm(
|
||||
const detail::tvec3<T>& v)
|
||||
{
|
||||
return length(v);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T l2Norm
|
||||
(
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
return length(v);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T lxNorm(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& 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>
|
||||
GLM_FUNC_QUALIFIER T lxNorm
|
||||
(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> 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>
|
||||
GLM_FUNC_QUALIFIER T lxNorm(
|
||||
const detail::tvec3<T>& 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));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T lxNorm
|
||||
(
|
||||
detail::tvec3<T> 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));
|
||||
}
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,17 +7,16 @@
|
|||
// File : glm/gtx/normal.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> triangleNormal
|
||||
(
|
||||
detail::tvec3<T> const & p1,
|
||||
detail::tvec3<T> const & p2,
|
||||
detail::tvec3<T> const & p3
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return normalize(cross(p1 - p2, p1 - p3));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> triangleNormal
|
||||
(
|
||||
detail::tvec3<T> const & p1,
|
||||
detail::tvec3<T> const & p2,
|
||||
detail::tvec3<T> const & p3
|
||||
)
|
||||
{
|
||||
return normalize(cross(p1 - p2, p1 - p3));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,110 +7,109 @@
|
|||
// File : glm/gtx/normalize_dot.inl
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType normalizeDot
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType normalizeDot
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType normalizeDot
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
glm::inversesqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastNormalizeDot
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType fastNormalizeDot
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType fastNormalizeDot
|
||||
(
|
||||
detail::tvec4<valType> const & x,
|
||||
detail::tvec4<valType> const & y
|
||||
)
|
||||
{
|
||||
return
|
||||
glm::dot(x, y) *
|
||||
fastInverseSqrt(glm::dot(x, x) *
|
||||
glm::dot(y, y));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,53 +7,52 @@
|
|||
// File : glm/gtx/optimum_pow.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow2(const genType& x)
|
||||
namespace glm
|
||||
{
|
||||
return x * x;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow2(const genType& x)
|
||||
{
|
||||
return x * x;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow3(const genType& x)
|
||||
{
|
||||
return x * x * x;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow3(const genType& x)
|
||||
{
|
||||
return x * x * x;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow4(const genType& x)
|
||||
{
|
||||
return x * x * x * x;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType pow4(const genType& x)
|
||||
{
|
||||
return x * x * x * x;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER bool powOfTwo(int x)
|
||||
{
|
||||
return !(x & (x - 1));
|
||||
}
|
||||
GLM_FUNC_QUALIFIER bool powOfTwo(int x)
|
||||
{
|
||||
return !(x & (x - 1));
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> powOfTwo(const detail::tvec2<int>& x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y));
|
||||
}
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> powOfTwo(const detail::tvec2<int>& x)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y));
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> powOfTwo(const detail::tvec3<int>& x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y),
|
||||
powOfTwo(x.z));
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> powOfTwo(const detail::tvec4<int>& x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y),
|
||||
powOfTwo(x.z),
|
||||
powOfTwo(x.w));
|
||||
}
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> powOfTwo(const detail::tvec3<int>& x)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y),
|
||||
powOfTwo(x.z));
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> powOfTwo(const detail::tvec4<int>& x)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
powOfTwo(x.x),
|
||||
powOfTwo(x.y),
|
||||
powOfTwo(x.z),
|
||||
powOfTwo(x.w));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,38 +7,37 @@
|
|||
// File : glm/gtx/orthonormalize.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> orthonormalize
|
||||
(
|
||||
const detail::tmat3x3<T>& m
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat3x3<T> r = m;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> orthonormalize
|
||||
(
|
||||
const detail::tmat3x3<T>& m
|
||||
)
|
||||
{
|
||||
detail::tmat3x3<T> r = m;
|
||||
|
||||
r[0] = normalize(r[0]);
|
||||
r[0] = normalize(r[0]);
|
||||
|
||||
float d0 = dot(r[0], r[1]);
|
||||
r[1] -= r[0] * d0;
|
||||
r[1] = normalize(r[1]);
|
||||
float d0 = dot(r[0], r[1]);
|
||||
r[1] -= r[0] * d0;
|
||||
r[1] = normalize(r[1]);
|
||||
|
||||
float d1 = dot(r[1], r[2]);
|
||||
d0 = dot(r[0], r[2]);
|
||||
r[2] -= r[0] * d0 + r[1] * d1;
|
||||
r[2] = normalize(r[2]);
|
||||
float d1 = dot(r[1], r[2]);
|
||||
d0 = dot(r[0], r[2]);
|
||||
r[2] -= r[0] * d0 + r[1] * d1;
|
||||
r[2] = normalize(r[2]);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> orthonormalize
|
||||
(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y
|
||||
)
|
||||
{
|
||||
return normalize(x - y * dot(y, x));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> orthonormalize
|
||||
(
|
||||
const detail::tvec3<T>& x,
|
||||
const detail::tvec3<T>& y
|
||||
)
|
||||
{
|
||||
return normalize(x - y * dot(y, x));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -54,24 +54,10 @@ namespace glm
|
|||
|
||||
//! Projects x a perpendicular axis of Normal.
|
||||
//! From GLM_GTX_perpendicular extension.
|
||||
template <typename T>
|
||||
detail::tvec2<T> perp(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & Normal);
|
||||
|
||||
//! Projects x a perpendicular axis of Normal.
|
||||
//! From GLM_GTX_perpendicular extension.
|
||||
template <typename T>
|
||||
detail::tvec3<T> perp(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & Normal);
|
||||
|
||||
//! Projects x a perpendicular axis of Normal.
|
||||
//! From GLM_GTX_perpendicular extension.
|
||||
template <typename T>
|
||||
detail::tvec4<T> perp(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & Normal);
|
||||
template <typename vecType>
|
||||
vecType perp(
|
||||
vecType const & x,
|
||||
vecType const & Normal);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,30 +7,15 @@
|
|||
// File : glm/gtx/perpendicular.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> perp(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & Normal)
|
||||
namespace glm
|
||||
{
|
||||
return x - proj(x, Normal);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> perp(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & Normal)
|
||||
{
|
||||
return x - proj(x, Normal);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> perp(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & Normal)
|
||||
{
|
||||
return x - proj(x, Normal);
|
||||
}
|
||||
|
||||
template <typename vecType>
|
||||
GLM_FUNC_QUALIFIER vecType perp
|
||||
(
|
||||
vecType const & x,
|
||||
vecType const & Normal
|
||||
)
|
||||
{
|
||||
return x - proj(x, Normal);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -53,12 +53,14 @@ namespace glm
|
|||
//! Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude.
|
||||
//! From GLM_GTX_polar_coordinates extension.
|
||||
template <typename T>
|
||||
detail::tvec3<T> polar(const detail::tvec3<T>& euclidean);
|
||||
detail::tvec3<T> polar(
|
||||
detail::tvec3<T> const & euclidean);
|
||||
|
||||
//! Convert Polar to Euclidean coordinates.
|
||||
//! From GLM_GTX_polar_coordinates extension.
|
||||
template <typename T>
|
||||
detail::tvec3<T> euclidean(const detail::tvec3<T>& polar);
|
||||
detail::tvec3<T> euclidean(
|
||||
detail::tvec3<T> const & polar);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
namespace glm
|
||||
{
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> polar(
|
||||
const detail::tvec3<T>& euclidean)
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> polar
|
||||
(
|
||||
detail::tvec3<T> const & euclidean
|
||||
)
|
||||
{
|
||||
T length = length(euclidean);
|
||||
detail::tvec3<T> tmp = euclidean / length;
|
||||
|
@ -24,8 +26,10 @@ namespace glm
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> euclidean(
|
||||
const detail::tvec3<T>& polar)
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> euclidean
|
||||
(
|
||||
detail::tvec3<T> const & polar
|
||||
)
|
||||
{
|
||||
T latitude = radians(polar.x);
|
||||
T longitude = radians(polar.y);
|
||||
|
|
|
@ -52,24 +52,10 @@ namespace glm
|
|||
|
||||
//! Projects x on Normal.
|
||||
//! From GLM_GTX_projection extension.
|
||||
template <typename T>
|
||||
detail::tvec2<T> proj(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & Normal);
|
||||
|
||||
//! Projects x on Normal.
|
||||
//! From GLM_GTX_projection extension.
|
||||
template <typename T>
|
||||
detail::tvec3<T> proj(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & Normal);
|
||||
|
||||
//! Projects x on Normal.
|
||||
//! From GLM_GTX_projection extension.
|
||||
template <typename T>
|
||||
detail::tvec4<T> proj(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & Normal);
|
||||
template <typename vecType>
|
||||
vecType proj(
|
||||
vecType const & x,
|
||||
vecType const & Normal);
|
||||
|
||||
/// @}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,30 +7,15 @@
|
|||
// File : glm/gtx/projection.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> proj(
|
||||
detail::tvec2<T> const & x,
|
||||
detail::tvec2<T> const & Normal)
|
||||
namespace glm
|
||||
{
|
||||
return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> proj(
|
||||
detail::tvec3<T> const & x,
|
||||
detail::tvec3<T> const & Normal)
|
||||
{
|
||||
return dot(x, Normal) / glm::dot(Normal, Normal) * Normal;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> proj(
|
||||
detail::tvec4<T> const & x,
|
||||
detail::tvec4<T> const & Normal)
|
||||
{
|
||||
return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;
|
||||
}
|
||||
|
||||
template <typename vecType>
|
||||
GLM_FUNC_QUALIFIER vecType proj
|
||||
(
|
||||
vecType const & x,
|
||||
vecType const & Normal
|
||||
)
|
||||
{
|
||||
return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -9,291 +9,290 @@
|
|||
|
||||
#include <limits>
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> cross
|
||||
(
|
||||
detail::tvec3<valType> const & v,
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return inverse(q) * v;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> cross
|
||||
(
|
||||
detail::tvec3<valType> const & v,
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return inverse(q) * v;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> cross
|
||||
(
|
||||
detail::tquat<valType> const & q,
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> cross
|
||||
(
|
||||
detail::tquat<valType> const & q,
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> squad
|
||||
(
|
||||
detail::tquat<T> const & q1,
|
||||
detail::tquat<T> const & q2,
|
||||
detail::tquat<T> const & s1,
|
||||
detail::tquat<T> const & s2,
|
||||
T const & h)
|
||||
{
|
||||
return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * h (T(1) - h));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> squad
|
||||
(
|
||||
detail::tquat<T> const & q1,
|
||||
detail::tquat<T> const & q2,
|
||||
detail::tquat<T> const & s1,
|
||||
detail::tquat<T> const & s2,
|
||||
T const & h)
|
||||
{
|
||||
return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * h (T(1) - h));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> intermediate
|
||||
(
|
||||
detail::tquat<T> const & prev,
|
||||
detail::tquat<T> const & curr,
|
||||
detail::tquat<T> const & next
|
||||
)
|
||||
{
|
||||
detail::tquat<T> invQuat = inverse(curr);
|
||||
return ext((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> intermediate
|
||||
(
|
||||
detail::tquat<T> const & prev,
|
||||
detail::tquat<T> const & curr,
|
||||
detail::tquat<T> const & next
|
||||
)
|
||||
{
|
||||
detail::tquat<T> invQuat = inverse(curr);
|
||||
return ext((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> exp
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
T const & exponent
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> u(q.x, q.y, q.z);
|
||||
float a = glm::length(u);
|
||||
detail::tvec3<T> v(u / a);
|
||||
return detail::tquat<T>(cos(a), sin(a) * v);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> exp
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
T const & exponent
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> u(q.x, q.y, q.z);
|
||||
float a = glm::length(u);
|
||||
detail::tvec3<T> v(u / a);
|
||||
return detail::tquat<T>(cos(a), sin(a) * v);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> log
|
||||
(
|
||||
detail::tquat<T> const & q
|
||||
)
|
||||
{
|
||||
if((q.x == T(0)) && (q.y == T(0)) && (q.z == T(0)))
|
||||
{
|
||||
if(q.w > T(0))
|
||||
return detail::tquat<T>(log(q.w), T(0), T(0), T(0));
|
||||
else if(q.w < T(0))
|
||||
return detail::tquat<T>(log(-q.w), T(3.1415926535897932384626433832795), T(0),T(0));
|
||||
else
|
||||
return detail::tquat<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());
|
||||
}
|
||||
else
|
||||
{
|
||||
T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z);
|
||||
T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w);
|
||||
T t = atan(Vec3Len, T(q.w)) / Vec3Len;
|
||||
return detail::tquat<T>(t * q.x, t * q.y, t * q.z, log(QuatLen));
|
||||
}
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> log
|
||||
(
|
||||
detail::tquat<T> const & q
|
||||
)
|
||||
{
|
||||
if((q.x == T(0)) && (q.y == T(0)) && (q.z == T(0)))
|
||||
{
|
||||
if(q.w > T(0))
|
||||
return detail::tquat<T>(log(q.w), T(0), T(0), T(0));
|
||||
else if(q.w < T(0))
|
||||
return detail::tquat<T>(log(-q.w), T(3.1415926535897932384626433832795), T(0),T(0));
|
||||
else
|
||||
return detail::tquat<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity());
|
||||
}
|
||||
else
|
||||
{
|
||||
T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z);
|
||||
T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w);
|
||||
T t = atan(Vec3Len, T(q.w)) / Vec3Len;
|
||||
return detail::tquat<T>(t * q.x, t * q.y, t * q.z, log(QuatLen));
|
||||
}
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> pow
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
T const & y
|
||||
)
|
||||
{
|
||||
if(abs(x.w) > T(0.9999))
|
||||
return x;
|
||||
float Angle = acos(y);
|
||||
float NewAngle = Angle * y;
|
||||
float Div = sin(NewAngle) / sin(Angle);
|
||||
return detail::tquat<T>(
|
||||
cos(NewAngle),
|
||||
x.x * Div,
|
||||
x.y * Div,
|
||||
x.z * Div);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> pow
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
T const & y
|
||||
)
|
||||
{
|
||||
if(abs(x.w) > T(0.9999))
|
||||
return x;
|
||||
float Angle = acos(y);
|
||||
float NewAngle = Angle * y;
|
||||
float Div = sin(NewAngle) / sin(Angle);
|
||||
return detail::tquat<T>(
|
||||
cos(NewAngle),
|
||||
x.x * Div,
|
||||
x.y * Div,
|
||||
x.z * Div);
|
||||
}
|
||||
|
||||
//template <typename T>
|
||||
//GLM_FUNC_QUALIFIER detail::tquat<T> sqrt
|
||||
//(
|
||||
// detail::tquat<T> const & q
|
||||
//)
|
||||
//{
|
||||
// T q0 = T(1) - dot(q, q);
|
||||
// return T(2) * (T(1) + q0) * q;
|
||||
//}
|
||||
//template <typename T>
|
||||
//GLM_FUNC_QUALIFIER detail::tquat<T> sqrt
|
||||
//(
|
||||
// detail::tquat<T> const & q
|
||||
//)
|
||||
//{
|
||||
// T q0 = T(1) - dot(q, q);
|
||||
// return T(2) * (T(1) + q0) * q;
|
||||
//}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotate
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotate
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
detail::tvec3<T> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotate
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
detail::tvec4<T> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotate
|
||||
(
|
||||
detail::tquat<T> const & q,
|
||||
detail::tvec4<T> const & v
|
||||
)
|
||||
{
|
||||
return q * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T angle
|
||||
(
|
||||
detail::tquat<T> const & x
|
||||
)
|
||||
{
|
||||
return glm::degrees(acos(x.w) * T(2));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T angle
|
||||
(
|
||||
detail::tquat<T> const & x
|
||||
)
|
||||
{
|
||||
return glm::degrees(acos(x.w) * T(2));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> axis
|
||||
(
|
||||
detail::tquat<T> const & x
|
||||
)
|
||||
{
|
||||
T tmp1 = T(1) - x.w * x.w;
|
||||
if(tmp1 <= T(0))
|
||||
return detail::tvec3<T>(0, 0, 1);
|
||||
T tmp2 = T(1) / sqrt(tmp1);
|
||||
return detail::tvec3<T>(x.x * tmp2, x.y * tmp2, x.z * tmp2);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> axis
|
||||
(
|
||||
detail::tquat<T> const & x
|
||||
)
|
||||
{
|
||||
T tmp1 = T(1) - x.w * x.w;
|
||||
if(tmp1 <= T(0))
|
||||
return detail::tvec3<T>(0, 0, 1);
|
||||
T tmp2 = T(1) / sqrt(tmp1);
|
||||
return detail::tvec3<T>(x.x * tmp2, x.y * tmp2, x.z * tmp2);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis
|
||||
(
|
||||
valType const & angle,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z
|
||||
)
|
||||
{
|
||||
return angleAxis(angle, detail::tvec3<valType>(x, y, z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis
|
||||
(
|
||||
valType const & angle,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z
|
||||
)
|
||||
{
|
||||
return angleAxis(angle, detail::tvec3<valType>(x, y, z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis
|
||||
(
|
||||
valType const & angle,
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tquat<valType> result;
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis
|
||||
(
|
||||
valType const & angle,
|
||||
detail::tvec3<valType> const & v
|
||||
)
|
||||
{
|
||||
detail::tquat<valType> result;
|
||||
|
||||
valType a = glm::radians(angle);
|
||||
valType s = glm::sin(a * valType(0.5));
|
||||
valType a = glm::radians(angle);
|
||||
valType s = glm::sin(a * valType(0.5));
|
||||
|
||||
result.w = glm::cos(a * valType(0.5));
|
||||
result.x = v.x * s;
|
||||
result.y = v.y * s;
|
||||
result.z = v.z * s;
|
||||
return result;
|
||||
}
|
||||
result.w = glm::cos(a * valType(0.5));
|
||||
result.x = v.x * s;
|
||||
result.y = v.y * s;
|
||||
result.z = v.z * s;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T extractRealComponent
|
||||
(
|
||||
detail::tquat<T> const & q
|
||||
)
|
||||
{
|
||||
T w = T(1.0) - q.x * q.x - q.y * q.y - q.z * q.z;
|
||||
if(w < T(0))
|
||||
return T(0);
|
||||
else
|
||||
return -sqrt(w);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T extractRealComponent
|
||||
(
|
||||
detail::tquat<T> const & q
|
||||
)
|
||||
{
|
||||
T w = T(1.0) - q.x * q.x - q.y * q.y - q.z * q.z;
|
||||
if(w < T(0))
|
||||
return T(0);
|
||||
else
|
||||
return -sqrt(w);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType roll
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType roll
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType pitch
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType pitch
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType yaw
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(asin(valType(-2) * (q.x * q.z - q.w * q.y)));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType yaw
|
||||
(
|
||||
detail::tquat<valType> const & q
|
||||
)
|
||||
{
|
||||
return glm::degrees(asin(valType(-2) * (q.x * q.z - q.w * q.y)));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> eularAngles
|
||||
(
|
||||
detail::tquat<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(pitch(x), yaw(x), roll(x));
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> eularAngles
|
||||
(
|
||||
detail::tquat<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(pitch(x), yaw(x), roll(x));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> shortMix
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
detail::tquat<T> const & y,
|
||||
T const & a
|
||||
)
|
||||
{
|
||||
if(a <= typename detail::tquat<T>::value_type(0)) return x;
|
||||
if(a >= typename detail::tquat<T>::value_type(1)) return y;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> shortMix
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
detail::tquat<T> const & y,
|
||||
T const & a
|
||||
)
|
||||
{
|
||||
if(a <= typename detail::tquat<T>::value_type(0)) return x;
|
||||
if(a >= typename detail::tquat<T>::value_type(1)) return y;
|
||||
|
||||
T fCos = dot(x, y);
|
||||
detail::tquat<T> y2(y); //BUG!!! tquat<T> y2;
|
||||
if(fCos < T(0))
|
||||
{
|
||||
y2 = -y;
|
||||
fCos = -fCos;
|
||||
}
|
||||
T fCos = dot(x, y);
|
||||
detail::tquat<T> y2(y); //BUG!!! tquat<T> y2;
|
||||
if(fCos < T(0))
|
||||
{
|
||||
y2 = -y;
|
||||
fCos = -fCos;
|
||||
}
|
||||
|
||||
//if(fCos > 1.0f) // problem
|
||||
T k0, k1;
|
||||
if(fCos > T(0.9999))
|
||||
{
|
||||
k0 = T(1) - a;
|
||||
k1 = T(0) + a; //BUG!!! 1.0f + a;
|
||||
}
|
||||
else
|
||||
{
|
||||
T fSin = sqrt(T(1) - fCos * fCos);
|
||||
T fAngle = atan(fSin, fCos);
|
||||
T fOneOverSin = T(1) / fSin;
|
||||
k0 = sin((T(1) - a) * fAngle) * fOneOverSin;
|
||||
k1 = sin((T(0) + a) * fAngle) * fOneOverSin;
|
||||
}
|
||||
//if(fCos > 1.0f) // problem
|
||||
T k0, k1;
|
||||
if(fCos > T(0.9999))
|
||||
{
|
||||
k0 = T(1) - a;
|
||||
k1 = T(0) + a; //BUG!!! 1.0f + a;
|
||||
}
|
||||
else
|
||||
{
|
||||
T fSin = sqrt(T(1) - fCos * fCos);
|
||||
T fAngle = atan(fSin, fCos);
|
||||
T fOneOverSin = T(1) / fSin;
|
||||
k0 = sin((T(1) - a) * fAngle) * fOneOverSin;
|
||||
k1 = sin((T(0) + a) * fAngle) * fOneOverSin;
|
||||
}
|
||||
|
||||
return detail::tquat<T>(
|
||||
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>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> fastMix
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
detail::tquat<T> const & y,
|
||||
T const & a
|
||||
)
|
||||
{
|
||||
return glm::normalize(x * (T(1) - a) + (y * a));
|
||||
}
|
||||
return detail::tquat<T>(
|
||||
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>
|
||||
GLM_FUNC_QUALIFIER detail::tquat<T> fastMix
|
||||
(
|
||||
detail::tquat<T> const & x,
|
||||
detail::tquat<T> const & y,
|
||||
T const & a
|
||||
)
|
||||
{
|
||||
return glm::normalize(x * (T(1) - a) + (y * a));
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -2,588 +2,181 @@
|
|||
// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Created : 2008-10-09
|
||||
// Updated : 2008-10-09
|
||||
// Updated : 2011-10-14
|
||||
// Licence : This source is under MIT License
|
||||
// File : glm/gtx/reciprocal.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
#include "../core/_vectorize.hpp"
|
||||
|
||||
// sec
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sec
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sec' only accept floating-point values");
|
||||
// sec
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sec
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sec' only accept floating-point values");
|
||||
|
||||
return genType(1) / glm::cos(angle);
|
||||
}
|
||||
return genType(1) / glm::cos(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> sec
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
sec(angle.x),
|
||||
sec(angle.y));
|
||||
}
|
||||
VECTORIZE_VEC(sec)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> sec
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
sec(angle.x),
|
||||
sec(angle.y),
|
||||
sec(angle.z));
|
||||
}
|
||||
// csc
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType csc
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csc' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> sec
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
sec(angle.x),
|
||||
sec(angle.y),
|
||||
sec(angle.z),
|
||||
sec(angle.w));
|
||||
}
|
||||
return genType(1) / glm::sin(angle);
|
||||
}
|
||||
|
||||
// csc
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType csc
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csc' only accept floating-point values");
|
||||
VECTORIZE_VEC(csc)
|
||||
|
||||
return genType(1) / glm::sin(angle);
|
||||
}
|
||||
// cot
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cot
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cot' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> csc
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
csc(angle.x),
|
||||
csc(angle.y));
|
||||
}
|
||||
return genType(1) / glm::tan(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> csc
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
csc(angle.x),
|
||||
csc(angle.y),
|
||||
csc(angle.z));
|
||||
}
|
||||
VECTORIZE_VEC(cot)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> csc
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
csc(angle.x),
|
||||
csc(angle.y),
|
||||
csc(angle.z),
|
||||
csc(angle.w));
|
||||
}
|
||||
|
||||
// cot
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType cot
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cot' only accept floating-point values");
|
||||
|
||||
return genType(1) / glm::tan(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> cot
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
cot(angle.x),
|
||||
cot(angle.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> cot
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
cot(angle.x),
|
||||
cot(angle.y),
|
||||
cot(angle.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> cot
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
cot(angle.x),
|
||||
cot(angle.y),
|
||||
cot(angle.z),
|
||||
cot(angle.w));
|
||||
}
|
||||
|
||||
// asec
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asec
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asec' only accept floating-point values");
|
||||
// asec
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asec
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asec' only accept floating-point values");
|
||||
|
||||
return acos(genType(1) / x);
|
||||
}
|
||||
return acos(genType(1) / x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> asec
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
asec(x.x),
|
||||
asec(x.y));
|
||||
}
|
||||
VECTORIZE_VEC(asec)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> asec
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
asec(x.x),
|
||||
asec(x.y),
|
||||
asec(x.z));
|
||||
}
|
||||
// acsc
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acsc
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsc' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> asec
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
asec(x.x),
|
||||
asec(x.y),
|
||||
asec(x.z),
|
||||
asec(x.w));
|
||||
}
|
||||
return asin(genType(1) / x);
|
||||
}
|
||||
|
||||
// acsc
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acsc
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsc' only accept floating-point values");
|
||||
VECTORIZE_VEC(acsc)
|
||||
|
||||
return asin(genType(1) / x);
|
||||
}
|
||||
// acot
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acot
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acot' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> acsc
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
acsc(x.x),
|
||||
acsc(x.y));
|
||||
}
|
||||
genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0);
|
||||
return pi_over_2 - atan(x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> acsc
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
acsc(x.x),
|
||||
acsc(x.y),
|
||||
acsc(x.z));
|
||||
}
|
||||
VECTORIZE_VEC(acot)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> acsc
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
acsc(x.x),
|
||||
acsc(x.y),
|
||||
acsc(x.z),
|
||||
acsc(x.w));
|
||||
}
|
||||
// sech
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sech
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sech' only accept floating-point values");
|
||||
|
||||
// acot
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acot
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acot' only accept floating-point values");
|
||||
return genType(1) / glm::cosh(angle);
|
||||
}
|
||||
|
||||
genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0);
|
||||
return pi_over_2 - atan(x);
|
||||
}
|
||||
VECTORIZE_VEC(sech)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> acot
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
acot(x.x),
|
||||
acot(x.y));
|
||||
}
|
||||
// csch
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType csch
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csch' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> acot
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
acot(x.x),
|
||||
acot(x.y),
|
||||
acot(x.z));
|
||||
}
|
||||
return genType(1) / glm::sinh(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> acot
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
acot(x.x),
|
||||
acot(x.y),
|
||||
acot(x.z),
|
||||
acot(x.w));
|
||||
}
|
||||
VECTORIZE_VEC(csch)
|
||||
|
||||
// sech
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sech
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sech' only accept floating-point values");
|
||||
// coth
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType coth
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'coth' only accept floating-point values");
|
||||
|
||||
return genType(1) / glm::cosh(angle);
|
||||
}
|
||||
return glm::cosh(angle) / glm::sinh(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> sech
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
sech(angle.x),
|
||||
sech(angle.y));
|
||||
}
|
||||
VECTORIZE_VEC(coth)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> sech
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
sech(angle.x),
|
||||
sech(angle.y),
|
||||
sech(angle.z));
|
||||
}
|
||||
// asech
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asech
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asech' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> sech
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
sech(angle.x),
|
||||
sech(angle.y),
|
||||
sech(angle.z),
|
||||
sech(angle.w));
|
||||
}
|
||||
return acosh(genType(1) / x);
|
||||
}
|
||||
|
||||
// csch
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType csch
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csch' only accept floating-point values");
|
||||
VECTORIZE_VEC(asech)
|
||||
|
||||
return genType(1) / glm::sinh(angle);
|
||||
}
|
||||
// acsch
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acsch
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsch' only accept floating-point values");
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> csch
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
csch(angle.x),
|
||||
csch(angle.y));
|
||||
}
|
||||
return asinh(genType(1) / x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> csch
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
csch(angle.x),
|
||||
csch(angle.y),
|
||||
csch(angle.z));
|
||||
}
|
||||
VECTORIZE_VEC(acsch)
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> csch
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
csch(angle.x),
|
||||
csch(angle.y),
|
||||
csch(angle.z),
|
||||
csch(angle.w));
|
||||
}
|
||||
// acoth
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acoth
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acoth' only accept floating-point values");
|
||||
|
||||
// coth
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType coth
|
||||
(
|
||||
genType const & angle
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'coth' only accept floating-point values");
|
||||
|
||||
return glm::cosh(angle) / glm::sinh(angle);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> coth
|
||||
(
|
||||
detail::tvec2<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
coth(angle.x),
|
||||
coth(angle.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> coth
|
||||
(
|
||||
detail::tvec3<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
coth(angle.x),
|
||||
coth(angle.y),
|
||||
coth(angle.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> coth
|
||||
(
|
||||
detail::tvec4<valType> const & angle
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
coth(angle.x),
|
||||
coth(angle.y),
|
||||
coth(angle.z),
|
||||
coth(angle.w));
|
||||
}
|
||||
|
||||
// asech
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType asech
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asech' only accept floating-point values");
|
||||
|
||||
return acosh(genType(1) / x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> asech
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
asech(x.x),
|
||||
asech(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> asech
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
asech(x.x),
|
||||
asech(x.y),
|
||||
asech(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> asech
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
asech(x.x),
|
||||
asech(x.y),
|
||||
asech(x.z),
|
||||
asech(x.w));
|
||||
}
|
||||
|
||||
// acsch
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acsch
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsch' only accept floating-point values");
|
||||
|
||||
return asinh(genType(1) / x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> acsch
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
acsch(x.x),
|
||||
acsch(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> acsch
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
acsch(x.x),
|
||||
acsch(x.y),
|
||||
acsch(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> acsch
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
acsch(x.x),
|
||||
acsch(x.y),
|
||||
acsch(x.z),
|
||||
acsch(x.w));
|
||||
}
|
||||
|
||||
// acoth
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType acoth
|
||||
(
|
||||
genType const & x
|
||||
)
|
||||
{
|
||||
GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acoth' only accept floating-point values");
|
||||
|
||||
return atanh(genType(1) / x);
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<valType> acoth
|
||||
(
|
||||
detail::tvec2<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec2<valType>(
|
||||
acoth(x.x),
|
||||
acoth(x.y));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<valType> acoth
|
||||
(
|
||||
detail::tvec3<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec3<valType>(
|
||||
acoth(x.x),
|
||||
acoth(x.y),
|
||||
acoth(x.z));
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<valType> acoth
|
||||
(
|
||||
detail::tvec4<valType> const & x
|
||||
)
|
||||
{
|
||||
return detail::tvec4<valType>(
|
||||
acoth(x.x),
|
||||
acoth(x.y),
|
||||
acoth(x.z),
|
||||
acoth(x.w));
|
||||
}
|
||||
return atanh(genType(1) / x);
|
||||
}
|
||||
|
||||
VECTORIZE_VEC(acoth)
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,139 +7,158 @@
|
|||
// File : glm/gtx/rotate_vector.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> rotate(
|
||||
detail::tvec2<T> const & v,
|
||||
T const & angle)
|
||||
namespace glm
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> rotate
|
||||
(
|
||||
detail::tvec2<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
T const Cos = cos(radians(angle));
|
||||
T const Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotate(
|
||||
const detail::tvec3<T> & v,
|
||||
T const & angle,
|
||||
const detail::tvec3<T> & normal)
|
||||
{
|
||||
return detail::tmat3x3<T>(glm::rotate(angle, normal)) * v;
|
||||
}
|
||||
/*
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateGTX(
|
||||
const detail::tvec3<T>& x,
|
||||
T angle,
|
||||
const detail::tvec3<T>& 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotate(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & normal)
|
||||
{
|
||||
return rotate(angle, normal) * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotate
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & normal
|
||||
)
|
||||
{
|
||||
return detail::tmat3x3<T>(glm::rotate(angle, normal)) * v;
|
||||
}
|
||||
/*
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateGTX(
|
||||
const detail::tvec3<T>& x,
|
||||
T angle,
|
||||
const detail::tvec3<T>& 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>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotate
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle,
|
||||
detail::tvec3<T> const & normal
|
||||
)
|
||||
{
|
||||
return rotate(angle, normal) * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateX(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.y = v.y * Cos - v.z * Sin;
|
||||
Result.z = v.y * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateX
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.y = v.y * Cos - v.z * Sin;
|
||||
Result.z = v.y * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateY(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos + v.z * Sin;
|
||||
Result.z = -v.x * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateY
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos + v.z * Sin;
|
||||
Result.z = -v.x * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateZ(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> rotateZ
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateX(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.y = v.y * Cos - v.z * Sin;
|
||||
Result.z = v.y * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateX
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.y = v.y * Cos - v.z * Sin;
|
||||
Result.z = v.y * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateY(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos + v.z * Sin;
|
||||
Result.z = -v.x * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateY
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos + v.z * Sin;
|
||||
Result.z = -v.x * Sin + v.z * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateZ(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> rotateZ
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & angle
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result = v;
|
||||
const T Cos = cos(radians(angle));
|
||||
const T Sin = sin(radians(angle));
|
||||
Result.x = v.x * Cos - v.y * Sin;
|
||||
Result.y = v.x * Sin + v.y * Cos;
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> orientation(
|
||||
detail::tvec3<T> const & Normal,
|
||||
detail::tvec3<T> const & Up)
|
||||
{
|
||||
if(all(equal(Normal, Up)))
|
||||
return detail::tmat4x4<T>(T(1));
|
||||
|
||||
detail::tvec3<T> RotationAxis = cross(Up, Normal);
|
||||
T Angle = degrees(acos(dot(Normal, Up)));
|
||||
return rotate(Angle, RotationAxis);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> orientation
|
||||
(
|
||||
detail::tvec3<T> const & Normal,
|
||||
detail::tvec3<T> const & Up
|
||||
)
|
||||
{
|
||||
if(all(equal(Normal, Up)))
|
||||
return detail::tmat4x4<T>(T(1));
|
||||
|
||||
detail::tvec3<T> RotationAxis = cross(Up, Normal);
|
||||
T Angle = degrees(acos(dot(Normal, Up)));
|
||||
return rotate(Angle, RotationAxis);
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,149 +7,148 @@
|
|||
// File : glm/gtx/transform2.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearX2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
T s)
|
||||
namespace glm
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][1] = s;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearX2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
T s)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][1] = s;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearY2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
T s)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[1][0] = s;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearY2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
T s)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[1][0] = s;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearX3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[1][0] = s;
|
||||
r[2][0] = t;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearX3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[1][0] = s;
|
||||
r[2][0] = t;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearY3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][1] = s;
|
||||
r[2][1] = t;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearY3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][1] = s;
|
||||
r[2][1] = t;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearZ3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][2] = s;
|
||||
r[1][2] = t;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearZ3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T s,
|
||||
T t)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][2] = s;
|
||||
r[1][2] = t;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> reflect2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][0] = 1 - 2 * normal.x * normal.x;
|
||||
r[0][1] = -2 * normal.x * normal.y;
|
||||
r[1][0] = -2 * normal.x * normal.y;
|
||||
r[1][1] = 1 - 2 * normal.y * normal.y;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> reflect2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][0] = 1 - 2 * normal.x * normal.x;
|
||||
r[0][1] = -2 * normal.x * normal.y;
|
||||
r[1][0] = -2 * normal.x * normal.y;
|
||||
r[1][1] = 1 - 2 * normal.y * normal.y;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> reflect3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][0] = 1 - 2 * normal.x * normal.x;
|
||||
r[0][1] = -2 * normal.x * normal.y;
|
||||
r[0][2] = -2 * normal.x * normal.z;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> reflect3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][0] = 1 - 2 * normal.x * normal.x;
|
||||
r[0][1] = -2 * normal.x * normal.y;
|
||||
r[0][2] = -2 * normal.x * normal.z;
|
||||
|
||||
r[1][0] = -2 * normal.x * normal.y;
|
||||
r[1][1] = 1 - 2 * normal.y * normal.y;
|
||||
r[1][2] = -2 * normal.y * normal.z;
|
||||
r[1][0] = -2 * normal.x * normal.y;
|
||||
r[1][1] = 1 - 2 * normal.y * normal.y;
|
||||
r[1][2] = -2 * normal.y * normal.z;
|
||||
|
||||
r[2][0] = -2 * normal.x * normal.z;
|
||||
r[2][1] = -2 * normal.y * normal.z;
|
||||
r[2][2] = 1 - 2 * normal.z * normal.z;
|
||||
return m * r;
|
||||
}
|
||||
r[2][0] = -2 * normal.x * normal.z;
|
||||
r[2][1] = -2 * normal.y * normal.z;
|
||||
r[2][2] = 1 - 2 * normal.z * normal.z;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> proj2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][0] = 1 - normal.x * normal.x;
|
||||
r[0][1] = - normal.x * normal.y;
|
||||
r[1][0] = - normal.x * normal.y;
|
||||
r[1][1] = 1 - normal.y * normal.y;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> proj2D(
|
||||
const detail::tmat3x3<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat3x3<T> r(1);
|
||||
r[0][0] = 1 - normal.x * normal.x;
|
||||
r[0][1] = - normal.x * normal.y;
|
||||
r[1][0] = - normal.x * normal.y;
|
||||
r[1][1] = 1 - normal.y * normal.y;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> proj3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][0] = 1 - normal.x * normal.x;
|
||||
r[0][1] = - normal.x * normal.y;
|
||||
r[0][2] = - normal.x * normal.z;
|
||||
r[1][0] = - normal.x * normal.y;
|
||||
r[1][1] = 1 - normal.y * normal.y;
|
||||
r[1][2] = - normal.y * normal.z;
|
||||
r[2][0] = - normal.x * normal.z;
|
||||
r[2][1] = - normal.y * normal.z;
|
||||
r[2][2] = 1 - normal.z * normal.z;
|
||||
return m * r;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> proj3D(
|
||||
const detail::tmat4x4<T>& m,
|
||||
const detail::tvec3<T>& normal)
|
||||
{
|
||||
detail::tmat4x4<T> r(1);
|
||||
r[0][0] = 1 - normal.x * normal.x;
|
||||
r[0][1] = - normal.x * normal.y;
|
||||
r[0][2] = - normal.x * normal.z;
|
||||
r[1][0] = - normal.x * normal.y;
|
||||
r[1][1] = 1 - normal.y * normal.y;
|
||||
r[1][2] = - normal.y * normal.z;
|
||||
r[2][0] = - normal.x * normal.z;
|
||||
r[2][1] = - normal.y * normal.z;
|
||||
r[2][2] = 1 - normal.z * normal.z;
|
||||
return m * r;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias(
|
||||
T scale,
|
||||
T bias)
|
||||
{
|
||||
detail::tmat4x4<T> result;
|
||||
result[3] = detail::tvec4<T>(detail::tvec3<T>(bias), T(1));
|
||||
result[0][0] = scale;
|
||||
result[1][1] = scale;
|
||||
result[2][2] = scale;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T scale,
|
||||
T bias)
|
||||
{
|
||||
return m * scaleBias(scale, bias);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias(
|
||||
T scale,
|
||||
T bias)
|
||||
{
|
||||
detail::tmat4x4<T> result;
|
||||
result[3] = detail::tvec4<T>(detail::tvec3<T>(bias), T(1));
|
||||
result[0][0] = scale;
|
||||
result[1][1] = scale;
|
||||
result[2][2] = scale;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias(
|
||||
const detail::tmat4x4<T>& m,
|
||||
T scale,
|
||||
T bias)
|
||||
{
|
||||
return m * scaleBias(scale, bias);
|
||||
}
|
||||
}//namespace glm
|
||||
|
||||
|
|
343
glm/gtx/ulp.inl
343
glm/gtx/ulp.inl
|
@ -42,34 +42,34 @@ typedef union
|
|||
} ieee_double_shape_type;
|
||||
|
||||
#define GLM_EXTRACT_WORDS(ix0,ix1,d) \
|
||||
do { \
|
||||
ieee_double_shape_type ew_u; \
|
||||
ew_u.value = (d); \
|
||||
(ix0) = ew_u.parts.msw; \
|
||||
(ix1) = ew_u.parts.lsw; \
|
||||
} while (0)
|
||||
do { \
|
||||
ieee_double_shape_type ew_u; \
|
||||
ew_u.value = (d); \
|
||||
(ix0) = ew_u.parts.msw; \
|
||||
(ix1) = ew_u.parts.lsw; \
|
||||
} while (0)
|
||||
|
||||
#define GLM_GET_FLOAT_WORD(i,d) \
|
||||
do { \
|
||||
ieee_float_shape_type gf_u; \
|
||||
gf_u.value = (d); \
|
||||
(i) = gf_u.word; \
|
||||
} while (0)
|
||||
do { \
|
||||
ieee_float_shape_type gf_u; \
|
||||
gf_u.value = (d); \
|
||||
(i) = gf_u.word; \
|
||||
} while (0)
|
||||
|
||||
#define GLM_SET_FLOAT_WORD(d,i) \
|
||||
do { \
|
||||
ieee_float_shape_type sf_u; \
|
||||
sf_u.word = (i); \
|
||||
(d) = sf_u.value; \
|
||||
} while (0)
|
||||
do { \
|
||||
ieee_float_shape_type sf_u; \
|
||||
sf_u.word = (i); \
|
||||
(d) = sf_u.value; \
|
||||
} while (0)
|
||||
|
||||
#define GLM_INSERT_WORDS(d,ix0,ix1) \
|
||||
do { \
|
||||
ieee_double_shape_type iw_u; \
|
||||
iw_u.parts.msw = (ix0); \
|
||||
iw_u.parts.lsw = (ix1); \
|
||||
(d) = iw_u.value; \
|
||||
} while (0)
|
||||
do { \
|
||||
ieee_double_shape_type iw_u; \
|
||||
iw_u.parts.msw = (ix0); \
|
||||
iw_u.parts.lsw = (ix1); \
|
||||
(d) = iw_u.value; \
|
||||
} while (0)
|
||||
|
||||
namespace glm{
|
||||
namespace detail
|
||||
|
@ -181,218 +181,119 @@ namespace detail
|
|||
# define GLM_NEXT_AFTER_DBL(x, toward) nextafter((x), (toward))
|
||||
#endif
|
||||
|
||||
namespace glm{
|
||||
|
||||
GLM_FUNC_QUALIFIER float next_float(float const & x)
|
||||
namespace glm
|
||||
{
|
||||
return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::max());
|
||||
}
|
||||
GLM_FUNC_QUALIFIER float next_float(float const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::max());
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER double next_float(double const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::max());
|
||||
}
|
||||
GLM_FUNC_QUALIFIER double next_float(double const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::max());
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = next_float(x[i]);
|
||||
return Result;
|
||||
}
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = next_float(x[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER float prev_float(float const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::min());
|
||||
}
|
||||
GLM_FUNC_QUALIFIER float prev_float(float const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::min());
|
||||
}
|
||||
|
||||
GLM_FUNC_QUALIFIER double prev_float(double const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::min());
|
||||
}
|
||||
GLM_FUNC_QUALIFIER double prev_float(double const & x)
|
||||
{
|
||||
return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::min());
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = prev_float(x[i]);
|
||||
return Result;
|
||||
}
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = prev_float(x[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps)
|
||||
{
|
||||
T temp = x;
|
||||
for(std::size_t i = 0; i < ulps; ++i)
|
||||
temp = next_float(temp);
|
||||
return temp;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps)
|
||||
{
|
||||
T temp = x;
|
||||
for(std::size_t i = 0; i < ulps; ++i)
|
||||
temp = next_float(temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x, vecType<uint> const & ulps)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = next_float(x[i], ulps[i]);
|
||||
return Result;
|
||||
}
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x, vecType<uint> const & ulps)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = next_float(x[i], ulps[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps)
|
||||
{
|
||||
T temp = x;
|
||||
for(std::size_t i = 0; i < ulps; ++i)
|
||||
temp = prev_float(temp);
|
||||
return temp;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps)
|
||||
{
|
||||
T temp = x;
|
||||
for(std::size_t i = 0; i < ulps; ++i)
|
||||
temp = prev_float(temp);
|
||||
return temp;
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x, vecType<uint> const & ulps)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = prev_float(x[i], ulps[i]);
|
||||
return Result;
|
||||
}
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x, vecType<uint> const & ulps)
|
||||
{
|
||||
vecType<T> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = prev_float(x[i], ulps[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y)
|
||||
{
|
||||
uint ulp = 0;
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y)
|
||||
{
|
||||
uint ulp = 0;
|
||||
|
||||
if(x < y)
|
||||
{
|
||||
T temp = x;
|
||||
while(temp != y && ulp < std::numeric_limits<std::size_t>::max())
|
||||
{
|
||||
++ulp;
|
||||
temp = next_float(temp);
|
||||
}
|
||||
}
|
||||
else if(y < x)
|
||||
{
|
||||
T temp = y;
|
||||
while(temp != x && ulp < std::numeric_limits<std::size_t>::max())
|
||||
{
|
||||
++ulp;
|
||||
temp = next_float(temp);
|
||||
}
|
||||
}
|
||||
else // ==
|
||||
{
|
||||
if(x < y)
|
||||
{
|
||||
T temp = x;
|
||||
while(temp != y && ulp < std::numeric_limits<std::size_t>::max())
|
||||
{
|
||||
++ulp;
|
||||
temp = next_float(temp);
|
||||
}
|
||||
}
|
||||
else if(y < x)
|
||||
{
|
||||
T temp = y;
|
||||
while(temp != x && ulp < std::numeric_limits<std::size_t>::max())
|
||||
{
|
||||
++ulp;
|
||||
temp = next_float(temp);
|
||||
}
|
||||
}
|
||||
else // ==
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return ulp;
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<uint> float_distance(vecType<T> const & x, vecType<T> const & y)
|
||||
{
|
||||
vecType<uint> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = float_distance(x[i], y[i]);
|
||||
return Result;
|
||||
}
|
||||
/*
|
||||
inline std::size_t ulp
|
||||
(
|
||||
detail::thalf const & a,
|
||||
detail::thalf const & b
|
||||
)
|
||||
{
|
||||
std::size_t Count = 0;
|
||||
float TempA(a);
|
||||
float TempB(b);
|
||||
//while((TempA = _nextafterf(TempA, TempB)) != TempB)
|
||||
++Count;
|
||||
return Count;
|
||||
}
|
||||
|
||||
inline std::size_t ulp
|
||||
(
|
||||
float const & a,
|
||||
float const & b
|
||||
)
|
||||
{
|
||||
std::size_t Count = 0;
|
||||
float Temp = a;
|
||||
//while((Temp = _nextafterf(Temp, b)) != b)
|
||||
{
|
||||
std::cout << Temp << " " << b << std::endl;
|
||||
++Count;
|
||||
}
|
||||
return Count;
|
||||
}
|
||||
|
||||
inline std::size_t ulp
|
||||
(
|
||||
double const & a,
|
||||
double const & b
|
||||
)
|
||||
{
|
||||
std::size_t Count = 0;
|
||||
double Temp = a;
|
||||
//while((Temp = _nextafter(Temp, b)) != b)
|
||||
{
|
||||
std::cout << Temp << " " << b << std::endl;
|
||||
++Count;
|
||||
}
|
||||
return Count;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline std::size_t ulp
|
||||
(
|
||||
detail::tvec2<T> const & a,
|
||||
detail::tvec2<T> const & b
|
||||
)
|
||||
{
|
||||
std::size_t ulps[] =
|
||||
{
|
||||
ulp(a[0], b[0]),
|
||||
ulp(a[1], b[1])
|
||||
};
|
||||
|
||||
return glm::max(ulps[0], ulps[1]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline std::size_t ulp
|
||||
(
|
||||
detail::tvec3<T> const & a,
|
||||
detail::tvec3<T> const & b
|
||||
)
|
||||
{
|
||||
std::size_t ulps[] =
|
||||
{
|
||||
ulp(a[0], b[0]),
|
||||
ulp(a[1], b[1]),
|
||||
ulp(a[2], b[2])
|
||||
};
|
||||
|
||||
return glm::max(glm::max(ulps[0], ulps[1]), ulps[2]);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline std::size_t ulp
|
||||
(
|
||||
detail::tvec4<T> const & a,
|
||||
detail::tvec4<T> const & b
|
||||
)
|
||||
{
|
||||
std::size_t ulps[] =
|
||||
{
|
||||
ulp(a[0], b[0]),
|
||||
ulp(a[1], b[1]),
|
||||
ulp(a[2], b[2]),
|
||||
ulp(a[3], b[3])
|
||||
};
|
||||
|
||||
return glm::max(glm::max(ulps[0], ulps[1]), glm::max(ulps[2], ulps[3]));
|
||||
}
|
||||
*/
|
||||
return ulp;
|
||||
}
|
||||
|
||||
template<typename T, template<typename> class vecType>
|
||||
GLM_FUNC_QUALIFIER vecType<uint> float_distance(vecType<T> const & x, vecType<T> const & y)
|
||||
{
|
||||
vecType<uint> Result;
|
||||
for(std::size_t i = 0; i < Result.length(); ++i)
|
||||
Result[i] = float_distance(x[i], y[i]);
|
||||
return Result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
// File : glm/gtx/unsigned_int.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
namespace glm
|
||||
{
|
||||
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,48 +7,47 @@
|
|||
// File : glm/gtx/vector_access.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec2<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec2<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y
|
||||
)
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec3<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z
|
||||
)
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
v.z = z;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec4<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z,
|
||||
valType const & w
|
||||
)
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
v.z = z;
|
||||
v.w = w;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec3<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z
|
||||
)
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
v.z = z;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER void set
|
||||
(
|
||||
detail::tvec4<valType>& v,
|
||||
valType const & x,
|
||||
valType const & y,
|
||||
valType const & z,
|
||||
valType const & w
|
||||
)
|
||||
{
|
||||
v.x = x;
|
||||
v.y = y;
|
||||
v.z = z;
|
||||
v.w = w;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,48 +7,47 @@
|
|||
// File : glm/gtx/vector_angle.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type angle
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return degrees(acos(dot(x, y)));
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER typename genType::value_type angle
|
||||
(
|
||||
genType const & x,
|
||||
genType const & y
|
||||
)
|
||||
{
|
||||
return degrees(acos(dot(x, y)));
|
||||
}
|
||||
|
||||
//! \todo epsilon is hard coded to 0.01
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType orientedAngle
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
valType Angle = glm::degrees(acos(dot(x, y)));
|
||||
detail::tvec2<valType> TransformedVector = glm::rotate(x, Angle);
|
||||
if(all(equalEpsilon(y, TransformedVector, valType(0.01))))
|
||||
return Angle;
|
||||
else
|
||||
return -Angle;
|
||||
}
|
||||
//! \todo epsilon is hard coded to 0.01
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType orientedAngle
|
||||
(
|
||||
detail::tvec2<valType> const & x,
|
||||
detail::tvec2<valType> const & y
|
||||
)
|
||||
{
|
||||
valType Angle = glm::degrees(acos(dot(x, y)));
|
||||
detail::tvec2<valType> TransformedVector = glm::rotate(x, Angle);
|
||||
if(all(equalEpsilon(y, TransformedVector, valType(0.01))))
|
||||
return Angle;
|
||||
else
|
||||
return -Angle;
|
||||
}
|
||||
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType orientedAngle
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & ref
|
||||
)
|
||||
{
|
||||
valType Angle = glm::degrees(glm::acos(glm::dot(x, y)));
|
||||
|
||||
if(glm::dot(ref, glm::cross(x, y)) < valType(0))
|
||||
return -Angle;
|
||||
else
|
||||
return Angle;
|
||||
}
|
||||
template <typename valType>
|
||||
GLM_FUNC_QUALIFIER valType orientedAngle
|
||||
(
|
||||
detail::tvec3<valType> const & x,
|
||||
detail::tvec3<valType> const & y,
|
||||
detail::tvec3<valType> const & ref
|
||||
)
|
||||
{
|
||||
valType Angle = glm::degrees(glm::acos(glm::dot(x, y)));
|
||||
|
||||
if(glm::dot(ref, glm::cross(x, y)) < valType(0))
|
||||
return -Angle;
|
||||
else
|
||||
return Angle;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -12,159 +12,158 @@
|
|||
|
||||
#include <cassert>
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec2<T> const & v0,
|
||||
detail::tvec2<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return length(cross(detail::tvec3<T>(v0, T(0)), detail::tvec3<T>(v1, T(0)))) < epsilon;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec2<T> const & v0,
|
||||
detail::tvec2<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return length(cross(detail::tvec3<T>(v0, T(0)), detail::tvec3<T>(v1, T(0)))) < epsilon;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec3<T> const & v0,
|
||||
detail::tvec3<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return length(cross(v0, v1)) < epsilon;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec3<T> const & v0,
|
||||
detail::tvec3<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return length(cross(v0, v1)) < epsilon;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec4<T> const & v0,
|
||||
detail::tvec4<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return length(cross(detail::tvec3<T>(v0), detail::tvec3<T>(v1))) < epsilon;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool areCollinear
|
||||
(
|
||||
detail::tvec4<T> const & v0,
|
||||
detail::tvec4<T> const & v1,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return length(cross(detail::tvec3<T>(v0), detail::tvec3<T>(v1))) < epsilon;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOpposite
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
assert(isNormalized(v0) && isNormalized(v1));
|
||||
return((typename genType::value_type(1) + dot(v0, v1)) <= epsilon);
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOpposite
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
assert(isNormalized(v0) && isNormalized(v1));
|
||||
return((typename genType::value_type(1) + dot(v0, v1)) <= epsilon);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOrthogonal
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(dot(v0, v1)) <= max(
|
||||
typename genType::value_type(1),
|
||||
length(v0)) * max(
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOrthogonal
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(dot(v0, v1)) <= max(
|
||||
typename genType::value_type(1),
|
||||
length(v1)) * epsilon;
|
||||
}
|
||||
length(v0)) * max(
|
||||
typename genType::value_type(1),
|
||||
length(v1)) * epsilon;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized
|
||||
(
|
||||
genType const & v,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(length(v) - typename genType::value_type(1)) <= typename genType::value_type(2) * epsilon;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isNormalized
|
||||
(
|
||||
genType const & v,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(length(v) - typename genType::value_type(1)) <= typename genType::value_type(2) * epsilon;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isNull
|
||||
(
|
||||
genType const & v,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return length(v) <= epsilon;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool isNull
|
||||
(
|
||||
genType const & v,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return length(v) <= epsilon;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool isCompNull
|
||||
(
|
||||
T const & s,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(s) < epsilon;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER bool isCompNull
|
||||
(
|
||||
T const & s,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return abs(s) < epsilon;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isCompNull
|
||||
(
|
||||
detail::tvec2<T> const & v,
|
||||
T const & epsilon)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
(abs(v.x) < epsilon),
|
||||
(abs(v.y) < epsilon));
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<bool> isCompNull
|
||||
(
|
||||
detail::tvec2<T> const & v,
|
||||
T const & epsilon)
|
||||
{
|
||||
return detail::tvec2<bool>(
|
||||
(abs(v.x) < epsilon),
|
||||
(abs(v.y) < epsilon));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isCompNull
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(v.x) < epsilon,
|
||||
abs(v.y) < epsilon,
|
||||
abs(v.z) < epsilon);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<bool> isCompNull
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec3<bool>(
|
||||
abs(v.x) < epsilon,
|
||||
abs(v.y) < epsilon,
|
||||
abs(v.z) < epsilon);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isCompNull
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(v.x) < epsilon,
|
||||
abs(v.y) < epsilon,
|
||||
abs(v.z) < epsilon,
|
||||
abs(v.w) < epsilon);
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<bool> isCompNull
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
T const & epsilon
|
||||
)
|
||||
{
|
||||
return detail::tvec4<bool>(
|
||||
abs(v.x) < epsilon,
|
||||
abs(v.y) < epsilon,
|
||||
abs(v.z) < epsilon,
|
||||
abs(v.w) < epsilon);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOrthonormal
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areSimilar
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
bool similar = true;
|
||||
for(typename genType::size_type i = 0; similar && i < genType::value_size(); i++)
|
||||
similar = (abs(v0[i] - v1[i]) <= epsilon);
|
||||
return similar;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areOrthonormal
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon);
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER bool areSimilar
|
||||
(
|
||||
genType const & v0,
|
||||
genType const & v1,
|
||||
typename genType::value_type const & epsilon
|
||||
)
|
||||
{
|
||||
bool similar = true;
|
||||
for(typename genType::size_type i = 0; similar && i < genType::value_size(); i++)
|
||||
similar = (abs(v0[i] - v1[i]) <= epsilon);
|
||||
return similar;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
|
@ -7,119 +7,118 @@
|
|||
// File : glm/gtx/verbose_operator.inl
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType add(genType const & a, genType const & b)
|
||||
namespace glm
|
||||
{
|
||||
return a + b;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType add(genType const & a, genType const & b)
|
||||
{
|
||||
return a + b;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sub(genType const & a, genType const & b)
|
||||
{
|
||||
return a - b;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType sub(genType const & a, genType const & b)
|
||||
{
|
||||
return a - b;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> mul
|
||||
(
|
||||
detail::tmat2x2<T> const & a,
|
||||
detail::tmat2x2<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat2x2<T> mul
|
||||
(
|
||||
detail::tmat2x2<T> const & a,
|
||||
detail::tmat2x2<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> mul
|
||||
(
|
||||
detail::tmat3x3<T> const & a,
|
||||
detail::tmat3x3<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat3x3<T> mul
|
||||
(
|
||||
detail::tmat3x3<T> const & a,
|
||||
detail::tmat3x3<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> mul
|
||||
(
|
||||
detail::tmat4x4<T> const & a,
|
||||
detail::tmat4x4<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tmat4x4<T> mul
|
||||
(
|
||||
detail::tmat4x4<T> const & a,
|
||||
detail::tmat4x4<T> const & b
|
||||
)
|
||||
{
|
||||
return a * b;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mul
|
||||
(
|
||||
detail::tmat2x2<T> const & m,
|
||||
detail::tvec2<T> const & v
|
||||
)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mul
|
||||
(
|
||||
detail::tmat2x2<T> const & m,
|
||||
detail::tvec2<T> const & v
|
||||
)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mul
|
||||
(
|
||||
detail::tmat3x3<T> const & m,
|
||||
detail::tvec3<T> const & v)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mul
|
||||
(
|
||||
detail::tmat3x3<T> const & m,
|
||||
detail::tvec3<T> const & v)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mul
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec4<T> const & v
|
||||
)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mul
|
||||
(
|
||||
detail::tmat4x4<T> const & m,
|
||||
detail::tvec4<T> const & v
|
||||
)
|
||||
{
|
||||
return m * v;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mul
|
||||
(
|
||||
detail::tvec2<T> const & v,
|
||||
detail::tmat2x2<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mul
|
||||
(
|
||||
detail::tvec2<T> const & v,
|
||||
detail::tmat2x2<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mul
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
detail::tmat3x3<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mul
|
||||
(
|
||||
detail::tvec3<T> const & v,
|
||||
detail::tmat3x3<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mul
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
detail::tmat4x4<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mul
|
||||
(
|
||||
detail::tvec4<T> const & v,
|
||||
detail::tmat4x4<T> const & m
|
||||
)
|
||||
{
|
||||
return v * m;
|
||||
}
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType div(genType const & a, genType const & b)
|
||||
{
|
||||
return a / b;
|
||||
}
|
||||
|
||||
template <typename genTypeT, typename genTypeU, typename genTypeV>
|
||||
GLM_FUNC_QUALIFIER genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c)
|
||||
{
|
||||
return a * b + c;
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType div(genType const & a, genType const & b)
|
||||
{
|
||||
return a / b;
|
||||
}
|
||||
|
||||
template <typename genTypeT, typename genTypeU, typename genTypeV>
|
||||
GLM_FUNC_QUALIFIER genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c)
|
||||
{
|
||||
return a * b + c;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
275
glm/gtx/wrap.inl
275
glm/gtx/wrap.inl
|
@ -10,157 +10,156 @@
|
|||
// - GLM core
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace glm{
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType clamp
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
namespace glm
|
||||
{
|
||||
return glm::clamp(Texcoord, genType(0), genType(1));
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType clamp
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
{
|
||||
return glm::clamp(Texcoord, genType(0), genType(1));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> clamp
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> clamp
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> clamp
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> clamp
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> clamp
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> clamp
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = clamp(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
// repeat
|
||||
////////////////////////
|
||||
// repeat
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType repeat
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
{
|
||||
return glm::fract(Texcoord);
|
||||
}
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType repeat
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
{
|
||||
return glm::fract(Texcoord);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> repeat
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> repeat
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> repeat
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> repeat
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> repeat
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> repeat
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = repeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
////////////////////////
|
||||
// mirrorRepeat
|
||||
////////////////////////
|
||||
// mirrorRepeat
|
||||
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType mirrorRepeat
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
{
|
||||
genType const Clamp = genType(int(glm::floor(Texcoord)) % 2);
|
||||
genType const Floor = glm::floor(Texcoord);
|
||||
genType const Rest = Texcoord - Floor;
|
||||
genType const Mirror = Clamp + Rest;
|
||||
template <typename genType>
|
||||
GLM_FUNC_QUALIFIER genType mirrorRepeat
|
||||
(
|
||||
genType const & Texcoord
|
||||
)
|
||||
{
|
||||
genType const Clamp = genType(int(glm::floor(Texcoord)) % 2);
|
||||
genType const Floor = glm::floor(Texcoord);
|
||||
genType const Rest = Texcoord - Floor;
|
||||
genType const Mirror = Clamp + Rest;
|
||||
|
||||
genType Out;
|
||||
if(Mirror >= genType(1))
|
||||
Out = genType(1) - Rest;
|
||||
else
|
||||
Out = Rest;
|
||||
return Out;
|
||||
}
|
||||
genType Out;
|
||||
if(Mirror >= genType(1))
|
||||
Out = genType(1) - Rest;
|
||||
else
|
||||
Out = Rest;
|
||||
return Out;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec2<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec2<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec2<T> Result;
|
||||
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec3<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec3<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec3<T> Result;
|
||||
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
GLM_FUNC_QUALIFIER detail::tvec4<T> mirrorRepeat
|
||||
(
|
||||
detail::tvec4<T> const & Texcoord
|
||||
)
|
||||
{
|
||||
detail::tvec4<T> Result;
|
||||
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
|
||||
Result[i] = mirrorRepeat(Texcoord[i]);
|
||||
return Result;
|
||||
}
|
||||
}//namespace glm
|
||||
|
|
Loading…
Add table
Reference in a new issue