This commit is contained in:
Christophe Riccio
2010-04-29 11:52:01 +01:00
parent c4a3226a5a
commit b1b02bc31b
400 changed files with 0 additions and 57143 deletions

View File

@@ -1,51 +0,0 @@
set(NAME glm)
file(GLOB ROOT_SOURCE *.cpp)
file(GLOB ROOT_INLINE *.inl)
file(GLOB ROOT_HEADER *.hpp)
file(GLOB_RECURSE CORE_SOURCE ./core/*.cpp)
file(GLOB_RECURSE CORE_INLINE ./core/*.inl)
file(GLOB_RECURSE CORE_HEADER ./core/*.hpp)
file(GLOB_RECURSE GTC_SOURCE ./gtc/*.cpp)
file(GLOB_RECURSE GTC_INLINE ./gtc/*.inl)
file(GLOB_RECURSE GTC_HEADER ./gtc/*.hpp)
file(GLOB_RECURSE GTX_SOURCE ./gtx/*.cpp)
file(GLOB_RECURSE GTX_INLINE ./gtx/*.inl)
file(GLOB_RECURSE GTX_HEADER ./gtx/*.hpp)
file(GLOB_RECURSE IMG_SOURCE ./img/*.cpp)
file(GLOB_RECURSE IMG_INLINE ./img/*.inl)
file(GLOB_RECURSE IMG_HEADER ./img/*.hpp)
file(GLOB_RECURSE VIRTREV_SOURCE ./virtrev/*.cpp)
file(GLOB_RECURSE VIRTREV_INLINE ./virtrev/*.inl)
file(GLOB_RECURSE VIRTREV_HEADER ./virtrev/*.hpp)
source_group("Core Files" FILES ${CORE_SOURCE})
source_group("Core Files" FILES ${CORE_INLINE})
source_group("Core Files" FILES ${CORE_HEADER})
source_group("GTC Files" FILES ${GTC_SOURCE})
source_group("GTC Files" FILES ${GTC_INLINE})
source_group("GTC Files" FILES ${GTC_HEADER})
source_group("GTX Files" FILES ${GTX_SOURCE})
source_group("GTX Files" FILES ${GTX_INLINE})
source_group("GTX Files" FILES ${GTX_HEADER})
source_group("IMG Files" FILES ${IMG_SOURCE})
source_group("IMG Files" FILES ${IMG_INLINE})
source_group("IMG Files" FILES ${IMG_HEADER})
source_group("VIRTREV Files" FILES ${VIRTREV_SOURCE})
source_group("VIRTREV Files" FILES ${VIRTREV_INLINE})
source_group("VIRTREV Files" FILES ${VIRTREV_HEADER})
include_directories(..)
add_executable(${NAME}
${ROOT_SOURCE} ${ROOT_INLINE} ${ROOT_HEADER}
${CORE_SOURCE} ${CORE_INLINE} ${CORE_HEADER}
${GTC_SOURCE} ${GTC_INLINE} ${GTC_HEADER}
${GTX_SOURCE} ${GTX_INLINE} ${GTX_HEADER}
${IMG_SOURCE} ${IMG_INLINE} ${IMG_HEADER}
${VIRTREV_SOURCE} ${VIRTREV_INLINE} ${VIRTREV_HEADER})

View File

@@ -1,327 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-07-24
// Updated : 2008-08-31
// Licence : This source is under MIT License
// File : glm/core/_detail.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_detail
#define glm_core_detail
#include "../setup.hpp"
#include <cassert>
//#define valType typename genType::value_type
//#define valType_cref typename genType::value_type const &
//#define genType_cref typename genType const &
namespace glm{
namespace detail{
class thalf;
#if(defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_VC))
typedef signed __int64 sint64;
typedef unsigned __int64 uint64;
#elif(defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_GCC))
__extension__ typedef signed long long sint64;
__extension__ typedef unsigned long long uint64;
#else//unknown compiler
typedef signed long sint64;
typedef unsigned long uint64;
#endif//GLM_COMPILER
template<bool C>
struct If
{
template<typename F, typename T>
static inline T apply(F functor, const T& val)
{
return functor(val);
}
};
template<>
struct If<false>
{
template<typename F, typename T>
static inline T apply(F, const T& val)
{
return val;
}
};
//template <typename T>
//struct traits
//{
// static const bool is_signed = false;
// static const bool is_float = false;
// static const bool is_vector = false;
// static const bool is_matrix = false;
// static const bool is_genType = false;
// static const bool is_genIType = false;
// static const bool is_genUType = false;
//};
//template <>
//struct traits<half>
//{
// static const bool is_float = true;
// static const bool is_genType = true;
//};
//template <>
//struct traits<float>
//{
// static const bool is_float = true;
// static const bool is_genType = true;
//};
//template <>
//struct traits<double>
//{
// static const bool is_float = true;
// static const bool is_genType = true;
//};
//template <typename genType>
//struct desc
//{
// typedef genType type;
// typedef genType * pointer;
// typedef genType const* const_pointer;
// typedef genType const *const const_pointer_const;
// typedef genType *const pointer_const;
// typedef genType & reference;
// typedef genType const& const_reference;
// typedef genType const& param_type;
// typedef typename genType::value_type value_type;
// typedef typename genType::size_type size_type;
// static const typename size_type value_size;
//};
//template <typename genType>
//const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size();
union uif32
{
uif32() :
i(0)
{}
uif32(float f) :
f(f)
{}
uif32(unsigned int i) :
i(i)
{}
float f;
unsigned int i;
};
union uif64
{
uif64() :
i(0)
{}
uif64(double f) :
f(f)
{}
uif64(uint64 i) :
i(i)
{}
double f;
uint64 i;
};
typedef uif32 uif;
//////////////////
// int
template <typename T>
struct is_int
{
enum is_int_enum
{
YES = 0,
NO = 1
};
};
#define GLM_DETAIL_IS_INT(T) \
template <> \
struct is_int<T> \
{ \
enum is_int_enum \
{ \
YES = 1, \
NO = 0 \
}; \
}
//////////////////
// uint
template <typename T>
struct is_uint
{
enum is_uint_enum
{
YES = 0,
NO = 1
};
};
#define GLM_DETAIL_IS_UINT(T) \
template <> \
struct is_uint<T> \
{ \
enum is_uint_enum \
{ \
YES = 1, \
NO = 0 \
}; \
}
//GLM_DETAIL_IS_UINT(unsigned long long)
//////////////////
// float
template <typename T>
struct is_float
{
enum is_float_enum
{
YES = 0,
NO = 1
};
};
#define GLM_DETAIL_IS_FLOAT(T) \
template <> \
struct is_float<T> \
{ \
enum is_float_enum \
{ \
YES = 1, \
NO = 0 \
}; \
}
//////////////////
// bool
template <typename T>
struct is_bool
{
enum is_bool_enum
{
YES = 0,
NO = 1
};
};
template <>
struct is_bool<bool>
{
enum is_bool_enum
{
YES = 1,
NO = 0
};
};
//////////////////
// vector
template <typename T>
struct is_vector
{
enum is_vector_enum
{
YES = 0,
NO = 1
};
};
#define GLM_DETAIL_IS_VECTOR(T) \
template <> \
struct is_vector \
{ \
enum is_vector_enum \
{ \
YES = 1, \
NO = 0 \
}; \
}
//////////////////
// matrix
template <typename T>
struct is_matrix
{
enum is_matrix_enum
{
YES = 0,
NO = 1
};
};
#define GLM_DETAIL_IS_MATRIX(T) \
template <> \
struct is_matrix \
{ \
enum is_matrix_enum \
{ \
YES = 1, \
NO = 0 \
}; \
}
//////////////////
// type
template <typename T>
struct type
{
enum type_enum
{
is_float = is_float<T>::YES,
is_int = is_int<T>::YES,
is_uint = is_uint<T>::YES,
is_bool = is_bool<T>::YES
};
};
//////////////////
// type
typedef signed char int8;
typedef signed short int16;
typedef signed int int32;
typedef detail::sint64 int64;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef detail::uint64 uint64;
typedef detail::thalf float16;
typedef float float32;
typedef double float64;
}//namespace detail
}//namespace glm
#endif//glm_core_detail

File diff suppressed because it is too large Load Diff

View File

@@ -1,20 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-04-27
// Updated : 2006-04-27
// Licence : This source is under MIT License
// File : _swizzle.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __swizzle_inl__
#define __swizzle_inl__
#include "./_swizzle.h"
namespace glm
{
}
#endif//__swizzle_inl__

View File

@@ -1,4 +0,0 @@
int main()
{
}

View File

@@ -1,274 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-03-08
// Updated : 2010-01-26
// Licence : This source is under MIT License
// File : glm/core/func_common.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_common
#define glm_core_func_common
namespace glm
{
namespace test{
void main_core_func_common();
}//namespace test
namespace core{
namespace function{
//! Define common functions from Section 8.3 of GLSL 1.30.8 specification. Included in glm namespace.
namespace common{
//! Returns x if x >= 0; otherwise, it returns -x.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genFIType>
genFIType abs(genFIType const & x);
//! Returns 1.0 if x > 0, 0.0 if x = 0, or -1.0 if x < 0.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genFIType>
genFIType sign(genFIType const & x);
//! Returns a value equal to the nearest integer that is less then or equal to x.
//! (From GLSL 1.30.08 specification, section 8.3)
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.
//! (From GLSL 1.30.08 specification, section 8.3)
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.
//! (From GLSL 1.30.08 specification, section 8.3)
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.)
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType roundEven(genType const & x);
//! Returns a value equal to the nearest integer
//! that is greater than or equal to x.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType ceil(genType const & x);
//! Return x - floor(x).
//! (From GLSL 1.30.08 specification, section 8.3)
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.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType mod(
genType const & x,
genType const & y);
//! Modulus. Returns x - y * floor(x / y)
//! for each component in x using the floating point value y.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType mod(
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.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType modf(
genType const & x,
genType & i);
//! Returns y if y < x; otherwise, it returns x.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType min(
genType const & x,
genType const & y);
template <typename genType>
genType min(
genType const & x,
typename genType::value_type const & y);
//! Returns y if x < y; otherwise, it returns x.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType max(
genType const & x,
genType const & y);
template <typename genType>
genType max(
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.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType clamp(
genType const & x,
genType const & minVal,
genType const & maxVal);
template <typename genType>
genType clamp(
genType const & x,
typename genType::value_type const & minVal,
typename genType::value_type const & maxVal);
//! \return If genTypeU is a floating scalar or vector:
//! Returns x * (1.0 - a) + y * a, i.e., the linear blend of
//! x and y using the floating-point value a.
//! The value for a is not restricted to the range [0, 1].
//!
//! \return If genTypeU is a boolean scalar or vector:
//! Selects which vector each returned component comes
//! from. For a component of a that is false, the
//! corresponding component of x is returned. For a
//! component of a that is true, the corresponding
//! component of y is returned. Components of x and y that
//! are not selected are allowed to be invalid floating point
//! values and will have no effect on the results. Thus, this
//! provides different functionality than
//! genType mix(genType x, genType y, genType(a))
//! where a is a Boolean vector.
//!
//! From GLSL 1.30.08 specification, section 8.3
//!
//! \param[in] x Floating point scalar or vector.
//! \param[in] y Floating point scalar or vector.
//! \param[in] a Floating point or boolean scalar or vector.
//!
// \todo Test when 'a' is a boolean.
template <typename genTypeT, typename genTypeU>
genTypeT mix(genTypeT const & x, genTypeT const & y, genTypeU const & a);
//! Returns 0.0 if x < edge, otherwise it returns 1.0.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType step(
genType const & edge,
genType const & x);
template <typename genType>
genType step(
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 <20> edge0) / (edge1 <20> edge0), 0, 1);
//! return t * t * (3 <20> 2 * t);
//! Results are undefined if edge0 >= edge1.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
genType smoothstep(
genType const & edge0,
genType const & edge1,
genType const & x);
template <typename genType>
genType smoothstep(
typename genType::value_type const & edge0,
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.
//! (From GLSL 1.30.08 specification, section 8.3)
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.
//! (From GLSL 1.30.08 specification, section 8.3)
template <typename genType>
typename genType::bool_type isinf(genType const & x);
//! Returns a signed or unsigned integer value representing
//! the encoding of a floating-point value. The floatingpoint
//! value's bit-level representation is preserved.
//! (From GLSL 4.00.08 specification, section 8.3)
template <typename genType, typename genIType>
genIType floatBitsToInt(genType const & value);
//! Returns a signed or unsigned integer value representing
//! the encoding of a floating-point value. The floatingpoint
//! value's bit-level representation is preserved.
//! (From GLSL 4.00.08 specification, section 8.3)
template <typename genType, typename genUType>
genUType floatBitsToInt(genType const & value);
//! Returns a floating-point value corresponding to a signed
//! or 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.
//! (From GLSL 4.00.08 specification, section 8.3)
template <typename genType, typename genIUType>
genType intBitsToFloat(genIUType const & value);
//! Computes and returns a * b + c.
//! (From GLSL 4.00.08 specification, section 8.3)
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.
//! (From GLSL 4.00.08 specification, section 8.3)
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.
//! (From GLSL 4.00.08 specification, section 8.3)
template <typename genType, typename genIType>
genType ldexp(genType const & x, genIType const & exp);
}//namespace common
}//namespace function
}//namespace core
using namespace core::function::common;
}//namespace glm
#include "func_common.inl"
#endif//glm_core_func_common

File diff suppressed because it is too large Load Diff

View File

@@ -1,71 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-08
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_exponential.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_exponential
#define glm_core_func_exponential
namespace glm
{
namespace test{
void main_core_func_exponential();
}//namespace test
namespace core{
namespace function{
//! Define all exponential functions from Section 8.2 of GLSL 1.30.8 specification. Included in glm namespace.
namespace exponential{
//! Returns x raised to the y power.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType pow(genType const & x, genType const & y);
//! Returns the natural exponentiation of x, i.e., e^x.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType exp(genType const & x);
//! 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.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType log(genType const & x);
//! Returns 2 raised to the x power.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType exp2(genType const & x);
//! Returns the base 2 log of x, i.e., returns the value y,
//! which satisfies the equation x = 2 ^ y.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType log2(genType const & x);
//! Returns the positive square root of x.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType sqrt(genType const & x);
//! Returns the reciprocal of the positive square root of x.
//! (From GLSL 1.30.08 specification, section 8.2)
template <typename genType>
genType inversesqrt(genType const & x);
}//namespace exponential
}//namespace function
}//namespace core
using namespace core::function::exponential;
}//namespace glm
#include "func_exponential.inl"
#endif//glm_core_func_exponential

View File

@@ -1,358 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_exponential.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace exponential{
// pow
template <typename genType>
inline genType pow
(
genType const & x,
genType const & y
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::pow(x, y);
}
template <typename T>
inline 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>
inline 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>
inline 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));
}
// exp
template <typename genType>
inline genType exp
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::exp(x);
}
template <typename T>
inline detail::tvec2<T> exp
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
exp(x.x),
exp(x.y));
}
template <typename T>
inline 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>
inline 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));
}
// log
template <typename genType>
inline genType log
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::log(x);
}
template <typename T>
inline detail::tvec2<T> log
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
log(x.x),
log(x.y));
}
template <typename T>
inline 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>
inline 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));
}
//exp2, ln2 = 0.69314718055994530941723212145818f
template <typename genType>
inline genType exp2
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::exp(genType(0.69314718055994530941723212145818) * x);
}
template <typename T>
inline detail::tvec2<T> exp2
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
exp2(x.x),
exp2(x.y));
}
template <typename T>
inline 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>
inline 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));
}
// log2, ln2 = 0.69314718055994530941723212145818f
template <typename genType>
inline genType log2
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::log(x) / genType(0.69314718055994530941723212145818);
}
template <typename T>
inline detail::tvec2<T> log2
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
log2(x.x),
log2(x.y));
}
template <typename T>
inline 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>
inline 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));
}
// sqrt
template <typename genType>
inline genType sqrt
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return genType(::std::sqrt(double(x)));
}
template <typename T>
inline detail::tvec2<T> sqrt
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
sqrt(x.x),
sqrt(x.y));
}
template <typename T>
inline detail::tvec3<T> sqrt
(
detail::tvec3<T> const & x
)
{
return detail::tvec3<T>(
sqrt(x.x),
sqrt(x.y),
sqrt(x.z));
}
template <typename T>
inline detail::tvec4<T> sqrt
(
detail::tvec4<T> const & x
)
{
return detail::tvec4<T>(
sqrt(x.x),
sqrt(x.y),
sqrt(x.z),
sqrt(x.w));
}
template <typename genType>
inline genType inversesqrt
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return genType(1) / ::std::sqrt(x);
}
template <typename T>
inline detail::tvec2<T> inversesqrt
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
inversesqrt(x.x),
inversesqrt(x.y));
}
template <typename T>
inline 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>
inline 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));
}
}//namespace exponential
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,92 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_geometric.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_geometric
#define glm_core_func_geometric
namespace glm
{
namespace test{
void main_core_func_geometric();
}//namespace test
namespace core{
namespace function{
//! Define all geometric functions from Section 8.4 of GLSL 1.30.8 specification. Included in glm namespace.
namespace geometric{
//! Returns the length of x, i.e., sqrt(x * x).
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
typename genType::value_type length(
genType const & x);
//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
typename genType::value_type distance(
genType const & p0,
genType const & p1);
//! Returns the dot product of x and y, i.e., result = x * y.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
typename genType::value_type dot(
genType const & x,
genType const & y);
//! Returns the cross product of x and y.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename T>
detail::tvec3<T> cross(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y);
//! Returns a vector in the same direction as x but with length of 1.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
genType normalize(
genType const & x);
//! If dot(Nref, I) < 0.0, return N, otherwise, return -N.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
genType faceforward(
genType const & N,
genType const & I,
genType const & Nref);
//! For the incident vector I and surface orientation N,
//! returns the reflection direction : result = I - 2.0 * dot(N, I) * N.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
genType reflect(
genType const & I,
genType const & N);
//! For the incident vector I and surface normal N,
//! and the ratio of indices of refraction eta,
//! return the refraction vector.
//! (From GLSL 1.30.08 specification, section 8.4)
template <typename genType>
genType refract(
genType const & I,
genType const & N,
typename genType::value_type const & eta);
}//namespace geometric
}//namespace function
}//namespace core
using namespace core::function::geometric;
}//namespace glm
#include "func_geometric.inl"
#endif//glm_core_func_geometric

View File

@@ -1,290 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_geometric.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace geometric{
// length
template <typename genType>
inline genType length
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
genType sqr = x * x;
return sqrt(sqr);
}
template <typename T>
inline typename detail::tvec2<T>::value_type length
(
detail::tvec2<T> const & v
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec2<T>::value_type sqr = v.x * v.x + v.y * v.y;
return sqrt(sqr);
}
template <typename T>
inline typename detail::tvec3<T>::value_type length
(
detail::tvec3<T> const & v
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec3<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z;
return sqrt(sqr);
}
template <typename T>
inline typename detail::tvec4<T>::value_type length
(
detail::tvec4<T> const & v
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec4<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w;
return sqrt(sqr);
}
// distance
template <typename genType>
inline genType distance
(
genType const & p0,
genType const & p1
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return length(p1 - p0);
}
template <typename T>
inline typename detail::tvec2<T>::value_type distance
(
detail::tvec2<T> const & p0,
detail::tvec2<T> const & p1
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return length(p1 - p0);
}
template <typename T>
inline typename detail::tvec3<T>::value_type distance
(
detail::tvec3<T> const & p0,
detail::tvec3<T> const & p1
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return length(p1 - p0);
}
template <typename T>
inline typename detail::tvec4<T>::value_type distance
(
detail::tvec4<T> const & p0,
detail::tvec4<T> const & p1
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return length(p1 - p0);
}
// dot
template <typename genType>
inline genType dot
(
genType const & x,
genType const & y
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return x * y;
}
template <typename T>
inline typename detail::tvec2<T>::value_type dot
(
detail::tvec2<T> const & x,
detail::tvec2<T> const & y
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return x.x * y.x + x.y * y.y;
}
template <typename T>
inline T dot
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return x.x * y.x + x.y * y.y + x.z * y.z;
}
/* // SSE3
inline float dot(const tvec4<float>& x, const tvec4<float>& y)
{
float Result;
__asm
{
mov esi, x
mov edi, y
movaps xmm0, [esi]
mulps xmm0, [edi]
haddps( _xmm0, _xmm0 )
haddps( _xmm0, _xmm0 )
movss Result, xmm0
}
return Result;
}
*/
template <typename T>
inline T dot
(
detail::tvec4<T> const & x,
detail::tvec4<T> const & y
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w;
}
// cross
template <typename T>
inline detail::tvec3<T> cross
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
return detail::tvec3<T>(
x.y * y.z - y.y * x.z,
x.z * y.x - y.z * x.x,
x.x * y.y - y.x * x.y);
}
// normalize
template <typename genType>
inline genType normalize
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return x < genType(0) ? genType(-1) : genType(1);
}
// According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefine and generate an error
template <typename T>
inline detail::tvec2<T> normalize
(
detail::tvec2<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec2<T>::value_type sqr = x.x * x.x + x.y * x.y;
return x * inversesqrt(sqr);
}
template <typename T>
inline detail::tvec3<T> normalize
(
detail::tvec3<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec3<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z;
return x * inversesqrt(sqr);
}
template <typename T>
inline detail::tvec4<T> normalize
(
detail::tvec4<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
typename detail::tvec4<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w;
return x * inversesqrt(sqr);
}
// faceforward
template <typename genType>
inline genType faceforward
(
genType const & N,
genType const & I,
genType const & Nref
)
{
return dot(Nref, I) < 0 ? N : -N;
}
// reflect
template <typename genType>
genType reflect
(
genType const & I,
genType const & N
)
{
return I - N * dot(N, I) * float(2);
}
// refract
template <typename genType>
inline genType refract
(
genType const & I,
genType const & N,
typename genType::value_type const & eta
)
{
//It could be a vector
//GLM_STATIC_ASSERT(detail::type<genType>::is_float);
typename genType::value_type dotValue = dot(N, I);
typename genType::value_type k = typename genType::value_type(1) - eta * eta * (typename genType::value_type(1) - dotValue * dotValue);
if(k < typename genType::value_type(0))
return genType(0);
else
return eta * I - (eta * dotValue + sqrt(k)) * N;
}
}//namespace geometric
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,142 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-03-17
// Updated : 2010-03-31
// Licence : This source is under MIT License
// File : glm/core/func_integer.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_integer
#define glm_core_func_integer
namespace glm
{
namespace test{
void main_core_func_integer();
}//namespace test
namespace core{
namespace function{
//! Define integer functions from Section 8.8 of GLSL 4.00.8 specification.
namespace 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.
//!
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genUType>
genUType uaddCarry(
genUType const & x,
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.
//!
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genUType>
genUType usubBorrow(
genUType const & x,
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.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genUType>
void umulExtended(
genUType const & x,
genUType const & y,
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.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genIType>
void imulExtended(
genIType const & x,
genIType const & y,
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 <20> 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.
//!
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genIUType>
genIUType bitfieldExtract(
genIUType const & Value,
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 <20> 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.
//!
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genIUType>
genIUType bitfieldInsert(
genIUType const & Base,
genIUType const & Insert,
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.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename genIUType>
genIUType bitfieldReverse(genIUType const & value);
//! Returns the number of bits set to 1 in the binary representation of value.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename T, template <typename> class C>
typename C<T>::signed_type bitCount(C<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.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename T, template <typename> class C>
typename C<T>::signed_type findLSB(C<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.
//! (From GLSL 4.00.08 specification, section 8.8)
template <typename T, template <typename> class C>
typename C<T>::signed_type findMSB(C<T> const & Value);
}//namespace integer
}//namespace function
}//namespace core
using namespace core::function::integer;
}//namespace glm
#include "func_integer.inl"
#endif//glm_core_func_integer

View File

@@ -1,600 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-03-17
// Updated : 2010-03-31
// Licence : This source is under MIT License
// File : glm/core/func_integer.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace detail
{
}//namespace detail
namespace core{
namespace function{
namespace integer
{
// uaddCarry
template <typename genUType>
inline genUType uaddCarry
(
genUType const & x,
genUType const & y,
genUType & Carry
)
{
detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y);
genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32)));
Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0;
return Result;
}
template <typename T>
inline detail::tvec2<T> uaddCarry
(
detail::tvec2<T> const & x,
detail::tvec2<T> const & y,
detail::tvec2<T> & Carry
)
{
return detail::tvec2<T>(
uaddCarry(x[0], y[0], Carry[0]),
uaddCarry(x[1], y[1], Carry[1]));
}
template <typename T>
inline detail::tvec3<T> uaddCarry
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y,
detail::tvec3<T> & Carry
)
{
return detail::tvec3<T>(
uaddCarry(x[0], y[0], Carry[0]),
uaddCarry(x[1], y[1], Carry[1]),
uaddCarry(x[2], y[2], Carry[2]));
}
template <typename T>
inline detail::tvec4<T> uaddCarry
(
detail::tvec4<T> const & x,
detail::tvec4<T> const & y,
detail::tvec4<T> & Carry
)
{
return detail::tvec4<T>(
uaddCarry(x[0], y[0], Carry[0]),
uaddCarry(x[1], y[1], Carry[1]),
uaddCarry(x[2], y[2], Carry[2]),
uaddCarry(x[3], y[3], Carry[3]));
}
// usubBorrow
template <typename genUType>
inline genUType usubBorrow
(
genUType const & x,
genUType const & y,
genUType & Borrow
)
{
Borrow = x >= y ? 0 : 1;
if(x > y)
return genUType(detail::highp_int_t(x) - detail::highp_int_t(y));
else
return genUType(detail::highp_int_t(1) << detail::highp_int_t(32) + detail::highp_int_t(x) - detail::highp_int_t(y));
}
template <typename T>
inline detail::tvec2<T> usubBorrow
(
detail::tvec2<T> const & x,
detail::tvec2<T> const & y,
detail::tvec2<T> & Borrow
)
{
return detail::tvec2<T>(
usubBorrow(x[0], y[0], Borrow[0]),
usubBorrow(x[1], y[1], Borrow[1]));
}
template <typename T>
inline detail::tvec3<T> usubBorrow
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y,
detail::tvec3<T> & Borrow
)
{
return detail::tvec3<T>(
usubBorrow(x[0], y[0], Borrow[0]),
usubBorrow(x[1], y[1], Borrow[1]),
usubBorrow(x[2], y[2], Borrow[2]));
}
template <typename T>
inline detail::tvec4<T> usubBorrow
(
detail::tvec4<T> const & x,
detail::tvec4<T> const & y,
detail::tvec4<T> & Borrow
)
{
return detail::tvec4<T>(
usubBorrow(x[0], y[0], Borrow[0]),
usubBorrow(x[1], y[1], Borrow[1]),
usubBorrow(x[2], y[2], Borrow[2]),
usubBorrow(x[3], y[3], Borrow[3]));
}
// umulExtended
template <typename genUType>
inline void umulExtended
(
genUType const & x,
genUType const & y,
genUType & msb,
genUType & lsb
)
{
detail::highp_uint_t ValueX64 = x;
detail::highp_uint_t ValueY64 = y;
detail::highp_uint_t Value64 = ValueX64 * ValueY64;
msb = *(genUType*)&(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1)));
lsb = *(genUType*)&(Value64 >> detail::highp_uint_t(32));
}
template <typename T>
inline detail::tvec2<T> umulExtended
(
detail::tvec2<T> const & x,
detail::tvec2<T> const & y,
detail::tvec2<T> & msb,
detail::tvec2<T> & lsb
)
{
return detail::tvec2<T>(
umulExtended(x[0], y[0], msb, lsb),
umulExtended(x[1], y[1], msb, lsb));
}
template <typename T>
inline detail::tvec3<T> umulExtended
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y,
detail::tvec3<T> & msb,
detail::tvec3<T> & lsb
)
{
return detail::tvec3<T>(
umulExtended(x[0], y[0], msb, lsb),
umulExtended(x[1], y[1], msb, lsb),
umulExtended(x[2], y[2], msb, lsb));
}
template <typename T>
inline detail::tvec4<T> umulExtended
(
detail::tvec4<T> const & x,
detail::tvec4<T> const & y,
detail::tvec4<T> & msb,
detail::tvec4<T> & lsb
)
{
return detail::tvec4<T>(
umulExtended(x[0], y[0], msb, lsb),
umulExtended(x[1], y[1], msb, lsb),
umulExtended(x[2], y[2], msb, lsb),
umulExtended(x[3], y[3], msb, lsb));
}
// imulExtended
template <typename genIType>
void imulExtended
(
genIType const & x,
genIType const & y,
genIType & msb,
genIType & lsb
)
{
detail::highp_int_t ValueX64 = x;
detail::highp_int_t ValueY64 = y;
detail::highp_int_t Value64 = ValueX64 * ValueY64;
msb = *(genIType*)&(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1)));
lsb = *(genIType*)&(Value64 >> detail::highp_uint_t(32));
}
template <typename T>
inline detail::tvec2<T> imulExtended
(
detail::tvec2<T> const & x,
detail::tvec2<T> const & y,
detail::tvec2<T> & msb,
detail::tvec2<T> & lsb
)
{
return detail::tvec2<T>(
imulExtended(x[0], y[0], msb, lsb),
imulExtended(x[1], y[1], msb, lsb));
}
template <typename T>
inline detail::tvec3<T> imulExtended
(
detail::tvec3<T> const & x,
detail::tvec3<T> const & y,
detail::tvec3<T> & msb,
detail::tvec3<T> & lsb
)
{
return detail::tvec3<T>(
imulExtended(x[0], y[0], msb, lsb),
imulExtended(x[1], y[1], msb, lsb),
imulExtended(x[2], y[2], msb, lsb));
}
template <typename T>
inline detail::tvec4<T> imulExtended
(
detail::tvec4<T> const & x,
detail::tvec4<T> const & y,
detail::tvec4<T> & msb,
detail::tvec4<T> & lsb
)
{
return detail::tvec4<T>(
imulExtended(x[0], y[0], msb, lsb),
imulExtended(x[1], y[1], msb, lsb),
imulExtended(x[2], y[2], msb, lsb),
imulExtended(x[3], y[3], msb, lsb));
}
// bitfieldExtract
template <typename genIUType>
genIUType bitfieldExtract
(
genIUType const & Value,
int const & Offset,
int const & Bits
)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
assert(Offset + Bits <= sizeof(genIUType));
genIUType Result = 0;
if(std::numeric_limits<genIUType>::is_signed)
Result |= (1 << (sizeof(genIUType) * 8 - 1)) & (1 << (Offset + Bits - 1));
genIUType Mask = 0;
for(std::size_t Bit = Offset; Bit < Bits; ++Bit)
Mask |= (1 << Bit);
return Result | ((Mask & Value) >> Offset);
}
template <typename T>
inline detail::tvec2<T> bitfieldExtract
(
detail::tvec2<T> const & Value,
int const & Offset,
int const & Bits
)
{
return detail::tvec2<T>(
bitfieldExtract(Value[0]),
bitfieldExtract(Value[1]));
}
template <typename T>
inline detail::tvec3<T> bitfieldExtract
(
detail::tvec3<T> const & Value,
int const & Offset,
int const & Bits
)
{
return detail::tvec3<T>(
bitfieldExtract(Value[0]),
bitfieldExtract(Value[1]),
bitfieldExtract(Value[2]));
}
template <typename T>
inline detail::tvec4<T> bitfieldExtract
(
detail::tvec4<T> const & Value,
int const & Offset,
int const & Bits
)
{
return detail::tvec4<T>(
bitfieldExtract(Value[0]),
bitfieldExtract(Value[1]),
bitfieldExtract(Value[2]),
bitfieldExtract(Value[3]));
}
// bitfieldInsert
template <typename genIUType>
inline genIUType bitfieldInsert
(
genIUType const & Base,
genIUType const & Insert,
int const & Offset,
int const & Bits
)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
assert(Offset + Bits <= sizeof(genIUType));
if(Bits == 0)
return Base;
genIUType Mask = 0;
for(std::size_t Bit = Offset; Bit < Offset + Bits; ++Bit)
Mask |= (1 << Bit);
return (Base & ~Mask) | (Insert & Mask);
}
template <typename T>
inline detail::tvec2<T> bitfieldInsert
(
detail::tvec2<T> const & Base,
detail::tvec2<T> const & Insert,
int const & Offset,
int const & Bits
)
{
return detail::tvec2<T>(
bitfieldInsert(Base[0], Insert[0], Offset, Bits),
bitfieldInsert(Base[1], Insert[1], Offset, Bits));
}
template <typename T>
inline detail::tvec3<T> bitfieldInsert
(
detail::tvec3<T> const & Base,
detail::tvec3<T> const & Insert,
int const & Offset,
int const & Bits
)
{
return detail::tvec3<T>(
bitfieldInsert(Base[0], Insert[0], Offset, Bits),
bitfieldInsert(Base[1], Insert[1], Offset, Bits),
bitfieldInsert(Base[2], Insert[2], Offset, Bits));
}
template <typename T>
inline detail::tvec4<T> bitfieldInsert
(
detail::tvec4<T> const & Base,
detail::tvec4<T> const & Insert,
int const & Offset,
int const & Bits
)
{
return detail::tvec4<T>(
bitfieldInsert(Base[0], Insert[0], Offset, Bits),
bitfieldInsert(Base[1], Insert[1], Offset, Bits),
bitfieldInsert(Base[2], Insert[2], Offset, Bits),
bitfieldInsert(Base[3], Insert[3], Offset, Bits));
}
// bitfieldReverse
template <typename genIUType>
inline genIUType bitfieldReverse(genIUType const & Value)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
genIUType Result = 0;
for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i)
if(Value & (1 << i))
Result |= (genIUType(1) << (sizeof(genIUType) * std::size_t(8)) - genIUType(1) - i);
return Result;
}
template <typename T>
inline detail::tvec2<T> bitfieldReverse
(
detail::tvec2<T> const & value
)
{
return detail::tvec2<T>(
bitfieldReverse(value[0]),
bitfieldReverse(value[1]));
}
template <typename T>
inline 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>
inline 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]));
}
// bitCount
template <typename genIUType>
int bitCount(genIUType const & Value)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
int Count = 0;
for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i)
{
if(Value & (1 << i))
++Count;
}
return Count;
}
template <typename T>
inline detail::tvec2<int> bitCount
(
detail::tvec2<T> const & value
)
{
return detail::tvec2<int>(
bitCount(value[0]),
bitCount(value[1]));
}
template <typename T>
inline detail::tvec3<int> bitCount
(
detail::tvec3<T> const & value
)
{
return detail::tvec3<int>(
bitCount(value[0]),
bitCount(value[1]),
bitCount(value[2]));
}
template <typename T>
inline detail::tvec4<int> bitCount
(
detail::tvec4<T> const & value
)
{
return detail::tvec4<int>(
bitCount(value[0]),
bitCount(value[1]),
bitCount(value[2]),
bitCount(value[3]));
}
// findLSB
template <typename genIUType>
inline int findLSB
(
genIUType const & Value
)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
if(Value == 0)
return -1;
genIUType Bit;
for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){}
return Bit;
}
template <typename T>
inline detail::tvec2<int> findLSB
(
detail::tvec2<T> const & value
)
{
return detail::tvec2<int>(
findLSB(value[0]),
findLSB(value[1]));
}
template <typename T>
inline detail::tvec3<int> findLSB
(
detail::tvec3<T> const & value
)
{
return detail::tvec3<int>(
findLSB(value[0]),
findLSB(value[1]),
findLSB(value[2]));
}
template <typename T>
inline detail::tvec4<int> findLSB
(
detail::tvec4<T> const & value
)
{
return detail::tvec4<int>(
findLSB(value[0]),
findLSB(value[1]),
findLSB(value[2]),
findLSB(value[3]));
}
// findMSB
template <typename genIUType>
inline int findMSB
(
genIUType const & Value
)
{
GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer);
if(Value == 0)
return -1;
genIUType bit = genIUType(-1);
for(genIUType tmp = Value; tmp; tmp >>= 1, ++bit){}
return bit;
}
template <typename T>
inline detail::tvec2<int> findMSB
(
detail::tvec2<T> const & value
)
{
return detail::tvec2<int>(
findMSB(value[0]),
findMSB(value[1]));
}
template <typename T>
inline detail::tvec3<int> findMSB
(
detail::tvec3<T> const & value
)
{
return detail::tvec3<int>(
findMSB(value[0]),
findMSB(value[1]),
findMSB(value[2]));
}
template <typename T>
inline detail::tvec4<int> findMSB
(
detail::tvec4<T> const & value
)
{
return detail::tvec4<int>(
findMSB(value[0]),
findMSB(value[1]),
findMSB(value[2]),
findMSB(value[3]));
}
}//namespace integer
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,92 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_matrix.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_matrix
#define glm_core_func_matrix
namespace glm
{
namespace test{
void main_core_func_matrix();
}//namespace test
namespace core{
namespace function{
//! Define all matrix functions from Section 8.5 of GLSL 1.30.8 specification. Included in glm namespace.
namespace matrix{
//! 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].
//! (From GLSL 1.30.08 specification, section 8.5)
template <typename matType>
matType matrixCompMult(
matType const & x,
matType const & y);
//! 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.
//! (From GLSL 1.30.08 specification, section 8.5)
template <typename vecType, typename matType>
matType outerProduct(
vecType const & c,
vecType const & r);
//! Returns the transposed matrix of x
//! (From GLSL 1.30.08 specification, section 8.5)
template <typename matType>
typename matType::transpose_type transpose(
matType const & x);
//! Return the determinant of a mat2 matrix.
//! (From GLSL 1.50.09 specification, section 8.5)..
template <typename T>
typename detail::tmat2x2<T>::value_type determinant(
detail::tmat2x2<T> const & m);
//! Return the determinant of a mat3 matrix.
//! (From GLSL 1.50.09 specification, section 8.5).
template <typename T>
typename detail::tmat3x3<T>::value_type determinant(
detail::tmat3x3<T> const & m);
//! Return the determinant of a mat4 matrix.
//! (From GLSL 1.50.09 specification, section 8.5).
template <typename T>
typename detail::tmat4x4<T>::value_type determinant(
detail::tmat4x4<T> const & m);
//! Return the inverse of a mat2 matrix.
//! (From GLSL 1.40.07 specification, section 8.5).
template <typename T>
detail::tmat2x2<T> inverse(
detail::tmat2x2<T> const & m);
//! Return the inverse of a mat3 matrix.
//! (From GLSL 1.40.07 specification, section 8.5).
template <typename T>
detail::tmat3x3<T> inverse(
detail::tmat3x3<T> const & m);
//! Return the inverse of a mat4 matrix.
//! (From GLSL 1.40.07 specification, section 8.5).
template <typename T>
detail::tmat4x4<T> inverse(
detail::tmat4x4<T> const & m);
}//namespace matrix
}//namespace function
}//namespace core
using namespace core::function::matrix;
}//namespace glm
#include "func_matrix.inl"
#endif//glm_core_func_matrix

View File

@@ -1,559 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-03-08
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/func_matrix.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace matrix{
// matrixCompMult
template <typename matType>
inline matType matrixCompMult
(
matType const & x,
matType const & y
)
{
GLM_STATIC_ASSERT(detail::type<typename matType::value_type>::is_float);
matType result(matType::null);
for(typename matType::size_type i = 0; i < matType::col_size(); ++i)
result[i] = x[i] * y[i];
return result;
}
// outerProduct
template <typename T>
inline detail::tmat2x2<T> outerProduct
(
detail::tvec2<T> const & c,
detail::tvec2<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x2<T> m(detail::tmat2x2<T>::null);
m[0][0] = c[0] * r[0];
m[0][1] = c[1] * r[0];
m[1][0] = c[0] * r[1];
m[1][1] = c[1] * r[1];
return m;
}
template <typename T>
inline detail::tmat3x3<T> outerProduct
(
detail::tvec3<T> const & c,
detail::tvec3<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x3<T> m(detail::tmat3x3<T>::null);
for(typename detail::tmat3x3<T>::size_type i = 0; i < detail::tmat3x3<T>::col_size(); ++i)
m[i] = c * r[i];
return m;
}
template <typename T>
inline detail::tmat4x4<T> outerProduct
(
detail::tvec4<T> const & c,
detail::tvec4<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x4<T> m(detail::tmat4x4<T>::null);
for(typename detail::tmat4x4<T>::size_type i = 0; i < detail::tmat4x4<T>::col_size(); ++i)
m[i] = c * r[i];
return m;
}
template <typename T>
inline detail::tmat2x3<T> outerProduct
(
detail::tvec3<T> const & c,
detail::tvec2<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x3<T> m(detail::tmat2x3<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[1][2] = c.z * r.y;
return m;
}
template <typename T>
inline detail::tmat3x2<T> outerProduct
(
detail::tvec2<T> const & c,
detail::tvec3<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x2<T> m(detail::tmat3x2<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[2][0] = c.x * r.z;
m[2][1] = c.y * r.z;
return m;
}
template <typename T>
inline detail::tmat2x4<T> outerProduct
(
detail::tvec2<T> const & c,
detail::tvec4<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x4<T> m(detail::tmat2x4<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x;
m[0][3] = c.w * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[1][2] = c.z * r.y;
m[1][3] = c.w * r.y;
return m;
}
template <typename T>
inline detail::tmat4x2<T> outerProduct
(
detail::tvec4<T> const & c,
detail::tvec2<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x2<T> m(detail::tmat4x2<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[2][0] = c.x * r.z;
m[2][1] = c.y * r.z;
m[3][0] = c.x * r.w;
m[3][1] = c.y * r.w;
return m;
}
template <typename T>
inline detail::tmat3x4<T> outerProduct
(
detail::tvec4<T> const & c,
detail::tvec3<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x4<T> m(detail::tmat3x4<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x;
m[0][3] = c.w * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[1][2] = c.z * r.y;
m[1][3] = c.w * r.y;
m[2][0] = c.x * r.z;
m[2][1] = c.y * r.z;
m[2][2] = c.z * r.z;
m[2][3] = c.w * r.z;
return m;
}
template <typename T>
inline detail::tmat4x3<T> outerProduct
(
detail::tvec3<T> const & c,
detail::tvec4<T> const & r
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x3<T> m(detail::tmat4x3<T>::null);
m[0][0] = c.x * r.x;
m[0][1] = c.y * r.x;
m[0][2] = c.z * r.x;
m[1][0] = c.x * r.y;
m[1][1] = c.y * r.y;
m[1][2] = c.z * r.y;
m[2][0] = c.x * r.z;
m[2][1] = c.y * r.z;
m[2][2] = c.z * r.z;
m[3][0] = c.x * r.w;
m[3][1] = c.y * r.w;
m[3][2] = c.z * r.w;
return m;
}
template <typename T>
inline detail::tmat2x2<T> transpose
(
detail::tmat2x2<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x2<T> result(detail::tmat2x2<T>::null);
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>
inline detail::tmat3x3<T> transpose
(
detail::tmat3x3<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x3<T> result(detail::tmat3x3<T>::null);
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>
inline detail::tmat4x4<T> transpose
(
detail::tmat4x4<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x4<T> result(detail::tmat4x4<T>::null);
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>
inline detail::tmat2x3<T> transpose
(
detail::tmat3x2<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x3<T> result(detail::tmat2x3<T>::null);
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];
return result;
}
template <typename T>
inline detail::tmat3x2<T> transpose
(
detail::tmat2x3<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x2<T> result(detail::tmat3x2<T>::null);
result[0][0] = m[0][0];
result[0][1] = m[1][0];
result[1][0] = m[0][1];
result[1][1] = m[1][1];
result[2][0] = m[0][2];
result[2][1] = m[1][2];
return result;
}
template <typename T>
inline detail::tmat2x4<T> transpose
(
detail::tmat4x2<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat2x4<T> result(detail::tmat2x4<T>::null);
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];
return result;
}
template <typename T>
inline detail::tmat4x2<T> transpose
(
detail::tmat2x4<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x2<T> result(detail::tmat4x2<T>::null);
result[0][0] = m[0][0];
result[0][1] = m[1][0];
result[1][0] = m[0][1];
result[1][1] = m[1][1];
result[2][0] = m[0][2];
result[2][1] = m[1][2];
result[3][0] = m[0][3];
result[3][1] = m[1][3];
return result;
}
template <typename T>
inline detail::tmat3x4<T> transpose
(
detail::tmat4x3<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat3x4<T> result(detail::tmat3x4<T>::null);
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];
return result;
}
template <typename T>
inline detail::tmat4x3<T> transpose
(
detail::tmat3x4<T> const & m
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
detail::tmat4x3<T> result(detail::tmat4x3<T>::null);
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];
result[3][0] = m[0][3];
result[3][1] = m[1][3];
result[3][2] = m[2][3];
return result;
}
template <typename T>
inline typename detail::tmat2x2<T>::value_type determinant
(
detail::tmat2x2<T> const & m
)
{
return m[0][0] * m[1][1] - m[1][0] * m[0][1];
}
template <typename T>
inline typename detail::tmat3x3<T>::value_type determinant
(
detail::tmat3x3<T> const & m
)
{
return
+ m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])
- m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])
+ m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
}
template <typename T>
inline typename detail::tmat4x4<T>::value_type determinant
(
detail::tmat4x4<T> const & m
)
{
T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
detail::tvec4<T> DetCof(
+ (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02),
- (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04),
+ (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05),
- (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05));
return m[0][0] * DetCof[0]
+ m[0][1] * DetCof[1]
+ m[0][2] * DetCof[2]
+ m[0][3] * DetCof[3];
}
template <typename T>
inline detail::tmat2x2<T> inverse
(
detail::tmat2x2<T> const & m
)
{
//valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1];
T Determinant = determinant(m);
detail::tmat2x2<T> Inverse(
+ m[1][1] / Determinant,
- m[1][0] / Determinant,
- m[0][1] / Determinant,
+ m[0][0] / Determinant);
return Inverse;
}
template <typename T>
inline detail::tmat3x3<T> inverse
(
detail::tmat3x3<T> const & m
)
{
//valType Determinant = m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])
// - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])
// + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
T Determinant = determinant(m);
detail::tmat3x3<T> Inverse(detail::tmat3x3<T>::null);
Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
Inverse[0][1] = - (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[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
Inverse[1][2] = - (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;
}
template <typename T>
inline detail::tmat4x4<T> inverse
(
detail::tmat4x4<T> const & m
)
{
T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
detail::tvec4<T> const SignA(+1, -1, +1, -1);
detail::tvec4<T> const SignB(-1, +1, -1, +1);
detail::tvec4<T> Fac0(Coef00, Coef00, Coef02, Coef03);
detail::tvec4<T> Fac1(Coef04, Coef04, Coef06, Coef07);
detail::tvec4<T> Fac2(Coef08, Coef08, Coef10, Coef11);
detail::tvec4<T> Fac3(Coef12, Coef12, Coef14, Coef15);
detail::tvec4<T> Fac4(Coef16, Coef16, Coef18, Coef19);
detail::tvec4<T> Fac5(Coef20, Coef20, Coef22, Coef23);
detail::tvec4<T> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]);
detail::tvec4<T> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]);
detail::tvec4<T> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]);
detail::tvec4<T> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]);
detail::tvec4<T> Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2);
detail::tvec4<T> Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4);
detail::tvec4<T> Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5);
detail::tvec4<T> Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5);
detail::tmat4x4<T> Inverse(Inv0, Inv1, Inv2, Inv3);
detail::tvec4<T> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]);
T Determinant = glm::dot(m[0], Row0);
Inverse /= Determinant;
return Inverse;
}
}//namespace matrix
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,53 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-01
// Updated : 2008-09-10
// Licence : This source is under MIT License
// File : glm/core/func_noise.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_noise
#define glm_core_func_noise
namespace glm
{
namespace test{
void main_core_func_noise();
}//namespace test
namespace core{
namespace function{
// Define all noise functions from Section 8.9 of GLSL 1.30.8 specification. Included in glm namespace.
namespace noise{
// Returns a 1D noise value based on the input value x.
// From GLSL 1.30.08 specification, section 8.9.
template <typename genType>
typename genType::value_type noise1(genType const & x);
// Returns a 2D noise value based on the input value x.
// From GLSL 1.30.08 specification, section 8.9.
template <typename genType>
detail::tvec2<typename genType::value_type> noise2(genType const & x);
// Returns a 3D noise value based on the input value x.
// From GLSL 1.30.08 specification, section 8.9.
template <typename genType>
detail::tvec3<typename genType::value_type> noise3(genType const & x);
// Returns a 4D noise value based on the input value x.
// From GLSL 1.30.08 specification, section 8.9.
template <typename genType>
detail::tvec4<typename genType::value_type> noise4(genType const & x);
}//namespace noise
}//namespace function
}//namespace core
using namespace core::function::noise;
}//namespace glm
#include "func_noise.inl"
#endif//glm_core_func_noise

View File

@@ -1,305 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-01
// Updated : 2008-09-23
// Licence : This source is under MIT License
// File : glm/core/func_noise.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace noise{
// noise1
template <typename genType>
inline genType noise1
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
int iNbr = int(x + genType(3) / genType(2)) * 1103515245 + 12345;
return genType(int(iNbr / genType(65536)) % 32768) / genType(32767);
}
template <typename T>
inline typename detail::tvec2<T>::value_type noise1
(
detail::tvec2<T> const & x
)
{
T tmp(0);
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
tmp += x[i];
return noise1(tmp);
}
template <typename T>
inline typename detail::tvec3<T>::value_type noise1
(
detail::tvec3<T> const & x
)
{
T tmp(0);
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
tmp += x[i];
return noise1(tmp);
}
template <typename T>
inline typename detail::tvec4<T>::value_type noise1
(
detail::tvec4<T> const & x
)
{
T tmp(0);
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
tmp += x[i];
return noise1(tmp);
}
// noise2
template <typename genType>
inline detail::tvec2<genType> noise2
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
genType f1 = x * genType(1103515245) + genType(12345);
genType f2 = f1 * genType(1103515245) + genType(12345);
return detail::tvec2<genType>(
noise1(f1),
noise1(f2));
}
template <typename T>
inline detail::tvec2<T> noise2
(
detail::tvec2<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
return detail::tvec2<T>(
noise1(f1),
noise1(f2));
}
template <typename T>
inline detail::tvec2<T> noise2
(
detail::tvec3<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
return detail::tvec2<T>(
noise1(f1),
noise1(f2));
}
template <typename T>
inline detail::tvec2<T> noise2
(
detail::tvec4<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
return detail::tvec2<T>(
noise1(f1),
noise1(f2));
}
// noise3
template <typename genType>
inline detail::tvec3<genType> noise3
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
genType f1 = x * genType(1103515245) + genType(12345);
genType f2 = f1 * genType(1103515245) + genType(12345);
genType f3 = f2 * genType(1103515245) + genType(12345);
return detail::tvec3<genType>(
noise1(f1),
noise1(f2),
noise1(f3));
}
template <typename T>
inline detail::tvec3<T> noise3
(
detail::tvec2<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
return detail::tvec3<T>(
noise1(f1),
noise1(f2),
noise1(f3));
}
template <typename T>
inline detail::tvec3<T> noise3
(
detail::tvec3<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
return detail::tvec3<T>(
noise1(f1),
noise1(f2),
noise1(f3));
}
template <typename T>
inline detail::tvec3<T> noise3
(
detail::tvec4<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
return detail::tvec3<T>(
noise1(f1),
noise1(f2),
noise1(f3));
}
// noise4
template <typename genType>
inline detail::tvec4<genType> noise4
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
genType f1 = x * genType(1103515245) + genType(12345);
genType f2 = f1 * genType(1103515245) + genType(12345);
genType f3 = f2 * genType(1103515245) + genType(12345);
genType f4 = f3 * genType(1103515245) + genType(12345);
return detail::tvec4<genType>(
noise1(f1),
noise1(f2),
noise1(f3),
noise1(f4));
}
template <typename T>
inline detail::tvec4<T> noise4
(
detail::tvec2<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
T f4 = f3 * T(1103515245) + T(12345);
return detail::tvec4<T>(
noise1(f1),
noise1(f2),
noise1(f3),
noise1(f4));
}
template <typename T>
inline detail::tvec4<T> noise4
(
detail::tvec3<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size()(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
T f4 = f3 * T(1103515245) + T(12345);
return detail::tvec4<T>(
noise1(f1),
noise1(f2),
noise1(f3),
noise1(f4));
}
template <typename T>
inline detail::tvec4<T> noise4
(
detail::tvec4<T> const & x
)
{
GLM_STATIC_ASSERT(detail::type<T>::is_float);
T f0(0);
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size()(); ++i)
f0 += x[i];
T f1 = f0 * T(1103515245) + T(12345);
T f2 = f1 * T(1103515245) + T(12345);
T f3 = f2 * T(1103515245) + T(12345);
T f4 = f3 * T(1103515245) + T(12345);
return detail::tvec4<T>(
noise1(f1),
noise1(f2),
noise1(f3),
noise1(f4));
}
}//namespace noise
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,45 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-03-17
// Updated : 2010-03-17
// Licence : This source is under MIT License
// File : glm/core/func_packing.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_packing
#define glm_core_func_packing
namespace glm
{
namespace test{
void main_core_func_packing();
}//namespace test
namespace core{
namespace function{
//! Define packing functions from section 8.4 floating-point pack and unpack functions of GLSL 4.00.8 specification
namespace packing
{
uint packUnorm2x16(vec2 const & v);
uint packUnorm4x8(vec4 const & v);
uint packSnorm4x8(vec4 const & v);
vec2 unpackUnorm2x16(uint const & p);
vec4 unpackUnorm4x8(uint const & p);
vec4 unpackSnorm4x8(uint const & p);
double packDouble2x32(uvec2 const & v);
uvec2 unpackDouble2x32(double const & v);
}//namespace packing
}//namespace function
}//namespace core
using namespace core::function::packing;
}//namespace glm
#include "func_packing.inl"
#endif//glm_core_func_packing

View File

@@ -1,25 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-03-17
// Updated : 2010-03-17
// Licence : This source is under MIT License
// File : glm/core/func_packing.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace detail
{
}//namespace detail
namespace core{
namespace function{
namespace packing{
}//namespace packing
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,125 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-01
// Updated : 2008-09-10
// Licence : This source is under MIT License
// File : glm/core/func_trigonometric.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_trigonometric
#define glm_core_func_trigonometric
namespace glm
{
namespace test{
void main_core_func_trigonometric();
}//namespace test
namespace core{
namespace function{
//! Define Angle and trigonometry functions
//! from Section 8.1 of GLSL 1.30.8 specification.
//! Included in glm namespace.
namespace trigonometric{
//! Converts degrees to radians and returns the result.
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType radians(genType const & degrees);
//! Converts radians to degrees and returns the result.
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType degrees(genType const & radians);
//! The standard trigonometric sine function.
//! The values returned by this function will range from [-1, 1].
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType sin(genType const & angle);
//! The standard trigonometric cosine function.
//! The values returned by this function will range from [-1, 1].
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType cos(genType const & angle);
//! The standard trigonometric tangent function.
//! (From GLSL 1.30.08 specification, section 8.1)
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.
//! (From GLSL 1.30.08 specification, section 8.1)
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.
//! (From GLSL 1.30.08 specification, section 8.1)
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.
//! (From GLSL 1.30.08 specification, section 8.1)
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].
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType atan(genType const & y_over_x);
//! Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType sinh(genType const & angle);
//! Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType cosh(genType const & angle);
//! Returns the hyperbolic tangent function, sinh(angle) / cosh(angle)
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType tanh(genType const & angle);
//! Arc hyperbolic sine; returns the inverse of sinh.
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType asinh(genType const & x);
//! Arc hyperbolic cosine; returns the non-negative inverse
//! of cosh. Results are undefined if x < 1.
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType acosh(genType const & x);
//! Arc hyperbolic tangent; returns the inverse of tanh.
//! Results are undefined if abs(x) >= 1.
//! (From GLSL 1.30.08 specification, section 8.1)
template <typename genType>
genType atanh(genType const & x);
}//namespace trigonometric
}//namespace function
}//namespace core
using namespace core::function::trigonometric;
}//namespace glm
#include "func_trigonometric.inl"
#endif//glm_core_func_trigonometric

View File

@@ -1,745 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2008-09-14
// Licence : This source is under MIT License
// File : glm/core/func_trigonometric.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace trigonometric{
// radians
template <typename genType>
inline genType radians
(
genType const & degrees
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
const genType pi = genType(3.1415926535897932384626433832795);
return degrees * (pi / genType(180));
}
template <typename T>
inline detail::tvec2<T> radians
(
detail::tvec2<T> const & degrees
)
{
return detail::tvec2<T>(
radians(degrees.x),
radians(degrees.y));
}
template <typename T>
inline detail::tvec3<T> radians
(
detail::tvec3<T> const & degrees
)
{
return detail::tvec3<T>(
radians(degrees.x),
radians(degrees.y),
radians(degrees.z));
}
template <typename T>
inline 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));
}
// degrees
template <typename genType>
inline genType degrees
(
genType const & radians
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
const genType pi = genType(3.1415926535897932384626433832795);
return radians * (genType(180) / pi);
}
template <typename T>
inline detail::tvec2<T> degrees
(
detail::tvec2<T> const & radians
)
{
return detail::tvec2<T>(
degrees(radians.x),
degrees(radians.y));
}
template <typename T>
inline detail::tvec3<T> degrees
(
detail::tvec3<T> const & radians
)
{
return detail::tvec3<T>(
degrees(radians.x),
degrees(radians.y),
degrees(radians.z));
}
template <typename T>
inline 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));
}
// sin
template <typename genType>
inline genType sin
(
genType const & angle
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::sin(angle);
}
template <typename T>
inline detail::tvec2<T> sin
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
sin(angle.x),
sin(angle.y));
}
template <typename T>
inline detail::tvec3<T> sin
(
detail::tvec3<T> const & angle
)
{
return detail::tvec3<T>(
sin(angle.x),
sin(angle.y),
sin(angle.z));
}
template <typename T>
inline 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));
}
// cos
template <typename genType>
inline genType cos(genType const & angle)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::cos(angle);
}
template <typename T>
inline detail::tvec2<T> cos
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
cos(angle.x),
cos(angle.y));
}
template <typename T>
inline detail::tvec3<T> cos
(
detail::tvec3<T> const & angle
)
{
return detail::tvec3<T>(
cos(angle.x),
cos(angle.y),
cos(angle.z));
}
template <typename T>
inline 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));
}
// tan
template <typename genType>
inline genType tan
(
genType const & angle
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::tan(angle);
}
template <typename T>
inline detail::tvec2<T> tan
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
tan(angle.x),
tan(angle.y));
}
template <typename T>
inline detail::tvec3<T> tan
(
detail::tvec3<T> const & angle
)
{
return detail::tvec3<T>(
tan(angle.x),
tan(angle.y),
tan(angle.z));
}
template <typename T>
inline 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));
}
// asin
template <typename genType>
inline genType asin
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::asin(x);
}
template <typename T>
inline detail::tvec2<T> asin
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
asin(x.x),
asin(x.y));
}
template <typename T>
inline detail::tvec3<T> asin
(
detail::tvec3<T> const & x
)
{
return detail::tvec3<T>(
asin(x.x),
asin(x.y),
asin(x.z));
}
template <typename T>
inline 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));
}
// acos
template <typename genType>
inline genType acos
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::acos(x);
}
template <typename T>
inline detail::tvec2<T> acos
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
acos(x.x),
acos(x.y));
}
template <typename T>
inline detail::tvec3<T> acos
(
detail::tvec3<T> const & x
)
{
return detail::tvec3<T>(
acos(x.x),
acos(x.y),
acos(x.z));
}
template <typename T>
inline 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));
}
// atan
template <typename genType>
inline genType atan
(
genType const & y,
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::atan2(y, x);
}
template <typename T>
inline 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>
inline 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>
inline 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>
inline genType atan
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return ::std::atan(x);
}
template <typename T>
inline detail::tvec2<T> atan
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
atan(x.x),
atan(x.y));
}
template <typename T>
inline 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>
inline 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>
inline genType sinh
(
genType const & angle
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return std::sinh(angle);
}
template <typename T>
inline detail::tvec2<T> sinh
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
sinh(angle.x),
sinh(angle.y));
}
template <typename T>
inline 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>
inline 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>
inline genType cosh
(
genType const & angle
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return std::cosh(angle);
}
template <typename T>
inline detail::tvec2<T> cosh
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
cosh(angle.x),
cosh(angle.y));
}
template <typename T>
inline 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>
inline 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>
inline genType tanh
(
genType const & angle
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return std::tanh(angle);
}
template <typename T>
inline detail::tvec2<T> tanh
(
detail::tvec2<T> const & angle
)
{
return detail::tvec2<T>(
tanh(angle.x),
tanh(angle.y));
}
template <typename T>
inline 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>
inline 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>
inline genType asinh
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x));
}
template <typename T>
inline detail::tvec2<T> asinh
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
asinh(x.x),
asinh(x.y));
}
template <typename T>
inline detail::tvec3<T> asinh
(
detail::tvec3<T> const & x
)
{
return detail::tvec3<T>(
asinh(x.x),
asinh(x.y),
asinh(x.z));
}
template <typename T>
inline 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));
}
// acosh
template <typename genType>
inline genType acosh
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
if(x < genType(1))
return genType(0);
return log(x + sqrt(x * x - genType(1)));
}
template <typename T>
inline detail::tvec2<T> acosh
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
acosh(x.x),
acosh(x.y));
}
template <typename T>
inline 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>
inline 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>
inline genType atanh
(
genType const & x
)
{
GLM_STATIC_ASSERT(detail::type<genType>::is_float);
if(abs(x) >= genType(1))
return 0;
return genType(0.5) * log((genType(1) + x) / (genType(1) - x));
}
template <typename T>
inline detail::tvec2<T> atanh
(
detail::tvec2<T> const & x
)
{
return detail::tvec2<T>(
atanh(x.x),
atanh(x.y));
}
template <typename T>
inline 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>
inline 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));
}
}//namespace trigonometric
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,189 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2008-09-09
// Licence : This source is under MIT License
// File : glm/core/func_vector_relational.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_func_vector_relational
#define glm_core_func_vector_relational
namespace glm
{
namespace test{
void main_core_func_vector_relational();
}//namespace test
namespace core{
namespace function{
//! Define vector relational functions from Section 8.3 of GLSL 1.30.8 specification.
//! Included in glm namespace.
namespace vector_relational
{
//! Returns the component-wise comparison result of x < y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type lessThan
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] < y[i];
return Result;
}
//! Returns the component-wise comparison of result x <= y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type lessThanEqual
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] <= y[i];
return Result;
}
//! Returns the component-wise comparison of result x > y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type greaterThan
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] > y[i];
return Result;
}
//! Returns the component-wise comparison of result x >= y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type greaterThanEqual
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] >= y[i];
return Result;
}
//! Returns the component-wise comparison of result x == y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type equal
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint ||
detail::type<T>::is_bool);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] == y[i];
return Result;
}
//! Returns the component-wise comparison of result x != y.
//! (From GLSL 1.30.08 specification, section 8.6)
template <typename T, template <typename> class vecType>
inline typename vecType<T>::bool_type notEqual
(
vecType<T> const & x,
vecType<T> const & y
)
{
GLM_STATIC_ASSERT(
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint ||
detail::type<T>::is_bool);
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = x[i] != y[i];
return Result;
}
//! Returns true if any component of x is true.
//! (From GLSL 1.30.08 specification, section 8.6)
template <template <typename> class vecType>
inline bool any(vecType<bool> const & v)
{
bool Result = false;
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result = Result || v[i];
return Result;
}
//! Returns true if all components of x are true.
//! (From GLSL 1.30.08 specification, section 8.6)
template <template <typename> class vecType>
inline bool all(vecType<bool> const & v)
{
bool Result = true;
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result = Result && v[i];
return Result;
}
//! Returns the component-wise logical complement of x.
//! (From GLSL 1.30.08 specification, section 8.6)
template <template <typename> class vecType>
inline vecType<bool> not_(vecType<bool> const & v)
{
typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
Result[i] = !v[i];
return Result;
}
}//namespace vector_relational
}//namespace function
}//namespace core
using namespace core::function::vector_relational;
}//namespace glm
#include "func_vector_relational.inl"
#endif//glm_core_func_vector_relational

View File

@@ -1,20 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-03
// Updated : 2008-09-14
// Licence : This source is under MIT License
// File : glm/core/func_vector_relational.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace core{
namespace function{
namespace vector_relational{
}//namespace vector_relational
}//namespace function
}//namespace core
}//namespace glm

View File

@@ -1,21 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-14
// Updated : 2008-08-14
// Licence : This source is under MIT License
// File : glm/core/hint.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type
#define glm_core_type
namespace glm
{
// Use dont_care, nicest and fastest to optimize implementations.
class dont_care {};
class nicest {};
class fastest {};
};
#endif//glm_core_type

View File

@@ -1,60 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-11
// Updated : 2009-05-11
// Licence : This source is under MIT License
// File : glm/core/intrinsic_common.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef GLM_DETAIL_INTRINSIC_COMMON_INCLUDED
#define GLM_DETAIL_INTRINSIC_COMMON_INCLUDED
//#include <mmintrin.h>
//#include <emmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
__m128 _mm_abs_ps(__m128 x);
__m128 _mm_sgn_ps(__m128 x);
//floor
__m128 _mm_flr_ps(__m128 v);
//trunc
__m128 _mm_trc_ps(__m128 v);
//round
__m128 _mm_rnd_ps(__m128 v);
//roundEven
__m128 _mm_rde_ps(__m128 v);
__m128 _mm_ceil_ps(__m128 v);
__m128 _mm_frc_ps(__m128 x);
__m128 _mm_mod_ps(__m128 x, __m128 y);
__m128 _mm_modf_ps(__m128 x, __m128i & i);
//inline __m128 _mm_min_ps(__m128 x, __m128 y)
//inline __m128 _mm_max_ps(__m128 x, __m128 y)
__m128 _mm_clp_ps(__m128 v, __m128 minVal, __m128 maxVal);
__m128 _mm_mix_ps(__m128 v1, __m128 v2, __m128 a);
__m128 _mm_stp_ps(__m128 edge, __m128 x);
__m128 _mm_ssp_ps(__m128 edge0, __m128 edge1, __m128 x);
__m128 _mm_nan_ps(__m128 x);
__m128 _mm_inf_ps(__m128 x);
#include "intrinsic_common.inl"
#endif//GLM_DETAIL_INTRINSIC_COMMON_INCLUDED

View File

@@ -1,280 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-08
// Updated : 2009-05-08
// Licence : This source is under MIT License
// File : glm/core/intrinsic_common.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail{
union ieee754_QNAN
{
const float f;
struct
{
const unsigned int mantissa:23, exp:8, sign:1;
};
ieee754_QNAN() : f(0.0), mantissa(0x7FFFFF), exp(0xFF), sign(0x0) {}
};
static const __m128 zero = _mm_setzero_ps();
static const __m128 one = _mm_set_ps1(1.0f);
static const __m128 minus_one = _mm_set_ps1(-1.0f);
static const __m128 two = _mm_set_ps1(2.0f);
static const __m128 three = _mm_set_ps1(3.0f);
static const __m128 pi = _mm_set_ps1(3.1415926535897932384626433832795f);
static const __m128 hundred_eighty = _mm_set_ps1(180.f);
static const __m128 pi_over_hundred_eighty = _mm_set_ps1(0.017453292519943295769236907684886f);
static const __m128 hundred_eighty_over_pi = _mm_set_ps1(57.295779513082320876798154814105f);
static const ieee754_QNAN absMask;
static const __m128 abs4Mask = _mm_set_ps1(absMask.f);
//static const __m128 _epi32_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x80000000));
//static const __m128 _epi32_inv_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF));
//static const __m128 _epi32_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));
//static const __m128 _epi32_inv_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x807FFFFF));
//static const __m128 _epi32_min_norm_pos = _mm_castsi128_ps(_mm_set1_epi32(0x00800000));
static const __m128 _epi32_0 = _mm_set_ps1(0);
static const __m128 _epi32_1 = _mm_set_ps1(1);
static const __m128 _epi32_2 = _mm_set_ps1(2);
static const __m128 _epi32_3 = _mm_set_ps1(3);
static const __m128 _epi32_4 = _mm_set_ps1(4);
static const __m128 _epi32_5 = _mm_set_ps1(5);
static const __m128 _epi32_6 = _mm_set_ps1(6);
static const __m128 _epi32_7 = _mm_set_ps1(7);
static const __m128 _epi32_8 = _mm_set_ps1(8);
static const __m128 _epi32_9 = _mm_set_ps1(9);
static const __m128 _epi32_127 = _mm_set_ps1(127);
//static const __m128 _epi32_ninf = _mm_castsi128_ps(_mm_set1_epi32(0xFF800000));
//static const __m128 _epi32_pinf = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000));
static const __m128 _ps_1_3 = _mm_set_ps1(0.33333333333333333333333333333333f);
static const __m128 _ps_0p5 = _mm_set_ps1(0.5f);
static const __m128 _ps_1 = _mm_set_ps1(1.0f);
static const __m128 _ps_m1 = _mm_set_ps1(-1.0f);
static const __m128 _ps_2 = _mm_set_ps1(2.0f);
static const __m128 _ps_3 = _mm_set_ps1(3.0f);
static const __m128 _ps_127 = _mm_set_ps1(127.0f);
static const __m128 _ps_255 = _mm_set_ps1(255.0f);
static const __m128 _ps_2pow23 = _mm_set_ps1(8388608.0f);
static const __m128 _ps_1_0_0_0 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
static const __m128 _ps_0_1_0_0 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f);
static const __m128 _ps_0_0_1_0 = _mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f);
static const __m128 _ps_0_0_0_1 = _mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f);
static const __m128 _ps_pi = _mm_set_ps1(3.1415926535897932384626433832795f);
static const __m128 _ps_pi2 = _mm_set_ps1(6.283185307179586476925286766560f);
static const __m128 _ps_2_pi = _mm_set_ps1(0.63661977236758134307553505349006f);
static const __m128 _ps_pi_2 = _mm_set_ps1(1.5707963267948966192313216916398f);
static const __m128 _ps_4_pi = _mm_set_ps1(1.2732395447351626861510701069801f);
static const __m128 _ps_pi_4 = _mm_set_ps1(0.78539816339744830961566084581988f);
static const __m128 _ps_sincos_p0 = _mm_set_ps1(0.15707963267948963959e1f);
static const __m128 _ps_sincos_p1 = _mm_set_ps1(-0.64596409750621907082e0f);
static const __m128 _ps_sincos_p2 = _mm_set_ps1(0.7969262624561800806e-1f);
static const __m128 _ps_sincos_p3 = _mm_set_ps1(-0.468175413106023168e-2f);
static const __m128 _ps_tan_p0 = _mm_set_ps1(-1.79565251976484877988e7f);
static const __m128 _ps_tan_p1 = _mm_set_ps1(1.15351664838587416140e6f);
static const __m128 _ps_tan_p2 = _mm_set_ps1(-1.30936939181383777646e4f);
static const __m128 _ps_tan_q0 = _mm_set_ps1(-5.38695755929454629881e7f);
static const __m128 _ps_tan_q1 = _mm_set_ps1(2.50083801823357915839e7f);
static const __m128 _ps_tan_q2 = _mm_set_ps1(-1.32089234440210967447e6f);
static const __m128 _ps_tan_q3 = _mm_set_ps1(1.36812963470692954678e4f);
static const __m128 _ps_tan_poleval = _mm_set_ps1(3.68935e19f);
static const __m128 _ps_atan_t0 = _mm_set_ps1(-0.91646118527267623468e-1f);
static const __m128 _ps_atan_t1 = _mm_set_ps1(-0.13956945682312098640e1f);
static const __m128 _ps_atan_t2 = _mm_set_ps1(-0.94393926122725531747e2f);
static const __m128 _ps_atan_t3 = _mm_set_ps1(0.12888383034157279340e2f);
static const __m128 _ps_atan_s0 = _mm_set_ps1(0.12797564625607904396e1f);
static const __m128 _ps_atan_s1 = _mm_set_ps1(0.21972168858277355914e1f);
static const __m128 _ps_atan_s2 = _mm_set_ps1(0.68193064729268275701e1f);
static const __m128 _ps_atan_s3 = _mm_set_ps1(0.28205206687035841409e2f);
static const __m128 _ps_exp_hi = _mm_set_ps1(88.3762626647949f);
static const __m128 _ps_exp_lo = _mm_set_ps1(-88.3762626647949f);
static const __m128 _ps_exp_rln2 = _mm_set_ps1(1.4426950408889634073599f);
static const __m128 _ps_exp_p0 = _mm_set_ps1(1.26177193074810590878e-4f);
static const __m128 _ps_exp_p1 = _mm_set_ps1(3.02994407707441961300e-2f);
static const __m128 _ps_exp_q0 = _mm_set_ps1(3.00198505138664455042e-6f);
static const __m128 _ps_exp_q1 = _mm_set_ps1(2.52448340349684104192e-3f);
static const __m128 _ps_exp_q2 = _mm_set_ps1(2.27265548208155028766e-1f);
static const __m128 _ps_exp_q3 = _mm_set_ps1(2.00000000000000000009e0f);
static const __m128 _ps_exp_c1 = _mm_set_ps1(6.93145751953125e-1f);
static const __m128 _ps_exp_c2 = _mm_set_ps1(1.42860682030941723212e-6f);
static const __m128 _ps_exp2_hi = _mm_set_ps1(127.4999961853f);
static const __m128 _ps_exp2_lo = _mm_set_ps1(-127.4999961853f);
static const __m128 _ps_exp2_p0 = _mm_set_ps1(2.30933477057345225087e-2f);
static const __m128 _ps_exp2_p1 = _mm_set_ps1(2.02020656693165307700e1f);
static const __m128 _ps_exp2_p2 = _mm_set_ps1(1.51390680115615096133e3f);
static const __m128 _ps_exp2_q0 = _mm_set_ps1(2.33184211722314911771e2f);
static const __m128 _ps_exp2_q1 = _mm_set_ps1(4.36821166879210612817e3f);
static const __m128 _ps_log_p0 = _mm_set_ps1(-7.89580278884799154124e-1f);
static const __m128 _ps_log_p1 = _mm_set_ps1(1.63866645699558079767e1f);
static const __m128 _ps_log_p2 = _mm_set_ps1(-6.41409952958715622951e1f);
static const __m128 _ps_log_q0 = _mm_set_ps1(-3.56722798256324312549e1f);
static const __m128 _ps_log_q1 = _mm_set_ps1(3.12093766372244180303e2f);
static const __m128 _ps_log_q2 = _mm_set_ps1(-7.69691943550460008604e2f);
static const __m128 _ps_log_c0 = _mm_set_ps1(0.693147180559945f);
static const __m128 _ps_log2_c0 = _mm_set_ps1(1.44269504088896340735992f);
}//namespace detail
}//namespace glm
inline __m128 _mm_abs_ps(__m128 x)
{
return _mm_and_ps(glm::detail::abs4Mask, x);
}
inline __m128 _mm_sgn_ps(__m128 x)
{
//__m128 cmp0 = _mm_cmpeq_ps(x, zero);
//__m128 cmp1 = _mm_cmple_ps(x, zero);
//__m128 cmp2 = _mm_cmpge_ps(x, zero);
__m128 result;
__m128 cmp0 = _mm_cmpeq_ps(x, glm::detail::zero);
if(_mm_movemask_ps(cmp0) == 0)
result = glm::detail::zero;
else
{
__m128 cmp1 = _mm_cmpge_ps(x, glm::detail::zero);
//__m128 cmp2 = _mm_cmple_ps(x, glm::detail::zero);
if(_mm_movemask_ps(cmp1) > 0)
result = glm::detail::one;
else //if(_mm_movemask_ps(cmp2) > 0)
result = glm::detail::minus_one;
}
return result;
}
//floor
inline __m128 _mm_flr_ps(__m128 x)
{
__m128 rnd0 = _mm_rnd_ps(x);
__m128 cmp0 = _mm_cmplt_ps(x, rnd0);
__m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);
__m128 sub0 = _mm_sub_ps(rnd0, and0);
return sub0;
}
//trunc
inline __m128 _mm_trc_ps(__m128 v)
{
return __m128();
}
//round
inline __m128 _mm_rnd_ps(__m128 x)
{
__m128 and0;// = _mm_and_ps(glm::detail::_epi32_sign_mask, x);
__m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23);
__m128 add0 = _mm_add_ps(x, or0);
__m128 sub0 = _mm_sub_ps(add0, or0);
return sub0;
}
//roundEven
inline __m128 _mm_rde_ps(__m128 v)
{
}
inline __m128 _mm_ceil_ps(__m128 x)
{
__m128 rnd0 = _mm_rnd_ps(x);
__m128 cmp0 = _mm_cmpgt_ps(x, rnd0);
__m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1);
__m128 add0 = _mm_add_ps(rnd0, and0);
return add0;
}
inline __m128 _mm_frc_ps(__m128 x)
{
__m128 flr0 = _mm_flr_ps(x);
__m128 sub0 = _mm_sub_ps(x, flr0);
return sub0;
}
inline __m128 _mm_mod_ps(__m128 x, __m128 y)
{
__m128 div0 = _mm_div_ps(x, y);
__m128 flr0 = _mm_flr_ps(div0);
__m128 mul0 = _mm_mul_ps(y, flr0);
__m128 sub0 = _mm_sub_ps(x, mul0);
return sub0;
}
inline __m128 _mm_modf_ps(__m128 x, __m128i & i)
{
}
//inline __m128 _mm_min_ps(__m128 x, __m128 y)
//inline __m128 _mm_max_ps(__m128 x, __m128 y)
inline __m128 _mm_clp_ps(__m128 v, __m128 minVal, __m128 maxVal)
{
__m128 min0 = _mm_min_ps(v, maxVal);
__m128 max0 = _mm_max_ps(min0, minVal);
return max0;
}
inline __m128 _mm_mix_ps(__m128 v1, __m128 v2, __m128 a)
{
__m128 sub0 = _mm_sub_ps(glm::detail::one, a);
__m128 mul0 = _mm_mul_ps(v1, sub0);
__m128 mul1 = _mm_mul_ps(v2, a);
__m128 add0 = _mm_add_ps(mul0, mul1);
return add0;
}
inline __m128 _mm_stp_ps(__m128 edge, __m128 x)
{
__m128 cmp = _mm_cmple_ps(x, edge);
if(_mm_movemask_ps(cmp) == 0)
return glm::detail::one;
else
return glm::detail::zero;
}
inline __m128 _mm_ssp_ps(__m128 edge0, __m128 edge1, __m128 x)
{
__m128 sub0 = _mm_sub_ps(x, edge0);
__m128 sub1 = _mm_sub_ps(edge1, edge0);
__m128 div0 = _mm_sub_ps(sub0, sub1);
__m128 clp0 = _mm_clp_ps(div0, glm::detail::zero, glm::detail::one);
__m128 mul0 = _mm_mul_ps(glm::detail::two, clp0);
__m128 sub2 = _mm_sub_ps(glm::detail::three, mul0);
__m128 mul1 = _mm_mul_ps(clp0, clp0);
__m128 mul2 = _mm_mul_ps(mul1, sub2);
return mul2;
}
inline __m128 _mm_nan_ps(__m128 x)
{
}
inline __m128 _mm_inf_ps(__m128 x)
{
}
// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration
// By Elan Ruskin,
inline __m128 _mm_sqrt_wip_ss(__m128 const x)
{
__m128 recip = _mm_rsqrt_ss( x ); // "estimate" opcode
const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast load
const static __m128 half = { 0.5,0.5,0.5,0.5 };
__m128 halfrecip = _mm_mul_ss( half, recip );
__m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) );
return _mm_mul_ss( halfrecip, threeminus_xrr );
}

View File

@@ -1,34 +0,0 @@
/*
inline __m128 _mm_rsqrt_nr_ss(__m128 const x)
{
__m128 recip = _mm_rsqrt_ss( x ); // "estimate" opcode
const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast load
const static __m128 half = { 0.5,0.5,0.5,0.5 };
__m128 halfrecip = _mm_mul_ss( half, recip );
__m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) );
return _mm_mul_ss( halfrecip, threeminus_xrr );
}
inline __m128 __mm_normalize_fast_ps( float * RESTRICT vOut, float * RESTRICT vIn )
{
__m128 x = _mm_load_ss(&vIn[0]);
__m128 y = _mm_load_ss(&vIn[1]);
__m128 z = _mm_load_ss(&vIn[2]);
const __m128 l = // compute x*x + y*y + z*z
_mm_add_ss(
_mm_add_ss( _mm_mul_ss(x,x),
_mm_mul_ss(y,y)
),
_mm_mul_ss( z, z )
);
const __m128 rsqt = _mm_rsqrt_nr_ss( l );
_mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) );
_mm_store_ss( &vOut[1] , _mm_mul_ss( rsqt, y ) );
_mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) );
return _mm_mul_ss( l , rsqt );
}
*/

View File

@@ -1,45 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-08
// Updated : 2009-05-08
// Licence : This source is under MIT License
// File : glm/core/intrinsic_geometric.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_intrinsic_geometric
#define glm_core_intrinsic_geometric
#include "intrinsic_common.hpp"
//length
__m128 _mm_len_ps(__m128 x);
//distance
__m128 _mm_dst_ps(__m128 p0, __m128 p1);
//dot
__m128 _mm_dot_ps(__m128 v1, __m128 v2);
// SSE1
__m128 _mm_dot_ss(__m128 v1, __m128 v2);
//cross
__m128 _mm_xpd_ps(__m128 v1, __m128 v2);
//normalize
__m128 _mm_nrm_ps(__m128 v);
//faceforward
__m128 _mm_ffd_ps(__m128 N, __m128 I, __m128 Nref);
//reflect
__m128 _mm_rfe_ps(__m128 I, __m128 N);
//refract
__m128 _mm_rfa_ps(__m128 I, __m128 N, __m128 eta);
#include "intrinsic_geometric.inl"
#endif//glm_core_intrinsic_geometric

View File

@@ -1,117 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-08
// Updated : 2009-05-08
// Licence : This source is under MIT License
// File : glm/core/intrinsic_geometric.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
//length
inline __m128 _mm_len_ps(__m128 x)
{
__m128 dot0 = _mm_dot_ps(x, x);
__m128 sqt0 = _mm_sqrt_ps(dot0);
return sqt0;
}
//distance
inline __m128 _mm_dst_ps(__m128 p0, __m128 p1)
{
__m128 sub0 = _mm_sub_ps(p0, p1);
__m128 len0 = _mm_len_ps(sub0);
return len0;
}
//dot
inline __m128 _mm_dot_ps(__m128 v1, __m128 v2)
{
__m128 mul0 = _mm_mul_ps(v1, v2);
__m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1));
__m128 add0 = _mm_add_ps(mul0, swp0);
__m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3));
__m128 add1 = _mm_add_ps(add0, swp1);
return add1;
}
// SSE1
inline __m128 _mm_dot_ss(__m128 v1, __m128 v2)
{
__m128 mul0 = _mm_mul_ps(v1, v2);
__m128 mov0 = _mm_movehl_ps(mul0, mul0);
__m128 add0 = _mm_add_ps(mov0, mul0);
__m128 swp1 = _mm_shuffle_ps(add0, add0, 1);
__m128 add1 = _mm_add_ss(add0, swp1);
return add1;
}
//cross
inline __m128 _mm_xpd_ps(__m128 v1, __m128 v2)
{
__m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1));
__m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2));
__m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1));
__m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2));
__m128 mul0 = _mm_mul_ps(swp0, swp3);
__m128 mul1 = _mm_mul_ps(swp1, swp2);
__m128 sub0 = _mm_sub_ps(mul0, mul1);
return sub0;
}
//normalize
inline __m128 _mm_nrm_ps(__m128 v)
{
__m128 dot0 = _mm_dot_ps(v, v);
__m128 isr0 = _mm_rsqrt_ps(dot0);
__m128 mul0 = _mm_mul_ps(v, isr0);
return mul0;
}
//faceforward
inline __m128 _mm_ffd_ps(__m128 N, __m128 I, __m128 Nref)
{
//__m128 dot0 = _mm_dot_ps(v, v);
//__m128 neg0 = _mm_neg_ps(N);
//__m128 sgn0 = _mm_sgn_ps(dot0);
//__m128 mix0 = _mm_mix_ps(N, neg0, sgn0);
//return mix0;
__m128 dot0 = _mm_dot_ps(Nref, I);
__m128 sgn0 = _mm_sgn_ps(dot0);
__m128 mul0 = _mm_mul_ps(sgn0, glm::detail::minus_one);
__m128 mul1 = _mm_mul_ps(N, mul0);
return mul1;
}
//reflect
inline __m128 _mm_rfe_ps(__m128 I, __m128 N)
{
__m128 dot0 = _mm_dot_ps(N, I);
__m128 mul0 = _mm_mul_ps(N, I);
__m128 mul1 = _mm_mul_ps(mul0, glm::detail::two);
__m128 sub0 = _mm_sub_ps(I, mul1);
return sub0;
}
//refract
inline __m128 _mm_rfa_ps(__m128 I, __m128 N, __m128 eta)
{
__m128 dot0 = _mm_dot_ps(N, I);
__m128 mul0 = _mm_mul_ps(eta, eta);
__m128 mul1 = _mm_mul_ps(dot0, dot0);
__m128 sub0 = _mm_sub_ps(glm::detail::one, mul0);
__m128 sub1 = _mm_sub_ps(glm::detail::one, mul1);
__m128 mul2 = _mm_mul_ps(sub0, sub1);
if(_mm_movemask_ps(_mm_cmplt_ss(mul2, glm::detail::zero)) == 0)
return glm::detail::zero;
__m128 sqt0 = _mm_sqrt_ps(mul2);
__m128 mul3 = _mm_mul_ps(eta, dot0);
__m128 add0 = _mm_add_ps(mul3, sqt0);
__m128 mul4 = _mm_mul_ps(add0, N);
__m128 mul5 = _mm_mul_ps(eta, I);
__m128 sub2 = _mm_sub_ps(mul5, mul4);
return sub2;
}

View File

@@ -1,36 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-05
// Updated : 2009-06-05
// Licence : This source is under MIT License
// File : glm/core/intrinsic_common.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef GLM_DETAIL_INTRINSIC_MATRIX_INCLUDED
#define GLM_DETAIL_INTRINSIC_MATRIX_INCLUDED
#include "../glm.hpp"
#include <xmmintrin.h>
#include <emmintrin.h>
void _mm_add_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);
void _mm_sub_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]);
__m128 _mm_mul_ps(__m128 m[4], __m128 v);
__m128 _mm_mul_ps(__m128 v, __m128 m[4]);
void _mm_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]);
void _mm_transpose_ps(__m128 const in[4], __m128 out[4]);
void _mm_inverse_ps(__m128 const in[4], __m128 out[4]);
void _mm_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4]);
#include "intrinsic_matrix.inl"
#endif//GLM_DETAIL_INTRINSIC_MATRIX_INCLUDED

View File

@@ -1,704 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-05
// Updated : 2009-06-05
// Licence : This source is under MIT License
// File : glm/core/intrinsic_common.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
static const __m128 one = _mm_set_ps1(1.0f);
static const __m128 pi = _mm_set_ps1(3.141592653589793238462643383279f);
static const __m128 _m128_rad_ps = _mm_set_ps1(3.141592653589793238462643383279f / 180.f);
static const __m128 _m128_deg_ps = _mm_set_ps1(180.f / 3.141592653589793238462643383279f);
inline void _mm_add_ps(__m128 in1[4], __m128 in2[4], __m128 out[4])
{
{
out[0] = _mm_add_ps(in1[0], in2[0]);
out[1] = _mm_add_ps(in1[1], in2[1]);
out[2] = _mm_add_ps(in1[2], in2[2]);
out[3] = _mm_add_ps(in1[3], in2[3]);
}
}
inline void _mm_sub_ps(__m128 in1[4], __m128 in2[4], __m128 out[4])
{
{
out[0] = _mm_sub_ps(in1[0], in2[0]);
out[1] = _mm_sub_ps(in1[1], in2[1]);
out[2] = _mm_sub_ps(in1[2], in2[2]);
out[3] = _mm_sub_ps(in1[3], in2[3]);
}
}
inline __m128 _mm_mul_ps(__m128 m[4], __m128 v)
{
__m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0));
__m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1));
__m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2));
__m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3));
__m128 m0 = _mm_mul_ps(m[0], v0);
__m128 m1 = _mm_mul_ps(m[1], v1);
__m128 m2 = _mm_mul_ps(m[2], v2);
__m128 m3 = _mm_mul_ps(m[3], v3);
__m128 a0 = _mm_add_ps(m0, m1);
__m128 a1 = _mm_add_ps(m2, m3);
__m128 a2 = _mm_add_ps(a0, a1);
return a2;
}
inline __m128 _mm_mul_ps(__m128 v, __m128 m[4])
{
__m128 i0 = m[0];
__m128 i1 = m[1];
__m128 i2 = m[2];
__m128 i3 = m[3];
__m128 m0 = _mm_mul_ps(v, i0);
__m128 m1 = _mm_mul_ps(v, i1);
__m128 m2 = _mm_mul_ps(v, i2);
__m128 m3 = _mm_mul_ps(v, i3);
__m128 u0 = _mm_unpacklo_ps(m0, m1);
__m128 u1 = _mm_unpackhi_ps(m0, m1);
__m128 a0 = _mm_add_ps(u0, u1);
__m128 u2 = _mm_unpacklo_ps(m2, m3);
__m128 u3 = _mm_unpackhi_ps(m2, m3);
__m128 a1 = _mm_add_ps(u2, u3);
__m128 f0 = _mm_movelh_ps(a0, a1);
__m128 f1 = _mm_movehl_ps(a1, a0);
__m128 f2 = _mm_add_ps(f0, f1);
return f2;
}
inline void _mm_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4])
{
{
__m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0));
__m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1));
__m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2));
__m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3));
__m128 m0 = _mm_mul_ps(in1[0], e0);
__m128 m1 = _mm_mul_ps(in1[1], e1);
__m128 m2 = _mm_mul_ps(in1[2], e2);
__m128 m3 = _mm_mul_ps(in1[3], e3);
__m128 a0 = _mm_add_ps(m0, m1);
__m128 a1 = _mm_add_ps(m2, m3);
__m128 a2 = _mm_add_ps(a0, a1);
out[0] = a2;
}
{
__m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 m0 = _mm_mul_ps(in1[0], e0);
__m128 m1 = _mm_mul_ps(in1[1], e1);
__m128 m2 = _mm_mul_ps(in1[2], e2);
__m128 m3 = _mm_mul_ps(in1[3], e3);
__m128 a0 = _mm_add_ps(m0, m1);
__m128 a1 = _mm_add_ps(m2, m3);
__m128 a2 = _mm_add_ps(a0, a1);
out[1] = a2;
}
{
__m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 m0 = _mm_mul_ps(in1[0], e0);
__m128 m1 = _mm_mul_ps(in1[1], e1);
__m128 m2 = _mm_mul_ps(in1[2], e2);
__m128 m3 = _mm_mul_ps(in1[3], e3);
__m128 a0 = _mm_add_ps(m0, m1);
__m128 a1 = _mm_add_ps(m2, m3);
__m128 a2 = _mm_add_ps(a0, a1);
out[2] = a2;
}
{
//(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3))
__m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0));
__m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1));
__m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2));
__m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3));
__m128 m0 = _mm_mul_ps(in1[0], e0);
__m128 m1 = _mm_mul_ps(in1[1], e1);
__m128 m2 = _mm_mul_ps(in1[2], e2);
__m128 m3 = _mm_mul_ps(in1[3], e3);
__m128 a0 = _mm_add_ps(m0, m1);
__m128 a1 = _mm_add_ps(m2, m3);
__m128 a2 = _mm_add_ps(a0, a1);
out[3] = a2;
}
}
inline void _mm_transpose_ps(__m128 const in[4], __m128 out[4])
{
__m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44);
__m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE);
__m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44);
__m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE);
out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88);
out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD);
out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88);
out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD);
}
inline void _mm_inverse_ps(__m128 const in[4], __m128 out[4])
{
__m128 Fac0;
{
// valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
// valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
// valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
// valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac0 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac1;
{
// valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
// valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
// valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
// valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac1 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac2;
{
// valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
// valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
// valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
// valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac2 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac3;
{
// valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
// valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
// valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
// valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac3 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac4;
{
// valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
// valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
// valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
// valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac4 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac5;
{
// valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
// valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
// valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
// valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac5 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
__m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
// m[1][0]
// m[0][0]
// m[0][0]
// m[0][0]
__m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][1]
// m[0][1]
// m[0][1]
// m[0][1]
__m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][2]
// m[0][2]
// m[0][2]
// m[0][2]
__m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][3]
// m[0][3]
// m[0][3]
// m[0][3]
__m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
// col0
// + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
// - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
// + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
// - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
__m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
__m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
__m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
__m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
__m128 Add00 = _mm_add_ps(Sub00, Mul02);
__m128 Inv0 = _mm_mul_ps(SignB, Add00);
// col1
// - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
// + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
// - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
// + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
__m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
__m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
__m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
__m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
__m128 Add01 = _mm_add_ps(Sub01, Mul05);
__m128 Inv1 = _mm_mul_ps(SignA, Add01);
// col2
// + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
// - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
// + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
// - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
__m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
__m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
__m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
__m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
__m128 Add02 = _mm_add_ps(Sub02, Mul08);
__m128 Inv2 = _mm_mul_ps(SignB, Add02);
// col3
// - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
// + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
// - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
// + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
__m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
__m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
__m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
__m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
__m128 Add03 = _mm_add_ps(Sub03, Mul11);
__m128 Inv3 = _mm_mul_ps(SignA, Add03);
__m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));
// valType Determinant = m[0][0] * Inverse[0][0]
// + m[0][1] * Inverse[1][0]
// + m[0][2] * Inverse[2][0]
// + m[0][3] * Inverse[3][0];
__m128 Det0 = _mm_dot_ps(in[0], Row2);
__m128 Rcp0 = _mm_div_ps(one, Det0);
//__m128 Rcp0 = _mm_rcp_ps(Det0);
// Inverse /= Determinant;
out[0] = _mm_mul_ps(Inv0, Rcp0);
out[1] = _mm_mul_ps(Inv1, Rcp0);
out[2] = _mm_mul_ps(Inv2, Rcp0);
out[3] = _mm_mul_ps(Inv3, Rcp0);
}
inline void _mm_inverse_fast_ps(__m128 const in[4], __m128 out[4])
{
__m128 Fac0;
{
// valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
// valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
// valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
// valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac0 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac1;
{
// valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
// valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
// valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
// valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac1 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac2;
{
// valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
// valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
// valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
// valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac2 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac3;
{
// valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
// valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
// valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
// valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac3 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac4;
{
// valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
// valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
// valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
// valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac4 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 Fac5;
{
// valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
// valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
// valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
// valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
__m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0));
__m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Mul00 = _mm_mul_ps(Swp00, Swp01);
__m128 Mul01 = _mm_mul_ps(Swp02, Swp03);
Fac5 = _mm_sub_ps(Mul00, Mul01);
bool stop = true;
}
__m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f);
__m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f);
// m[1][0]
// m[0][0]
// m[0][0]
// m[0][0]
__m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0));
__m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][1]
// m[0][1]
// m[0][1]
// m[0][1]
__m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1));
__m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][2]
// m[0][2]
// m[0][2]
// m[0][2]
__m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2));
__m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0));
// m[1][3]
// m[0][3]
// m[0][3]
// m[0][3]
__m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3));
__m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0));
// col0
// + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]),
// - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]),
// + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]),
// - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]),
__m128 Mul00 = _mm_mul_ps(Vec1, Fac0);
__m128 Mul01 = _mm_mul_ps(Vec2, Fac1);
__m128 Mul02 = _mm_mul_ps(Vec3, Fac2);
__m128 Sub00 = _mm_sub_ps(Mul00, Mul01);
__m128 Add00 = _mm_add_ps(Sub00, Mul02);
__m128 Inv0 = _mm_mul_ps(SignB, Add00);
// col1
// - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]),
// + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]),
// - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]),
// + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]),
__m128 Mul03 = _mm_mul_ps(Vec0, Fac0);
__m128 Mul04 = _mm_mul_ps(Vec2, Fac3);
__m128 Mul05 = _mm_mul_ps(Vec3, Fac4);
__m128 Sub01 = _mm_sub_ps(Mul03, Mul04);
__m128 Add01 = _mm_add_ps(Sub01, Mul05);
__m128 Inv1 = _mm_mul_ps(SignA, Add01);
// col2
// + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]),
// - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]),
// + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]),
// - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]),
__m128 Mul06 = _mm_mul_ps(Vec0, Fac1);
__m128 Mul07 = _mm_mul_ps(Vec1, Fac3);
__m128 Mul08 = _mm_mul_ps(Vec3, Fac5);
__m128 Sub02 = _mm_sub_ps(Mul06, Mul07);
__m128 Add02 = _mm_add_ps(Sub02, Mul08);
__m128 Inv2 = _mm_mul_ps(SignB, Add02);
// col3
// - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]),
// + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]),
// - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]),
// + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3]));
__m128 Mul09 = _mm_mul_ps(Vec0, Fac2);
__m128 Mul10 = _mm_mul_ps(Vec1, Fac4);
__m128 Mul11 = _mm_mul_ps(Vec2, Fac5);
__m128 Sub03 = _mm_sub_ps(Mul09, Mul10);
__m128 Add03 = _mm_add_ps(Sub03, Mul11);
__m128 Inv3 = _mm_mul_ps(SignA, Add03);
__m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0));
// valType Determinant = m[0][0] * Inverse[0][0]
// + m[0][1] * Inverse[1][0]
// + m[0][2] * Inverse[2][0]
// + m[0][3] * Inverse[3][0];
__m128 Det0 = _mm_dot_ps(in[0], Row2);
__m128 Rcp0 = _mm_rcp_ps(Det0);
//__m128 Rcp0 = _mm_div_ps(one, Det0);
// Inverse /= Determinant;
out[0] = _mm_mul_ps(Inv0, Rcp0);
out[1] = _mm_mul_ps(Inv1, Rcp0);
out[2] = _mm_mul_ps(Inv2, Rcp0);
out[3] = _mm_mul_ps(Inv3, Rcp0);
}
void _mm_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4])
{
float a = glm::radians(Angle);
float c = cos(a);
float s = sin(a);
glm::vec4 AxisA(v[0], v[1], v[2], float(0));
__m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);
__m128 AxisC = _mm_nrm_ps(AxisB);
__m128 Cos0 = _mm_set_ss(c);
__m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Sin0 = _mm_set_ss(s);
__m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0));
// detail::tvec3<valType> temp = (valType(1) - c) * axis;
__m128 Temp0 = _mm_sub_ps(one, CosA);
__m128 Temp1 = _mm_mul_ps(Temp0, AxisC);
//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];
__m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0));
__m128 TmpA0 = _mm_mul_ps(Axis0, AxisC);
__m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0));
__m128 TmpA1 = _mm_add_ps(CosA0, TmpA0);
__m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f);
__m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3));
__m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2);
__m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3);
//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];
__m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1));
__m128 TmpB0 = _mm_mul_ps(Axis1, AxisC);
__m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1));
__m128 TmpB1 = _mm_add_ps(CosA1, TmpB0);
__m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f);
__m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2));
__m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2);
__m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3);
//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];
__m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2));
__m128 TmpC0 = _mm_mul_ps(Axis2, AxisC);
__m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1));
__m128 TmpC1 = _mm_add_ps(CosA2, TmpC0);
__m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f);
__m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1));
__m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2);
__m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3);
__m128 Result[4];
Result[0] = TmpA4;
Result[1] = TmpB4;
Result[2] = TmpC4;
Result[2] = _mm_set_ps(1, 0, 0, 0);
//detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::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;
_mm_mul_ps(in, Result, out);
}

View File

@@ -1,18 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-09
// Updated : 2009-06-09
// Licence : This source is under MIT License
// File : glm/core/intrinsic_vector_relational.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef GLM_DETAIL_INTRINSIC_VECTOR_RELATIONAL_INCLUDED
#define GLM_DETAIL_INTRINSIC_VECTOR_RELATIONAL_INCLUDED
#include <xmmintrin.h>
#include <emmintrin.h>
#include "intrinsic_vector_relational.inl"
#endif//GLM_DETAIL_INTRINSIC_VECTOR_RELATIONAL_INCLUDED

View File

@@ -1,347 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-09
// Updated : 2009-06-09
// Licence : This source is under MIT License
// File : glm/core/intrinsic_vector_relational.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
//
//// lessThan
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type lessThan
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec2<bool>::bool_type(x.x < y.x, x.y < y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type lessThan
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec3<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type lessThan
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec4<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w);
//}
//
//// lessThanEqual
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type lessThanEqual
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec2<bool>::bool_type(x.x <= y.x, x.y <= y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type lessThanEqual
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec3<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type lessThanEqual
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec4<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w);
//}
//
//// greaterThan
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type greaterThan
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec2<bool>::bool_type(x.x > y.x, x.y > y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type greaterThan
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec3<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type greaterThan
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec4<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w);
//}
//
//// greaterThanEqual
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type greaterThanEqual
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec2<bool>::bool_type(x.x >= y.x, x.y >= y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type greaterThanEqual
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec3<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type greaterThanEqual
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint);
//
// return typename detail::tvec4<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w);
//}
//
//// equal
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type equal
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec2<valType>::bool_type(x.x == y.x, x.y == y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type equal
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec3<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type equal
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec4<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w);
//}
//
//// notEqual
//template <typename valType>
//inline typename detail::tvec2<valType>::bool_type notEqual
//(
// detail::tvec2<valType> const & x,
// detail::tvec2<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec2<valType>::bool_type(x.x != y.x, x.y != y.y);
//}
//
//template <typename valType>
//inline typename detail::tvec3<valType>::bool_type notEqual
//(
// detail::tvec3<valType> const & x,
// detail::tvec3<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec3<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z);
//}
//
//template <typename valType>
//inline typename detail::tvec4<valType>::bool_type notEqual
//(
// detail::tvec4<valType> const & x,
// detail::tvec4<valType> const & y
//)
//{
// GLM_STATIC_ASSERT(
// detail::type<valType>::is_float ||
// detail::type<valType>::is_int ||
// detail::type<valType>::is_uint ||
// detail::type<valType>::is_bool);
//
// return typename detail::tvec4<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w);
//}
//
//// any
//inline bool any(detail::tvec2<bool> const & x)
//{
// return x.x || x.y;
//}
//
//inline bool any(detail::tvec3<bool> const & x)
//{
// return x.x || x.y || x.z;
//}
//
//inline bool any(detail::tvec4<bool> const & x)
//{
// return x.x || x.y || x.z || x.w;
//}
//
//// all
//inline bool all(const detail::tvec2<bool>& x)
//{
// return x.x && x.y;
//}
//
//inline bool all(const detail::tvec3<bool>& x)
//{
// return x.x && x.y && x.z;
//}
//
//inline bool all(const detail::tvec4<bool>& x)
//{
// return x.x && x.y && x.z && x.w;
//}
//
//// not
//inline detail::tvec2<bool>::bool_type not_
//(
// detail::tvec2<bool> const & v
//)
//{
// return detail::tvec2<bool>::bool_type(!v.x, !v.y);
//}
//
//inline detail::tvec3<bool>::bool_type not_
//(
// detail::tvec3<bool> const & v
//)
//{
// return detail::tvec3<bool>::bool_type(!v.x, !v.y, !v.z);
//}
//
//inline detail::tvec4<bool>::bool_type not_
//(
// detail::tvec4<bool> const & v
//)
//{
// return detail::tvec4<bool>::bool_type(!v.x, !v.y, !v.z, !v.w);
//}

View File

@@ -1,283 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-01-08
// Updated : 2008-01-08
// Licence : This source is under MIT License
// File : glm/core/type.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type
#define glm_core_type
#include "type_half.hpp"
#include "type_float.hpp"
#include "type_int.hpp"
#include "type_gentype.hpp"
#include "type_vec1.hpp"
#include "type_vec2.hpp"
#include "type_vec3.hpp"
#include "type_vec4.hpp"
#include "type_mat2x2.hpp"
#include "type_mat2x3.hpp"
#include "type_mat2x4.hpp"
#include "type_mat3x2.hpp"
#include "type_mat3x3.hpp"
#include "type_mat3x4.hpp"
#include "type_mat4x2.hpp"
#include "type_mat4x3.hpp"
#include "type_mat4x4.hpp"
namespace glm{
namespace core{
namespace type
{
//////////////////////////
// Float definition
#if(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_HIGHP_FLOAT)
typedef precision::highp_vec2 vec2;
typedef precision::highp_vec3 vec3;
typedef precision::highp_vec4 vec4;
typedef precision::highp_mat2x2 mat2x2;
typedef precision::highp_mat2x3 mat2x3;
typedef precision::highp_mat2x4 mat2x4;
typedef precision::highp_mat3x2 mat3x2;
typedef precision::highp_mat3x3 mat3x3;
typedef precision::highp_mat3x4 mat3x4;
typedef precision::highp_mat4x2 mat4x2;
typedef precision::highp_mat4x3 mat4x3;
typedef precision::highp_mat4x4 mat4x4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_MEDIUMP_FLOAT)
typedef precision::mediump_vec2 vec2;
typedef precision::mediump_vec3 vec3;
typedef precision::mediump_vec4 vec4;
typedef precision::mediump_mat2x2 mat2x2;
typedef precision::mediump_mat2x3 mat2x3;
typedef precision::mediump_mat2x4 mat2x4;
typedef precision::mediump_mat3x2 mat3x2;
typedef precision::mediump_mat3x3 mat3x3;
typedef precision::mediump_mat3x4 mat3x4;
typedef precision::mediump_mat4x2 mat4x2;
typedef precision::mediump_mat4x3 mat4x3;
typedef precision::mediump_mat4x4 mat4x4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_LOWP_FLOAT)
typedef precision::lowp_vec2 vec2;
typedef precision::lowp_vec3 vec3;
typedef precision::lowp_vec4 vec4;
typedef precision::lowp_mat2x2 mat2x2;
typedef precision::lowp_mat2x3 mat2x3;
typedef precision::lowp_mat2x4 mat2x4;
typedef precision::lowp_mat3x2 mat3x2;
typedef precision::lowp_mat3x3 mat3x3;
typedef precision::lowp_mat3x4 mat3x4;
typedef precision::lowp_mat4x2 mat4x2;
typedef precision::lowp_mat4x3 mat4x3;
typedef precision::lowp_mat4x4 mat4x4;
#else
//! 2 components vector of floating-point numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_vec2 vec2;
//! 3 components vector of floating-point numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_vec3 vec3;
//! 4 components vector of floating-point numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_vec4 vec4;
//! 2 columns of 2 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat2x2 mat2x2;
//! 2 columns of 3 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat2x3 mat2x3;
//! 2 columns of 4 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat2x4 mat2x4;
//! 3 columns of 2 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat3x2 mat3x2;
//! 3 columns of 3 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat3x3 mat3x3;
//! 3 columns of 4 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat3x4 mat3x4;
//! 4 columns of 2 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat4x2 mat4x2;
//! 4 columns of 3 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat4x3 mat4x3;
//! 4 columns of 4 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef precision::mediump_mat4x4 mat4x4;
#endif//GLM_PRECISION
//! 2 columns of 2 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef mat2x2 mat2;
//! 3 columns of 3 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef mat3x3 mat3;
//! 4 columns of 4 components matrix of floating-point numbers.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices)
typedef mat4x4 mat4;
//////////////////////////
// Signed integer definition
#if(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_HIGHP_INT)
typedef precision::highp_ivec2 ivec2;
typedef precision::highp_ivec3 ivec3;
typedef precision::highp_ivec4 ivec4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_MEDIUMP_INT)
typedef precision::mediump_ivec2 ivec2;
typedef precision::mediump_ivec3 ivec3;
typedef precision::mediump_ivec4 ivec4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_LOWP_INT)
typedef precision::lowp_ivec2 ivec2;
typedef precision::lowp_ivec3 ivec3;
typedef precision::lowp_ivec4 ivec4;
#else
//! 2 components vector of signed integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_ivec2 ivec2;
//! 3 components vector of signed integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_ivec3 ivec3;
//! 4 components vector of signed integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_ivec4 ivec4;
#endif//GLM_PRECISION
//////////////////////////
// Unsigned integer definition
#if(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_HIGHP_UINT)
typedef precision::highp_uvec2 uvec2;
typedef precision::highp_uvec3 uvec3;
typedef precision::highp_uvec4 uvec4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_MEDIUMP_UINT)
typedef precision::mediump_uvec2 uvec2;
typedef precision::mediump_uvec3 uvec3;
typedef precision::mediump_uvec4 uvec4;
#elif(defined(GLM_PRECISION) && GLM_PRECISION & GLM_PRECISION_LOWP_UINT)
typedef precision::lowp_uvec2 uvec2;
typedef precision::lowp_uvec3 uvec3;
typedef precision::lowp_uvec4 uvec4;
#else
//! 2 components vector of unsigned integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_uvec2 uvec2;
//! 3 components vector of unsigned integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_uvec3 uvec3;
//! 4 components vector of unsigned integer numbers.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef precision::mediump_uvec4 uvec4;
#endif//GLM_PRECISION
//////////////////////////
// Boolean definition
//! 2 components vector of boolean.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef detail::tvec2<bool> bvec2;
//! 3 components vector of boolean.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef detail::tvec3<bool> bvec3;
//! 4 components vector of boolean.
//! From GLSL 1.30.8 specification, section 4.1.5 Vectors.
typedef detail::tvec4<bool> bvec4;
//////////////////////////
// Double definition
//! Vector of 2 double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tvec2<double> dvec2;
//! Vector of 3 double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tvec3<double> dvec3;
//! Vector of 4 double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tvec4<double> dvec4;
//! 2 * 2 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat2x2<double> dmat2;
//! 3 * 3 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat3x3<double> dmat3;
//! 4 * 4 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat4x4<double> dmat4;
//! 2 * 2 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat2x2<double> dmat2x2;
//! 2 * 3 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat2x3<double> dmat2x3;
//! 2 * 4 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat2x4<double> dmat2x4;
//! 3 * 2 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat3x2<double> dmat3x2;
//! 3 * 3 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat3x3<double> dmat3x3;
//! 3 * 4 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat3x4<double> dmat3x4;
//! 4 * 2 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat4x2<double> dmat4x2;
//! 4 * 3 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat4x3<double> dmat4x3;
//! 4 * 4 matrix of double-precision floating-point numbers.
//! From GLSL 4.00.8 specification, section 4.1 Basic Types.
typedef detail::tmat4x4<double> dmat4x4;
}//namespace type
}//namespace core
}//namespace glm
#endif//glm_core_type

View File

@@ -1,72 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-22
// Updated : 2010-02-08
// Licence : This source is under MIT License
// File : glm/core/type_float.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_float
#define glm_core_type_float
#include "type_half.hpp"
#include "../setup.hpp"
namespace glm
{
namespace detail
{
GLM_DETAIL_IS_FLOAT(detail::thalf);
GLM_DETAIL_IS_FLOAT(float);
GLM_DETAIL_IS_FLOAT(double);
GLM_DETAIL_IS_FLOAT(long double);
}
//namespace detail
namespace core{
namespace type{
namespace precision
{
#ifdef GLM_USE_HALF_SCALAR
typedef detail::thalf lowp_float_t;
#else//GLM_USE_HALF_SCALAR
typedef float lowp_float_t;
#endif//GLM_USE_HALF_SCALAR
typedef float mediump_float_t;
typedef double highp_float_t;
//! Low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification
typedef lowp_float_t lowp_float;
//! Medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification
typedef mediump_float_t mediump_float;
//! High precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification
typedef highp_float_t highp_float;
}
//namespace precision
#ifndef GLM_PRECISION
typedef precision::mediump_float float_t;
#elif(GLM_PRECISION & GLM_PRECISION_HIGHP_FLOAT)
typedef precision::highp_float float_t;
#elif(GLM_PRECISION & GLM_PRECISION_MEDIUMP_FLOAT)
typedef precision::mediump_float float_t;
#elif(GLM_PRECISION & GLM_PRECISION_LOWP_FLOAT)
typedef precision::lowp_float float_t;
#else
# pragma message("GLM message: Precisson undefined for float numbers.");
typedef precision::mediump_float float_t;
#endif//GLM_PRECISION
}//namespace type
}//namespace core
}//namespace glm
#endif//glm_core_type_float

View File

@@ -1,150 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-10-05
// Updated : 2010-01-26
// Licence : This source is under MIT License
// File : glm/core/type_gentype.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_gentype
#define glm_core_type_gentype
#include "type_size.hpp"
namespace glm
{
enum profile
{
nice,
fast,
simd
};
namespace detail
{
template
<
typename VALTYPE,
template <typename> class TYPE
>
struct genType
{
public:
enum ctor{null};
typedef VALTYPE value_type;
typedef VALTYPE & value_reference;
typedef VALTYPE * value_pointer;
typedef VALTYPE const * value_const_pointer;
typedef TYPE<bool> bool_type;
typedef sizeType size_type;
static bool is_vector();
static bool is_matrix();
typedef TYPE<VALTYPE> type;
typedef TYPE<VALTYPE> * pointer;
typedef TYPE<VALTYPE> const * const_pointer;
typedef TYPE<VALTYPE> const * const const_pointer_const;
typedef TYPE<VALTYPE> * const pointer_const;
typedef TYPE<VALTYPE> & reference;
typedef TYPE<VALTYPE> const & const_reference;
typedef TYPE<VALTYPE> const & param_type;
//////////////////////////////////////
// Address (Implementation details)
value_const_pointer value_address() const{return value_pointer(this);}
value_pointer value_address(){return value_pointer(this);}
//protected:
// enum kind
// {
// GEN_TYPE,
// VEC_TYPE,
// MAT_TYPE
// };
// typedef typename TYPE::kind kind;
};
template
<
typename VALTYPE,
template <typename> class TYPE
>
bool genType<VALTYPE, TYPE>::is_vector()
{
return true;
}
/*
template <typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice>
class base
{
public:
//////////////////////////////////////
// Traits
typedef sizeType size_type;
typedef valTypeT value_type;
typedef base<value_type, colT, rowT> class_type;
typedef base<bool, colT, rowT> bool_type;
typedef base<value_type, rowT, 1> col_type;
typedef base<value_type, colT, 1> row_type;
typedef base<value_type, rowT, colT> transpose_type;
static size_type col_size();
static size_type row_size();
static size_type value_size();
static bool is_scalar();
static bool is_vector();
static bool is_matrix();
private:
// Data
col_type value[colT];
public:
//////////////////////////////////////
// Constructors
base();
base(class_type const & m);
explicit base(value_type const & x);
explicit base(value_type const * const x);
explicit base(col_type const * const x);
//////////////////////////////////////
// Conversions
template <typename vU, uint cU, uint rU, profile pU>
explicit base(base<vU, cU, rU, pU> const & m);
//////////////////////////////////////
// Accesses
col_type& operator[](size_type i);
col_type const & operator[](size_type i) const;
//////////////////////////////////////
// Unary updatable operators
class_type& operator= (class_type const & x);
class_type& operator+= (value_type const & x);
class_type& operator+= (class_type const & x);
class_type& operator-= (value_type const & x);
class_type& operator-= (class_type const & x);
class_type& operator*= (value_type const & x);
class_type& operator*= (class_type const & x);
class_type& operator/= (value_type const & x);
class_type& operator/= (class_type const & x);
class_type& operator++ ();
class_type& operator-- ();
};
*/
}//namespace detail
}//namespace glm
//#include "type_gentype.inl"
#endif//glm_core_type_gentype

View File

@@ -1,347 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-10-05
// Updated : 2008-10-05
// Licence : This source is under MIT License
// File : glm/core/type_gentype.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail{
/////////////////////////////////
// Static functions
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size()
{
return cT;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size()
{
return rT;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size()
{
return rT * cT;
}
template <typename vT, uint cT, uint rT, profile pT>
bool base<vT, cT, rT, pT>::is_scalar()
{
return rT == 1 && cT == 1;
}
template <typename vT, uint cT, uint rT, profile pT>
bool base<vT, cT, rT, pT>::is_vector()
{
return rT == 1;
}
template <typename vT, uint cT, uint rT, profile pT>
bool base<vT, cT, rT, pT>::is_matrix()
{
return rT != 1;
}
/////////////////////////////////
// Constructor
template <typename vT, uint cT, uint rT, profile pT>
base<vT, cT, rT, pT>::base()
{
memset(&this->value, 0, cT * rT * sizeof(vT));
}
template <typename vT, uint cT, uint rT, profile pT>
base<vT, cT, rT, pT>::base
(
typename base<vT, cT, rT, pT>::class_type const & m
)
{
for
(
typename genType<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
i < base<vT, cT, rT, pT>::col_size();
++i
)
{
this->value[i] = m[i];
}
}
template <typename vT, uint cT, uint rT, profile pT>
base<vT, cT, rT, pT>::base
(
typename base<vT, cT, rT, pT>::value_type const & x
)
{
if(rT == 1) // vector
{
for
(
typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
i < base<vT, cT, rT, pT>::col_size();
++i
)
{
this->value[i][rT] = x;
}
}
else // matrix
{
memset(&this->value, 0, cT * rT * sizeof(vT));
typename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT;
for
(
typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
i < stop;
++i
)
{
this->value[i][i] = x;
}
}
}
template <typename vT, uint cT, uint rT, profile pT>
base<vT, cT, rT, pT>::base
(
typename base<vT, cT, rT, pT>::value_type const * const x
)
{
memcpy(&this->value, &x.value, cT * rT * sizeof(vT));
}
template <typename vT, uint cT, uint rT, profile pT>
base<vT, cT, rT, pT>::base
(
typename base<vT, cT, rT, pT>::col_type const * const x
)
{
for
(
typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
i < base<vT, cT, rT, pT>::col_size();
++i
)
{
this->value[i] = x[i];
}
}
template <typename vT, uint cT, uint rT, profile pT>
template <typename vU, uint cU, uint rU, profile pU>
base<vT, cT, rT, pT>::base
(
base<vU, cU, rU, pU> const & m
)
{
for
(
typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0);
i < base<vT, cT, rT, pT>::col_size();
++i
)
{
this->value[i] = base<vT, cT, rT, pT>(m[i]);
}
}
//////////////////////////////////////
// Accesses
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[]
(
typename base<vT, cT, rT, pT>::size_type i
)
{
return this->value[i];
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::col_type const & base<vT, cT, rT, pT>::operator[]
(
typename base<vT, cT, rT, pT>::size_type i
) const
{
return this->value[i];
}
//////////////////////////////////////
// Unary updatable operators
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator=
(
typename base<vT, cT, rT, pT>::class_type const & x
)
{
memcpy(&this->value, &x.value, cT * rT * sizeof(vT));
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=
(
typename base<vT, cT, rT, pT>::value_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] += x;
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+=
(
typename base<vT, cT, rT, pT>::class_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] += x[j][i];
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=
(
typename base<vT, cT, rT, pT>::value_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] -= x;
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-=
(
typename base<vT, cT, rT, pT>::class_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] -= x[j][i];
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=
(
typename base<vT, cT, rT, pT>::value_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] *= x;
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*=
(
typename base<vT, cT, rT, pT>::class_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] *= x[j][i];
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=
(
typename base<vT, cT, rT, pT>::value_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] /= x;
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/=
(
typename base<vT, cT, rT, pT>::class_type const & x
)
{
typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
this->value[j][i] /= x[j][i];
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ ()
{
typename base<vT, cT, rT, pT>::size_type stop_col = col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
++this->value[j][i];
return *this;
}
template <typename vT, uint cT, uint rT, profile pT>
typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-- ()
{
typename base<vT, cT, rT, pT>::size_type stop_col = col_size();
typename base<vT, cT, rT, pT>::size_type stop_row = row_size();
for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j)
for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i)
--this->value[j][i];
return *this;
}
} //namespace detail
} //namespace glm

View File

@@ -1,85 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-17
// Updated : 2010-02-17
// Licence : This source is under MIT License
// File : glm/core/type_half.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_half
#define glm_core_type_half
#include <cstdlib>
namespace glm
{
namespace test
{
bool main_type_half();
}//namespace test
namespace detail
{
typedef short hdata;
float toFloat32(hdata value);
hdata toFloat16(float const & value);
class thalf
{
public:
// Constructors
thalf();
thalf(thalf const & s);
template <typename U>
explicit thalf(U const & s);
// Cast
//operator float();
operator float() const;
//operator double();
//operator double() const;
// Unary updatable operators
thalf& operator= (thalf const & s);
thalf& operator+=(thalf const & s);
thalf& operator-=(thalf const & s);
thalf& operator*=(thalf const & s);
thalf& operator/=(thalf const & s);
thalf& operator++();
thalf& operator--();
float toFloat() const{return toFloat32(data);}
hdata _data() const{return data;}
private:
hdata data;
};
thalf operator+ (thalf const & s1, thalf const & s2);
thalf operator- (thalf const & s1, thalf const & s2);
thalf operator* (thalf const & s1, thalf const & s2);
thalf operator/ (thalf const & s1, thalf const & s2);
// Unary constant operators
thalf operator- (thalf const & s);
thalf operator-- (thalf const & s, int);
thalf operator++ (thalf const & s, int);
}//namespace detail
}//namespace glm
#include "type_half.inl"
#endif//glm_core_type_half

View File

@@ -1,357 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-17
// Updated : 2009-11-12
// Licence : This source is under MIT License
// File : glm/core/type_half.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright:
// This half implementation is based on OpenEXR which is Copyright (c) 2002,
// Industrial Light & Magic, a division of Lucas Digital Ltd. LLC
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "_detail.hpp"
namespace glm{
namespace detail
{
inline float overflow()
{
volatile float f = 1e10;
for(int i = 0; i < 10; ++i)
f *= f; // this will overflow before
// the for<6F>loop terminates
return f;
}
inline float toFloat32(hdata value)
{
int s = (value >> 15) & 0x00000001;
int e = (value >> 10) & 0x0000001f;
int m = value & 0x000003ff;
if(e == 0)
{
if(m == 0)
{
//
// Plus or minus zero
//
detail::uif result;
result.i = s << 31;
return result.f;
}
else
{
//
// Denormalized number -- renormalize it
//
while(!(m & 0x00000400))
{
m <<= 1;
e -= 1;
}
e += 1;
m &= ~0x00000400;
}
}
else if(e == 31)
{
if(m == 0)
{
//
// Positive or negative infinity
//
uif result;
result.i = (s << 31) | 0x7f800000;
return result.f;
}
else
{
//
// Nan -- preserve sign and significand bits
//
uif result;
result.i = (s << 31) | 0x7f800000 | (m << 13);
return result.f;
}
}
//
// Normalized number
//
e = e + (127 - 15);
m = m << 13;
//
// Assemble s, e and m.
//
uif Result;
Result.i = (s << 31) | (e << 23) | m;
return Result.f;
}
inline hdata toFloat16(float const & f)
{
uif Entry;
Entry.f = f;
int i = Entry.i;
//
// Our floating point number, f, is represented by the bit
// pattern in integer i. Disassemble that bit pattern into
// the sign, s, the exponent, e, and the significand, m.
// Shift s into the position where it will go in in the
// resulting half number.
// Adjust e, accounting for the different exponent bias
// of float and half (127 versus 15).
//
register int s = (i >> 16) & 0x00008000;
register int e = ((i >> 23) & 0x000000ff) - (127 - 15);
register int m = i & 0x007fffff;
//
// Now reassemble s, e and m into a half:
//
if(e <= 0)
{
if(e < -10)
{
//
// E is less than -10. The absolute value of f is
// less than half_MIN (f may be a small normalized
// float, a denormalized float or a zero).
//
// We convert f to a _halfGTX zero.
//
return 0;
}
//
// E is between -10 and 0. F is a normalized float,
// whose magnitude is less than __half_NRM_MIN.
//
// We convert f to a denormalized _halfGTX.
//
m = (m | 0x00800000) >> (1 - e);
//
// Round to nearest, round "0.5" up.
//
// Rounding may cause the significand to overflow and make
// our number normalized. Because of the way a half's bits
// are laid out, we don't have to treat this case separately;
// the code below will handle it correctly.
//
if(m & 0x00001000)
m += 0x00002000;
//
// Assemble the _halfGTX from s, e (zero) and m.
//
return hdata(s | (m >> 13));
}
else if(e == 0xff - (127 - 15))
{
if(m == 0)
{
//
// F is an infinity; convert f to a half
// infinity with the same sign as f.
//
return hdata(s | 0x7c00);
}
else
{
//
// F is a NAN; we produce a half NAN that preserves
// the sign bit and the 10 leftmost bits of the
// significand of f, with one exception: If the 10
// leftmost bits are all zero, the NAN would turn
// into an infinity, so we have to set at least one
// bit in the significand.
//
m >>= 13;
return hdata(s | 0x7c00 | m | (m == 0));
}
}
else
{
//
// E is greater than zero. F is a normalized float.
// We try to convert f to a normalized half.
//
//
// Round to nearest, round "0.5" up
//
if(m & 0x00001000)
{
m += 0x00002000;
if(m & 0x00800000)
{
m = 0; // overflow in significand,
e += 1; // adjust exponent
}
}
//
// Handle exponent overflow
//
if (e > 30)
{
overflow(); // Cause a hardware floating point overflow;
return hdata(s | 0x7c00);
// if this returns, the half becomes an
} // infinity with the same sign as f.
//
// Assemble the half from s, e and m.
//
return hdata(s | (e << 10) | (m >> 13));
}
}
inline thalf::thalf() :
data(0)
{}
inline thalf::thalf(thalf const & s) :
data(s.data)
{}
template <typename U>
inline thalf::thalf(U const & s) :
data(toFloat16(float(s)))
{}
// Cast
//inline half::operator float()
//{
// return toFloat();
//}
inline thalf::operator float() const
{
return toFloat();
}
//inline half::operator double()
//{
// return double(toFloat());
//}
//inline half::operator double() const
//{
// return double(toFloat());
//}
// Unary updatable operators
inline thalf& thalf::operator= (thalf const & s)
{
data = s.data;
return *this;
}
inline thalf& thalf::operator+=(thalf const & s)
{
data = toFloat16(toFloat32(data) + toFloat32(s.data));
return *this;
}
inline thalf& thalf::operator-=(thalf const & s)
{
data = toFloat16(toFloat32(data) - toFloat32(s.data));
return *this;
}
inline thalf& thalf::operator*=(thalf const & s)
{
data = toFloat16(toFloat32(data) * toFloat32(s.data));
return *this;
}
inline thalf& thalf::operator/=(thalf const & s)
{
data = toFloat16(toFloat32(data) / toFloat32(s.data));
return *this;
}
inline thalf& thalf::operator++()
{
float Casted = toFloat32(data);
data = toFloat16(++Casted);
return *this;
}
inline thalf& thalf::operator--()
{
float Casted = toFloat32(data);
data = toFloat16(--Casted);
return *this;
}
//////////////////////////////////////
// Binary arithmetic operators
inline detail::thalf operator+ (detail::thalf const & s1, detail::thalf const & s2)
{
return detail::thalf(float(s1) + float(s2));
}
inline detail::thalf operator- (detail::thalf const & s1, detail::thalf const & s2)
{
return detail::thalf(float(s1) - float(s2));
}
inline detail::thalf operator* (detail::thalf const & s1, detail::thalf const & s2)
{
return detail::thalf(float(s1) * float(s2));
}
inline detail::thalf operator/ (detail::thalf const & s1, detail::thalf const & s2)
{
return detail::thalf(float(s1) / float(s2));
}
// Unary constant operators
inline detail::thalf operator- (detail::thalf const & s)
{
return detail::thalf(-float(s));
}
inline detail::thalf operator-- (detail::thalf const & s, int)
{
return detail::thalf(float(s) - 1.0f);
}
inline detail::thalf operator++ (detail::thalf const & s, int)
{
return detail::thalf(float(s) + 1.0f);
}
}//namespace detail
}//namespace glm

View File

@@ -1,130 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-22
// Updated : 2008-09-17
// Licence : This source is under MIT License
// File : glm/core/type_int.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_int
#define glm_core_type_int
#include "../setup.hpp"
#include "_detail.hpp"
namespace glm
{
namespace detail
{
#if defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_VC)
typedef signed __int64 highp_int_t;
typedef unsigned __int64 highp_uint_t;
#elif(defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_GCC))
__extension__ typedef signed long long highp_int_t;
__extension__ typedef unsigned long long highp_uint_t;
//# if GLM_MODEL == GLM_MODEL_64
// typedef signed long highp_int_t;
// typedef unsigned long highp_uint_t;
//# elif GLM_MODEL == GLM_MODEL_32
// __extension__ typedef signed long long highp_int_t;
// __extension__ typedef unsigned long long highp_uint_t;
//# endif//GLM_MODEL
#elif(defined(GLM_COMPILER_BC))
typedef Int64 highp_int_t;
typedef Uint64 highp_uint_t;
#else
typedef signed long long highp_int_t;
typedef unsigned long long highp_uint_t;
#endif//GLM_COMPILER
GLM_DETAIL_IS_INT(signed char);
GLM_DETAIL_IS_INT(signed short);
GLM_DETAIL_IS_INT(signed int);
GLM_DETAIL_IS_INT(signed long);
GLM_DETAIL_IS_INT(highp_int_t);
GLM_DETAIL_IS_UINT(unsigned char);
GLM_DETAIL_IS_UINT(unsigned short);
GLM_DETAIL_IS_UINT(unsigned int);
GLM_DETAIL_IS_UINT(unsigned long);
GLM_DETAIL_IS_UINT(highp_uint_t);
typedef signed short lowp_int_t;
typedef signed int mediump_int_t;
typedef detail::highp_int_t highp_int_t;
typedef unsigned short lowp_uint_t;
typedef unsigned int mediump_uint_t;
typedef detail::highp_uint_t highp_uint_t;
}
//namespace detail
namespace core{
namespace type{
namespace precision
{
//! Low precision signed integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::lowp_int_t lowp_int;
//! Medium precision signed integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::mediump_int_t mediump_int;
//! High precision signed integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::highp_int_t highp_int;
//! Low precision unsigned integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::lowp_uint_t lowp_uint;
//! Medium precision unsigned integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::mediump_uint_t mediump_uint;
//! High precision unsigned integer.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification.
typedef detail::highp_uint_t highp_uint;
}
//namespace precision
#ifndef GLM_PRECISION
typedef precision::mediump_int int_t;
#elif(GLM_PRECISION & GLM_PRECISION_HIGHP_INT)
typedef precision::highp_int int_t;
#elif(GLM_PRECISION & GLM_PRECISION_MEDIUMP_INT)
typedef precision::mediump_int int_t;
#elif(GLM_PRECISION & GLM_PRECISION_LOWP_INT)
typedef precision::lowp_int int_t;
#else
typedef mediump_int int_t;
# pragma message("GLM message: Precisson undefined for signed integer number.");
#endif//GLM_PRECISION
#ifndef GLM_PRECISION
typedef precision::mediump_uint uint_t;
#elif(GLM_PRECISION & GLM_PRECISION_HIGHP_UINT)
typedef precision::highp_uint uint_t;
#elif(GLM_PRECISION & GLM_PRECISION_MEDIUMP_UINT)
typedef precision::mediump_uint uint_t;
#elif(GLM_PRECISION & GLM_PRECISION_LOWP_UINT)
typedef precision::lowp_uint uint_t;
#else
typedef precision::mediump_uint uint_t;
# pragma message("GLM message: Precisson undefined for unsigned integer number.");
#endif//GLM_PRECISION
//! Unsigned integer.
//! From GLSL 1.30.8 specification section 4.1.3 Integers.
typedef uint_t uint;
}//namespace type
}//namespace core
}//namespace glm
#endif//glm_core_type_int

View File

@@ -1,56 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-01-26
// Updated : 2010-01-26
// Licence : This source is under MIT License
// File : glm/core/type_mat.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat
#define glm_core_type_mat
#include "type_gentype.hpp"
namespace glm{
namespace detail
{
//template
//<
// typename T,
// template <typename> class C,
// template <typename> class R
//>
//struct matType
//{
// enum ctor{null};
// typedef T value_type;
// typedef std::size_t size_type;
// typedef C<T> col_type;
// typedef R<T> row_type;
// static size_type const col_size;
// static size_type const row_size;
//};
//template
//<
// typename T,
// template <typename> class C,
// template <typename> class R
//>
//typename matType<T, C, R>::size_type const
//matType<T, C, R>::col_size = matType<T, C, R>::col_type::value_size;
//template
//<
// typename T,
// template <typename> class C,
// template <typename> class R
//>
//typename matType<T, C, R>::size_type const
//matType<T, C, R>::row_size = matType<T, C, R>::row_type::value_size;
}//namespace detail
}//namespace glm
#endif//glm_core_type_mat

View File

View File

@@ -1,245 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-27
// Updated : 2010-02-11
// Licence : This source is under MIT License
// File : glm/core/type_mat2x2.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat2x2
#define glm_core_type_mat2x2
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat2x2();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 2 * 2 matrix of floating-point numbers.
template <typename T>
struct tmat2x2
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec2<T> col_type;
typedef tvec2<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat2x2<T> type;
typedef tmat2x2<T> transpose_type;
public:
// Implementation detail
tmat2x2<T> _inverse() const;
private:
// Data
col_type value[2];
public:
// Constructors
tmat2x2();
tmat2x2(
tmat2x2 const & m);
explicit tmat2x2(
ctor Null);
explicit tmat2x2(
value_type const & x);
explicit tmat2x2(
value_type const & x1, value_type const & y1,
value_type const & x2, value_type const & y2);
explicit tmat2x2(
col_type const & v1,
col_type const & v2);
// Conversions
template <typename U>
explicit tmat2x2(tmat2x2<U> const & m);
explicit tmat2x2(tmat3x3<T> const & x);
explicit tmat2x2(tmat4x4<T> const & x);
explicit tmat2x2(tmat2x3<T> const & x);
explicit tmat2x2(tmat3x2<T> const & x);
explicit tmat2x2(tmat2x4<T> const & x);
explicit tmat2x2(tmat4x2<T> const & x);
explicit tmat2x2(tmat3x4<T> const & x);
explicit tmat2x2(tmat4x3<T> const & x);
//////////////////////////////////////
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat2x2<T> & operator=(tmat2x2<T> const & m);
template <typename U>
tmat2x2<T> & operator=(tmat2x2<U> const & m);
template <typename U>
tmat2x2<T> & operator+=(U const & s);
template <typename U>
tmat2x2<T> & operator+=(tmat2x2<U> const & m);
template <typename U>
tmat2x2<T> & operator-=(U const & s);
template <typename U>
tmat2x2<T> & operator-=(tmat2x2<U> const & m);
template <typename U>
tmat2x2<T> & operator*=(U const & s);
template <typename U>
tmat2x2<T> & operator*=(tmat2x2<U> const & m);
template <typename U>
tmat2x2<T> & operator/=(U const & s);
template <typename U>
tmat2x2<T> & operator/=(tmat2x2<U> const & m);
tmat2x2<T> & operator++();
tmat2x2<T> & operator--();
};
// Binary operators
template <typename T>
tmat2x2<T> operator+ (
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s);
template <typename T>
tmat2x2<T> operator+ (
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m);
template <typename T>
tmat2x2<T> operator+ (
tmat2x2<T> const & m1,
tmat2x2<T> const & m2);
template <typename T>
tmat2x2<T> operator- (
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s);
template <typename T>
tmat2x2<T> operator- (
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m);
template <typename T>
tmat2x2<T> operator- (
tmat2x2<T> const & m1,
tmat2x2<T> const & m2);
template <typename T>
tmat2x2<T> operator* (
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s);
template <typename T>
tmat2x2<T> operator* (
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m);
template <typename T>
typename tmat2x2<T>::row_type operator* (
tmat2x2<T> const & m,
typename tmat2x2<T>::col_type const & s);
template <typename T>
typename tmat2x2<T>::col_type operator* (
typename tmat2x2<T>::row_type,
tmat2x2<T> const & m);
template <typename T>
tmat2x2<T> operator* (
tmat2x2<T> const & m1,
tmat2x2<T> const & m2);
template <typename T>
tmat2x2<T> operator/ (
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s);
template <typename T>
tmat2x2<T> operator/ (
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m);
template <typename T>
typename tmat2x2<T>::row_type operator/ (
tmat2x2<T> const & m,
typename tmat2x2<T>::col_type const & v);
template <typename T>
typename tmat2x2<T>::col_type operator/ (
typename tmat2x2<T>::row_type & v,
tmat2x2<T> const & m);
template <typename T>
tmat2x2<T> operator/ (
tmat2x2<T> const & m1,
tmat2x2<T> const & m2);
// Unary constant operators
template <typename T>
tmat2x2<T> const operator- (
tmat2x2<T> const & m);
template <typename T>
tmat2x2<T> const operator-- (
tmat2x2<T> const & m,
int);
template <typename T>
tmat2x2<T> const operator++ (
tmat2x2<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 2 columns of 2 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x2<lowp_float> lowp_mat2x2;
//! 2 columns of 2 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x2<mediump_float> mediump_mat2x2;
//! 2 columns of 2 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x2<highp_float> highp_mat2x2;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat2x2.inl"
#endif //glm_core_type_mat2x2

View File

@@ -1,580 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-16
// Updated : 2010-02-11
// Licence : This source is under MIT License
// File : glm/core/type_mat2x2.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat2x2<T>::size_type tmat2x2<T>::col_size()
{
return 2;
}
template <typename T>
inline typename tmat2x2<T>::size_type tmat2x2<T>::row_size()
{
return 2;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat2x2<T>::col_type &
tmat2x2<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat2x2<T>::col_type const &
tmat2x2<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat2x2<T>::tmat2x2()
{
this->value[0] = col_type(1, 0);
this->value[1] = col_type(0, 1);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat2x2<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
ctor
)
{}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero);
this->value[1] = col_type(Zero, s);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
value_type const & x0, value_type const & y0,
value_type const & x1, value_type const & y1
)
{
this->value[0] = col_type(x0, y0);
this->value[1] = col_type(x1, y1);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
col_type const & v0,
col_type const & v1
)
{
this->value[0] = v0;
this->value[1] = v1;
}
//////////////////////////////////////////////////////////////
// mat2 conversions
template <typename T>
template <typename U>
inline tmat2x2<T>::tmat2x2
(
tmat2x2<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat3x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat4x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T>::tmat2x2
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x2<T> tmat2x2<T>::_inverse() const
{
typename tmat2x2<T>::value_type Determinant = this->value[0][0] * this->value[1][1] - this->value[1][0] * this->value[0][1];
tmat2x2<T> Inverse(
+ this->value[1][1] / Determinant,
- this->value[1][0] / Determinant,
- this->value[0][1] / Determinant,
+ this->value[0][0] / Determinant);
return Inverse;
}
//////////////////////////////////////////////////////////////
// mat3 operators
// This function shouldn't required but it seems that VC7.1 have an optimisation bug if this operator wasn't declared
template <typename T>
inline tmat2x2<T>& tmat2x2<T>::operator=
(
tmat2x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator=
(
tmat2x2<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator+=
(
tmat2x2<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator-=
(
tmat2x2<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator*=
(
tmat2x2<U> const & m
)
{
return (*this = *this * m);
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x2<T>& tmat2x2<T>::operator/=
(
tmat2x2<U> const & m
)
{
return (*this = *this / m);
}
template <typename T>
inline tmat2x2<T>& tmat2x2<T>::operator++ ()
{
++this->value[0];
++this->value[1];
return *this;
}
template <typename T>
inline tmat2x2<T>& tmat2x2<T>::operator-- ()
{
--this->value[0];
--this->value[1];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat2x2<T> operator+
(
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s
)
{
return tmat2x2<T>(
m[0] + s,
m[1] + s);
}
template <typename T>
inline tmat2x2<T> operator+
(
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m
)
{
return tmat2x2<T>(
m[0] + s,
m[1] + s);
}
template <typename T>
inline tmat2x2<T> operator+
(
tmat2x2<T> const & m1,
tmat2x2<T> const & m2
)
{
return tmat2x2<T>(
m1[0] + m2[0],
m1[1] + m2[1]);
}
template <typename T>
inline tmat2x2<T> operator-
(
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s
)
{
return tmat2x2<T>(
m[0] - s,
m[1] - s);
}
template <typename T>
inline tmat2x2<T> operator-
(
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m
)
{
return tmat2x2<T>(
s - m[0],
s - m[1]);
}
template <typename T>
inline tmat2x2<T> operator-
(
tmat2x2<T> const & m1,
tmat2x2<T> const & m2
)
{
return tmat2x2<T>(
m1[0] - m2[0],
m1[1] - m2[1]);
}
template <typename T>
inline tmat2x2<T> operator*
(
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s
)
{
return tmat2x2<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline tmat2x2<T> operator*
(
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m
)
{
return tmat2x2<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline typename tmat2x2<T>::row_type operator*
(
tmat2x2<T> const & m,
typename tmat2x2<T>::col_type const & v
)
{
return detail::tvec2<T>(
m[0][0] * v.x + m[1][0] * v.y,
m[0][1] * v.x + m[1][1] * v.y);
}
template <typename T>
inline typename tmat2x2<T>::col_type operator*
(
typename tmat2x2<T>::row_type const & v,
tmat2x2<T> const & m
)
{
return detail::tvec2<T>(
m[0][0] * v.x + m[0][1] * v.y,
m[1][0] * v.x + m[1][1] * v.y);
}
template <typename T>
inline tmat2x2<T> operator*
(
tmat2x2<T> const & m1,
tmat2x2<T> const & m2
)
{
return tmat2x2<T>(
m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1],
m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1],
m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1],
m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]);
}
template <typename T>
inline tmat2x2<T> operator/
(
tmat2x2<T> const & m,
typename tmat2x2<T>::value_type const & s
)
{
return tmat2x2<T>(
m[0] / s,
m[1] / s);
}
template <typename T>
inline tmat2x2<T> operator/
(
typename tmat2x2<T>::value_type const & s,
tmat2x2<T> const & m
)
{
return tmat2x2<T>(
s / m[0],
s / m[1]);
}
template <typename T>
inline typename tmat2x2<T>::row_type operator/
(
tmat2x2<T> const & m,
typename tmat2x2<T>::col_type & v
)
{
return m._inverse() * v;
}
template <typename T>
inline typename tmat2x2<T>::col_type operator/
(
typename tmat2x2<T>::row_type const & v,
tmat2x2<T> const & m
)
{
return v * m._inverse();
}
template <typename T>
inline tmat2x2<T> operator/
(
tmat2x2<T> const & m1,
tmat2x2<T> const & m2
)
{
return m1 * m2._inverse();
}
// Unary constant operators
template <typename T>
inline tmat2x2<T> const operator-
(
tmat2x2<T> const & m
)
{
return tmat2x2<T>(
-m[0],
-m[1]);
}
template <typename T>
inline tmat2x2<T> const operator++
(
tmat2x2<T> const & m,
int
)
{
return tmat2x2<T>(
m[0] + T(1),
m[1] + T(1));
}
template <typename T>
inline tmat2x2<T> const operator--
(
tmat2x2<T> const & m,
int
)
{
return tmat2x2<T>(
m[0] - T(1),
m[1] - T(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,212 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-10-01
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat2x3.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat2x3
#define glm_core_type_mat2x3
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat2x3();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 2 * 3 matrix of floating-point numbers.
template <typename T>
struct tmat2x3
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec3<T> col_type;
typedef tvec2<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat2x3<T> type;
typedef tmat3x2<T> transpose_type;
private:
// Data
col_type value[2];
public:
// Constructors
tmat2x3();
tmat2x3(tmat2x3 const & m);
explicit tmat2x3(
ctor);
explicit tmat2x3(
value_type const & s);
explicit tmat2x3(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1);
explicit tmat2x3(
col_type const & v0,
col_type const & v1);
// Conversion
template <typename U>
explicit tmat2x3(tmat2x3<U> const & m);
explicit tmat2x3(tmat2x2<T> const & x);
explicit tmat2x3(tmat3x3<T> const & x);
explicit tmat2x3(tmat4x4<T> const & x);
explicit tmat2x3(tmat2x4<T> const & x);
explicit tmat2x3(tmat3x2<T> const & x);
explicit tmat2x3(tmat3x4<T> const & x);
explicit tmat2x3(tmat4x2<T> const & x);
explicit tmat2x3(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat2x3<T> & operator= (tmat2x3<T> const & m);
template <typename U>
tmat2x3<T> & operator= (tmat2x3<U> const & m);
template <typename U>
tmat2x3<T> & operator+= (U const & s);
template <typename U>
tmat2x3<T> & operator+= (tmat2x3<U> const & m);
template <typename U>
tmat2x3<T> & operator-= (U const & s);
template <typename U>
tmat2x3<T> & operator-= (tmat2x3<U> const & m);
template <typename U>
tmat2x3<T> & operator*= (U const & s);
template <typename U>
tmat2x3<T> & operator*= (tmat2x3<U> const & m);
template <typename U>
tmat2x3<T> & operator/= (U const & s);
tmat2x3<T> & operator++ ();
tmat2x3<T> & operator-- ();
};
// Binary operators
template <typename T>
tmat2x3<T> operator+ (
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s);
template <typename T>
tmat2x3<T> operator+ (
tmat2x3<T> const & m1,
tmat2x3<T> const & m2);
template <typename T>
tmat2x3<T> operator- (
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s);
template <typename T>
tmat2x3<T> operator- (
tmat2x3<T> const & m1,
tmat2x3<T> const & m2);
template <typename T>
tmat2x3<T> operator* (
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s);
template <typename T>
tmat2x3<T> operator* (
typename tmat2x3<T>::value_type const & s,
tmat2x3<T> const & m);
template <typename T>
typename tmat2x3<T>::row_type operator* (
tmat2x3<T> const & m,
typename tmat2x3<T>::col_type const & v);
template <typename T>
typename tmat2x3<T>::col_type operator* (
typename tmat2x3<T>::row_type const & v,
tmat2x3<T> const & m);
template <typename T>
tmat3x3<T> operator* (
tmat2x3<T> const & m1,
tmat3x2<T> const & m2);
template <typename T>
tmat3x2<T> operator/ (
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s);
template <typename T>
tmat3x2<T> operator/ (
typename tmat2x3<T>::value_type const & s,
tmat2x3<T> const & m);
// Unary constant operators
template <typename T>
tmat2x3<T> const operator- (
tmat2x3<T> const & m);
template <typename T>
tmat2x3<T> const operator-- (
tmat2x3<T> const & m,
int);
template <typename T>
tmat2x3<T> const operator++ (
tmat2x3<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 2 columns of 3 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x3<lowp_float> lowp_mat2x3;
//! 2 columns of 3 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x3<mediump_float> mediump_mat2x3;
//! 2 columns of 3 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x3<highp_float> highp_mat2x3;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat2x3.inl"
#endif //glm_core_type_mat2x3

View File

@@ -1,523 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat2x3.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat2x3<T>::size_type tmat2x3<T>::col_size()
{
return 3;
}
template <typename T>
inline typename tmat2x3<T>::size_type tmat2x3<T>::row_size()
{
return 2;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat2x3<T>::col_type &
tmat2x3<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat2x3<T>::col_type const &
tmat2x3<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat2x3<T>::tmat2x3()
{
this->value[0] = col_type(T(1), T(0), T(0));
this->value[1] = col_type(T(0), T(1), T(0));
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat2x3<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
ctor
)
{}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
value_type const & s
)
{
this->value[0] = col_type(s, T(0), T(0));
this->value[1] = col_type(T(0), s, T(0));
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1
)
{
this->value[0] = col_type(x0, y0, z0);
this->value[1] = col_type(x1, y1, z1);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
col_type const & v0,
col_type const & v1
)
{
this->value[0] = v0;
this->value[1] = v1;
}
// Conversion
template <typename T>
template <typename U>
inline tmat2x3<T>::tmat2x3
(
tmat2x3<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
template <typename T>
inline tmat2x3<T>::tmat2x3
(
tmat4x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat2x3<T>& tmat2x3<T>::operator=
(
tmat2x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T>& tmat2x3<T>::operator=
(
tmat2x3<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T> & tmat2x3<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T>& tmat2x3<T>::operator+=
(
tmat2x3<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T>& tmat2x3<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T>& tmat2x3<T>::operator-=
(
tmat2x3<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T>& tmat2x3<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x3<T> & tmat2x3<T>::operator*=
(
tmat2x3<U> const & m
)
{
return (*this = tmat2x3<U>(*this * m));
}
template <typename T>
template <typename U>
inline tmat2x3<T> & tmat2x3<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
return *this;
}
template <typename T>
inline tmat2x3<T> & tmat2x3<T>::operator++ ()
{
++this->value[0];
++this->value[1];
return *this;
}
template <typename T>
inline tmat2x3<T> & tmat2x3<T>::operator-- ()
{
--this->value[0];
--this->value[1];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat2x3<T> operator+
(
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s
)
{
return tmat2x3<T>(
m[0] + s,
m[1] + s);
}
template <typename T>
inline tmat2x3<T> operator+
(
tmat2x3<T> const & m1,
tmat2x3<T> const & m2
)
{
return tmat2x3<T>(
m1[0] + m2[0],
m1[1] + m2[1]);
}
template <typename T>
inline tmat2x3<T> operator-
(
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s
)
{
return tmat2x3<T>(
m[0] - s,
m[1] - s);
}
template <typename T>
inline tmat2x3<T> operator-
(
tmat2x3<T> const & m1,
tmat2x3<T> const & m2
)
{
return tmat2x3<T>(
m1[0] - m2[0],
m1[1] - m2[1]);
}
template <typename T>
inline tmat2x3<T> operator*
(
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s
)
{
return tmat2x3<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline tmat2x3<T> operator*
(
typename tmat2x3<T>::value_type const & s,
tmat2x3<T> const & m
)
{
return tmat2x3<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline typename tmat2x3<T>::row_type operator*
(
tmat2x3<T> const & m,
typename tmat2x3<T>::col_type const & v
)
{
return detail::tvec3<T>(
m[0][0] * v.x + m[1][0] * v.y,
m[0][1] * v.x + m[1][1] * v.y,
m[0][2] * v.x + m[1][2] * v.y,
m[0][3] * v.x + m[1][3] * v.y);
}
template <typename T>
inline typename tmat2x3<T>::col_type operator*
(
typename tmat2x3<T>::row_type const & v,
tmat2x3<T> const & m
)
{
return detail::tvec2<T>(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);
}
template <typename T>
inline tmat3x3<T> operator*
(
tmat2x3<T> const & m1,
tmat3x2<T> const & m2
)
{
typename tmat2x3<T>::value_type SrcA00 = m1[0][0];
typename tmat2x3<T>::value_type SrcA01 = m1[0][1];
typename tmat2x3<T>::value_type SrcA02 = m1[0][2];
typename tmat2x3<T>::value_type SrcA10 = m1[1][0];
typename tmat2x3<T>::value_type SrcA11 = m1[1][1];
typename tmat2x3<T>::value_type SrcA12 = m1[1][2];
typename tmat2x3<T>::value_type SrcB00 = m2[0][0];
typename tmat2x3<T>::value_type SrcB01 = m2[0][1];
typename tmat2x3<T>::value_type SrcB10 = m2[1][0];
typename tmat2x3<T>::value_type SrcB11 = m2[1][1];
typename tmat2x3<T>::value_type SrcB20 = m2[2][0];
typename tmat2x3<T>::value_type SrcB21 = m2[2][1];
tmat3x3<T> Result(tmat3x3<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;
return Result;
}
template <typename T>
inline tmat2x3<T> operator/
(
tmat2x3<T> const & m,
typename tmat2x3<T>::value_type const & s
)
{
return tmat2x3<T>(
m[0] / s,
m[1] / s,
m[2] / s);
}
template <typename T>
inline tmat2x3<T> operator/
(
typename tmat2x3<T>::value_type const & s,
tmat2x3<T> const & m
)
{
return tmat2x3<T>(
s / m[0],
s / m[1],
s / m[2]);
}
// Unary constant operators
template <typename T>
inline tmat2x3<T> const operator-
(
tmat2x3<T> const & m
)
{
return tmat2x3<T>(
-m[0],
-m[1]);
}
template <typename T>
inline tmat2x3<T> const operator++
(
tmat2x3<T> const & m,
int
)
{
return tmat2x3<T>(
m[0] + typename tmat2x3<T>::value_type(1),
m[1] + typename tmat2x3<T>::value_type(1));
}
template <typename T>
inline tmat2x3<T> const operator--
(
tmat2x3<T> const & m,
int
)
{
return tmat2x3<T>(
m[0] - typename tmat2x3<T>::value_type(1),
m[1] - typename tmat2x3<T>::value_type(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,212 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-11
// Licence : This source is under MIT License
// File : glm/core/type_mat2x4.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat2x4
#define glm_core_type_mat2x4
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat2x4();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 2 * 4 matrix of floating-point numbers.
template <typename T>
struct tmat2x4
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec4<T> col_type;
typedef tvec2<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat2x4<T> type;
typedef tmat4x2<T> transpose_type;
private:
// Data
col_type value[2];
public:
// Constructors
tmat2x4();
tmat2x4(tmat2x4 const & m);
explicit tmat2x4(
ctor Null);
explicit tmat2x4(
value_type const & s);
explicit tmat2x4(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1);
explicit tmat2x4(
col_type const & v0,
col_type const & v1);
// Conversion
template <typename U>
explicit tmat2x4(tmat2x4<U> const & m);
explicit tmat2x4(tmat2x2<T> const & x);
explicit tmat2x4(tmat3x3<T> const & x);
explicit tmat2x4(tmat4x4<T> const & x);
explicit tmat2x4(tmat2x3<T> const & x);
explicit tmat2x4(tmat3x2<T> const & x);
explicit tmat2x4(tmat3x4<T> const & x);
explicit tmat2x4(tmat4x2<T> const & x);
explicit tmat2x4(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat2x4<T>& operator= (tmat2x4<T> const & m);
template <typename U>
tmat2x4<T>& operator= (tmat2x4<U> const & m);
template <typename U>
tmat2x4<T>& operator+= (U const & s);
template <typename U>
tmat2x4<T>& operator+= (tmat2x4<U> const & m);
template <typename U>
tmat2x4<T>& operator-= (U const & s);
template <typename U>
tmat2x4<T>& operator-= (tmat2x4<U> const & m);
template <typename U>
tmat2x4<T>& operator*= (U const & s);
template <typename U>
tmat2x4<T>& operator*= (tmat2x4<U> const & m);
template <typename U>
tmat2x4<T>& operator/= (U const & s);
tmat2x4<T>& operator++ ();
tmat2x4<T>& operator-- ();
};
// Binary operators
template <typename T>
tmat2x4<T> operator+ (
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s);
template <typename T>
tmat2x4<T> operator+ (
tmat2x4<T> const & m1,
tmat2x4<T> const & m2);
template <typename T>
tmat2x4<T> operator- (
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s);
template <typename T>
tmat2x4<T> operator- (
tmat2x4<T> const & m1,
tmat2x4<T> const & m2);
template <typename T>
tmat2x4<T> operator* (
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s);
template <typename T>
tmat2x4<T> operator* (
typename tmat2x4<T>::value_type const & s,
tmat2x4<T> const & m);
template <typename T>
typename tmat2x4<T>::row_type operator* (
tmat2x4<T> const & m,
typename tmat2x4<T>::col_type const & v);
template <typename T>
typename tmat2x4<T>::col_type operator* (
typename tmat2x4<T>::row_type const & v,
tmat2x4<T> const & m);
template <typename T>
tmat2x4<T> operator* (
tmat2x4<T> const & m1,
tmat2x4<T> const & m2);
template <typename T>
tmat2x4<T> operator/ (
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s);
template <typename T>
tmat2x4<T> operator/ (
typename tmat2x4<T>::value_type const & s,
tmat2x4<T> const & m);
// Unary constant operators
template <typename T>
tmat2x4<T> const operator- (
tmat2x4<T> const & m);
template <typename T>
tmat2x4<T> const operator-- (
tmat2x4<T> const & m,
int);
template <typename T>
tmat2x4<T> const operator++ (
tmat2x4<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 2 columns of 4 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x4<lowp_float> lowp_mat2x4;
//! 2 columns of 4 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x4<mediump_float> mediump_mat2x4;
//! 2 columns of 4 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat2x4<highp_float> highp_mat2x4;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat2x4.inl"
#endif //glm_core_type_mat2x4

View File

@@ -1,539 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat2x4.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat2x4<T>::size_type tmat2x4<T>::col_size()
{
return 4;
}
template <typename T>
inline typename tmat2x4<T>::size_type tmat2x4<T>::row_size()
{
return 2;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat2x4<T>::col_type &
tmat2x4<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat2x4<T>::col_type const &
tmat2x4<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat2x4<T>::tmat2x4()
{
value_type const Zero(0);
value_type const One(1);
this->value[0] = col_type(One, Zero, Zero, Zero);
this->value[1] = col_type(Zero, One, Zero, Zero);
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat2x4<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
ctor
)
{}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero, Zero, Zero);
this->value[1] = col_type(Zero, Zero, Zero, Zero);
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1
)
{
this->value[0] = col_type(x0, y0, z0, w0);
this->value[1] = col_type(x1, y1, z1, w1);
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
col_type const & v0,
col_type const & v1
)
{
this->value[0] = v0;
this->value[1] = v1;
}
// Conversion
template <typename T>
template <typename U>
inline tmat2x4<T>::tmat2x4
(
tmat2x4<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat3x4<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(T(0)));
this->value[1] = col_type(m[1], detail::tvec2<T>(T(0)));
}
template <typename T>
inline tmat2x4<T>::tmat2x4
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat2x4<T>& tmat2x4<T>::operator=
(
tmat2x4<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator=
(
tmat2x4<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator+=
(
tmat2x4<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator-=
(
tmat2x4<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat2x4<T>& tmat2x4<T>::operator*=
(
tmat2x4<U> const & m
)
{
return (*this = tmat2x4<T>(*this * m));
}
template <typename T>
template <typename U>
inline tmat2x4<T> & tmat2x4<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
return *this;
}
template <typename T>
inline tmat2x4<T>& tmat2x4<T>::operator++ ()
{
++this->value[0];
++this->value[1];
return *this;
}
template <typename T>
inline tmat2x4<T>& tmat2x4<T>::operator-- ()
{
--this->value[0];
--this->value[1];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat2x4<T> operator+
(
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s
)
{
return tmat2x4<T>(
m[0] + s,
m[1] + s);
}
template <typename T>
inline tmat2x4<T> operator+
(
tmat2x4<T> const & m1,
tmat2x4<T> const & m2
)
{
return tmat2x4<T>(
m1[0] + m2[0],
m1[1] + m2[1]);
}
template <typename T>
inline tmat2x4<T> operator-
(
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s
)
{
return tmat2x4<T>(
m[0] - s,
m[1] - s);
}
template <typename T>
inline tmat2x4<T> operator-
(
tmat2x4<T> const & m1,
tmat2x4<T> const & m2
)
{
return tmat2x4<T>(
m1[0] - m2[0],
m1[1] - m2[1]);
}
template <typename T>
inline tmat2x4<T> operator*
(
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s
)
{
return tmat2x4<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline tmat2x4<T> operator*
(
typename tmat2x4<T>::value_type const & s,
tmat2x4<T> const & m
)
{
return tmat2x4<T>(
m[0] * s,
m[1] * s);
}
template <typename T>
inline typename tmat2x4<T>::row_type operator*
(
tmat2x4<T> const & m,
typename tmat2x4<T>::col_type const & v
)
{
return typename tmat2x4<T>::row_type(
m[0][0] * v.x + m[1][0] * v.y,
m[0][1] * v.x + m[1][1] * v.y,
m[0][2] * v.x + m[1][2] * v.y,
m[0][3] * v.x + m[1][3] * v.y);
}
template <typename T>
inline typename tmat2x4<T>::col_type operator*
(
typename tmat2x4<T>::row_type const & v,
tmat2x4<T> const & m
)
{
return typename tmat2x4<T>::col_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);
}
template <typename T>
inline tmat4x4<T> operator*
(
tmat2x4<T> const & m1,
tmat4x2<T> const & m2
)
{
typename tmat2x4<T>::value_type SrcA00 = m1[0][0];
typename tmat2x4<T>::value_type SrcA01 = m1[0][1];
typename tmat2x4<T>::value_type SrcA02 = m1[0][2];
typename tmat2x4<T>::value_type SrcA03 = m1[0][3];
typename tmat2x4<T>::value_type SrcA10 = m1[1][0];
typename tmat2x4<T>::value_type SrcA11 = m1[1][1];
typename tmat2x4<T>::value_type SrcA12 = m1[1][2];
typename tmat2x4<T>::value_type SrcA13 = m1[1][3];
typename tmat2x4<T>::value_type SrcB00 = m2[0][0];
typename tmat2x4<T>::value_type SrcB01 = m2[0][1];
typename tmat2x4<T>::value_type SrcB10 = m2[1][0];
typename tmat2x4<T>::value_type SrcB11 = m2[1][1];
typename tmat2x4<T>::value_type SrcB20 = m2[2][0];
typename tmat2x4<T>::value_type SrcB21 = m2[2][1];
typename tmat2x4<T>::value_type SrcB30 = m2[3][0];
typename tmat2x4<T>::value_type SrcB31 = m2[3][1];
tmat4x4<T> Result(tmat4x4<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01;
Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11;
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11;
Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11;
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21;
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21;
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21;
Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21;
Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31;
Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31;
Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31;
Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31;
return Result;
}
template <typename T>
inline tmat2x4<T> operator/
(
tmat2x4<T> const & m,
typename tmat2x4<T>::value_type const & s
)
{
return tmat2x4<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat2x4<T> operator/
(
typename tmat2x4<T>::value_type const & s,
tmat2x4<T> const & m
)
{
return tmat2x4<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
// Unary constant operators
template <typename T>
inline tmat2x4<T> const operator-
(
tmat2x4<T> const & m
)
{
return tmat2x4<T>(
-m[0],
-m[1]);
}
template <typename T>
inline tmat2x4<T> const operator++
(
tmat2x4<T> const & m,
int
)
{
return tmat2x4<T>(
m[0] + typename tmat2x4<T>::value_type(1),
m[1] + typename tmat2x4<T>::value_type(1));
}
template <typename T>
inline tmat2x4<T> const operator--
(
tmat2x4<T> const & m,
int
)
{
return tmat2x4<T>(
m[0] - typename tmat2x4<T>::value_type(1),
m[1] - typename tmat2x4<T>::value_type(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,214 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-05
// Licence : This source is under MIT License
// File : glm/core/type_mat3x2.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat3x2
#define glm_core_type_mat3x2
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat3x2();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 3 * 2 matrix of floating-point numbers.
template <typename T>
struct tmat3x2
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec2<T> col_type;
typedef tvec3<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat3x2<T> type;
typedef tmat2x3<T> transpose_type;
private:
// Data
col_type value[3];
public:
// Constructors
tmat3x2();
tmat3x2(tmat3x2 const & m);
explicit tmat3x2(
ctor);
explicit tmat3x2(
value_type const & s);
explicit tmat3x2(
value_type const & x0, value_type const & y0,
value_type const & x1, value_type const & y1,
value_type const & x2, value_type const & y2);
explicit tmat3x2(
col_type const & v0,
col_type const & v1,
col_type const & v2);
// Conversion
template <typename U>
explicit tmat3x2(tmat3x2<U> const & m);
explicit tmat3x2(tmat2x2<T> const & x);
explicit tmat3x2(tmat3x3<T> const & x);
explicit tmat3x2(tmat4x4<T> const & x);
explicit tmat3x2(tmat2x3<T> const & x);
explicit tmat3x2(tmat2x4<T> const & x);
explicit tmat3x2(tmat3x4<T> const & x);
explicit tmat3x2(tmat4x2<T> const & x);
explicit tmat3x2(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat3x2<T> & operator= (tmat3x2<T> const & m);
template <typename U>
tmat3x2<T> & operator= (tmat3x2<U> const & m);
template <typename U>
tmat3x2<T> & operator+= (U const & s);
template <typename U>
tmat3x2<T> & operator+= (tmat3x2<U> const & m);
template <typename U>
tmat3x2<T> & operator-= (U const & s);
template <typename U>
tmat3x2<T> & operator-= (tmat3x2<U> const & m);
template <typename U>
tmat3x2<T> & operator*= (U const & s);
template <typename U>
tmat3x2<T> & operator*= (tmat3x2<U> const & m);
template <typename U>
tmat3x2<T> & operator/= (U const & s);
tmat3x2<T> & operator++ ();
tmat3x2<T> & operator-- ();
};
// Binary operators
template <typename T>
tmat3x2<T> operator+ (
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s);
template <typename T>
tmat3x2<T> operator+ (
tmat3x2<T> const & m1,
tmat3x2<T> const & m2);
template <typename T>
tmat3x2<T> operator- (
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s);
template <typename T>
tmat3x2<T> operator- (
tmat3x2<T> const & m1,
tmat3x2<T> const & m2);
template <typename T>
tmat3x2<T> operator* (
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s);
template <typename T>
tmat3x2<T> operator* (
typename tmat3x2<T>::value_type const & s,
tmat3x2<T> const & m);
template <typename T>
typename tmat3x2<T>::row_type operator* (
tmat3x2<T> const & m,
typename tmat3x2<T>::col_type const & v);
template <typename T>
typename tmat3x2<T>::col_type operator* (
typename tmat3x2<T>::row_type const & v,
tmat3x2<T> const & m);
template <typename T>
tmat2x2<T> operator* (
tmat3x2<T> const & m1,
tmat2x3<T> const & m2);
template <typename T>
tmat3x2<T> operator/ (
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s);
template <typename T>
tmat3x2<T> operator/ (
typename tmat3x2<T>::value_type const & s,
tmat3x2<T> const & m);
// Unary constant operators
template <typename T>
tmat3x2<T> const operator- (
tmat3x2<T> const & m);
template <typename T>
tmat3x2<T> const operator-- (
tmat3x2<T> const & m,
int);
template <typename T>
tmat3x2<T> const operator++ (
tmat3x2<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 3 columns of 2 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x2<lowp_float> lowp_mat3x2;
//! 3 columns of 2 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x2<mediump_float> mediump_mat3x2;
//! 3 columns of 2 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x2<highp_float> highp_mat3x2;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat3x2.inl"
#endif //glm_core_type_mat3x2

View File

@@ -1,537 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-01-05
// Licence : This source is under MIT License
// File : glm/core/type_mat3x2.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat3x2<T>::size_type tmat3x2<T>::col_size()
{
return 2;
}
template <typename T>
inline typename tmat3x2<T>::size_type tmat3x2<T>::row_size()
{
return 3;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat3x2<T>::col_type &
tmat3x2<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat3x2<T>::col_type const &
tmat3x2<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat3x2<T>::tmat3x2()
{
this->value[0] = col_type(1, 0);
this->value[1] = col_type(0, 1);
this->value[2] = col_type(0, 0);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
value_type const & s
)
{
this->value[0] = col_type(s, 0);
this->value[1] = col_type(0, s);
this->value[2] = col_type(0, 0);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
value_type const & x0, value_type const & y0,
value_type const & x1, value_type const & y1,
value_type const & x2, value_type const & y2
)
{
this->value[0] = col_type(x0, y0);
this->value[1] = col_type(x1, y1);
this->value[2] = col_type(x2, y2);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
col_type const & v0,
col_type const & v1,
col_type const & v2
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
}
// Conversion
template <typename T>
template <typename U>
inline tmat3x2<T>::tmat3x2
(
tmat3x2<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat2x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = col_type(T(0));
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(T(0));
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(T(0));
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat4x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
}
template <typename T>
inline tmat3x2<T>::tmat3x2
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat3x2<T>& tmat3x2<T>::operator=
(
tmat3x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator=
(
tmat3x2<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator+=
(
tmat3x2<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator-=
(
tmat3x2<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x2<T>& tmat3x2<T>::operator*=
(
tmat3x2<U> const & m
)
{
return (*this = tmat3x2<T>(*this * m));
}
template <typename T>
template <typename U>
inline tmat3x2<T> & tmat3x2<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
return *this;
}
template <typename T>
inline tmat3x2<T>& tmat3x2<T>::operator++ ()
{
++this->value[0];
++this->value[1];
++this->value[2];
return *this;
}
template <typename T>
inline tmat3x2<T>& tmat3x2<T>::operator-- ()
{
--this->value[0];
--this->value[1];
--this->value[2];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat3x2<T> operator+
(
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s
)
{
return tmat3x2<T>(
m[0] + s,
m[1] + s,
m[2] + s);
}
template <typename T>
inline tmat3x2<T> operator+
(
tmat3x2<T> const & m1,
tmat3x2<T> const & m2
)
{
return tmat3x2<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2]);
}
template <typename T>
inline tmat3x2<T> operator-
(
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s
)
{
return tmat3x4<T>(
m[0] - s,
m[1] - s,
m[2] - s);
}
template <typename T>
inline tmat3x2<T> operator-
(
tmat3x2<T> const & m1,
tmat3x2<T> const & m2
)
{
return tmat3x2<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2]);
}
template <typename T>
inline tmat3x2<T> operator*
(
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s
)
{
return tmat3x2<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline tmat3x2<T> operator*
(
typename tmat3x2<T>::value_type const & s,
const tmat3x2<T> & m
)
{
return tmat3x2<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline detail::tvec2<T> operator*
(
tmat3x2<T> const & m,
detail::tvec3<T> const & v
)
{
return detail::tvec2<T>(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z);
}
template <typename T>
inline detail::tvec3<T> operator*
(
detail::tvec2<T> const & v,
tmat3x2<T> const & m
)
{
return detail::tvec3<T>(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);
}
template <typename T>
inline tmat2x2<T> operator*
(
tmat3x2<T> const & m1,
tmat2x3<T> const & m2
)
{
const T SrcA00 = m1[0][0];
const T SrcA01 = m1[0][1];
const T SrcA10 = m1[1][0];
const T SrcA11 = m1[1][1];
const T SrcA20 = m1[2][0];
const T SrcA21 = m1[2][1];
const T SrcB00 = m2[0][0];
const T SrcB01 = m2[0][1];
const T SrcB02 = m2[0][2];
const T SrcB10 = m2[1][0];
const T SrcB11 = m2[1][1];
const T SrcB12 = m2[1][2];
tmat2x2<T> Result(tmat2x2<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA01 * SrcB01 + SrcA20 * SrcB02;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
return Result;
}
template <typename T>
inline tmat3x2<T> operator/
(
tmat3x2<T> const & m,
typename tmat3x2<T>::value_type const & s
)
{
return tmat3x2<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat3x2<T> operator/
(
typename tmat3x2<T>::value_type const & s,
tmat3x2<T> const & m
)
{
return tmat3x2<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
// Unary constant operators
template <typename T>
inline tmat3x2<T> const operator-
(
tmat3x2<T> const & m
)
{
return tmat3x2<T>(
-m[0],
-m[1],
-m[2]);
}
template <typename T>
inline tmat3x2<T> const operator++
(
tmat3x2<T> const & m,
int
)
{
typename tmat3x2<T>::value_type One(1);
return tmat3x2<T>(
m[0] + One,
m[1] + One,
m[2] + One);
}
template <typename T>
inline tmat3x2<T> const operator--
(
tmat3x2<T> const & m,
int
)
{
typename tmat3x2<T>::value_type One(1);
return tmat3x2<T>(
m[0] - One,
m[1] - One,
m[2] - One);
}
} //namespace detail
} //namespace glm

View File

@@ -1,244 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-27
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat3x3.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat3x3
#define glm_core_type_mat3x3
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat3x3();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 3 * 3 matrix of floating-point numbers.
template <typename T>
struct tmat3x3
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec3<T> col_type;
typedef tvec3<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat3x3<T> type;
typedef tmat3x3<T> transpose_type;
public:
// Implementation detail
tmat3x3<T> _inverse() const;
private:
// Data
col_type value[3];
public:
// Constructors
tmat3x3();
tmat3x3(tmat3x3 const & m);
explicit tmat3x3(
ctor Null);
explicit tmat3x3(
value_type const & s);
explicit tmat3x3(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1,
value_type const & x2, value_type const & y2, value_type const & z2);
explicit tmat3x3(
col_type const & v0,
col_type const & v1,
col_type const & v2);
// Conversions
template <typename U>
explicit tmat3x3(tmat3x3<U> const & m);
explicit tmat3x3(tmat2x2<T> const & x);
explicit tmat3x3(tmat4x4<T> const & x);
explicit tmat3x3(tmat2x3<T> const & x);
explicit tmat3x3(tmat3x2<T> const & x);
explicit tmat3x3(tmat2x4<T> const & x);
explicit tmat3x3(tmat4x2<T> const & x);
explicit tmat3x3(tmat3x4<T> const & x);
explicit tmat3x3(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat3x3<T>& operator= (tmat3x3<T> const & m);
template <typename U>
tmat3x3<T>& operator= (tmat3x3<U> const & m);
template <typename U>
tmat3x3<T>& operator+= (U const & s);
template <typename U>
tmat3x3<T>& operator+= (tmat3x3<U> const & m);
template <typename U>
tmat3x3<T>& operator-= (U const & s);
template <typename U>
tmat3x3<T>& operator-= (tmat3x3<U> const & m);
template <typename U>
tmat3x3<T>& operator*= (U const & s);
template <typename U>
tmat3x3<T>& operator*= (tmat3x3<U> const & m);
template <typename U>
tmat3x3<T>& operator/= (U const & s);
template <typename U>
tmat3x3<T>& operator/= (tmat3x3<U> const & m);
tmat3x3<T>& operator++ ();
tmat3x3<T>& operator-- ();
};
// Binary operators
template <typename T>
tmat3x3<T> operator+ (
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s);
template <typename T>
tmat3x3<T> operator+ (
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m);
template <typename T>
tmat3x3<T> operator+ (
tmat3x3<T> const & m1,
tmat3x3<T> const & m2);
template <typename T>
tmat3x3<T> operator- (
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s);
template <typename T>
tmat3x3<T> operator- (
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m);
template <typename T>
tmat3x3<T> operator- (
tmat3x3<T> const & m1,
tmat3x3<T> const & m2);
template <typename T>
tmat3x3<T> operator* (
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s);
template <typename T>
tmat3x3<T> operator* (
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m);
template <typename T>
typename tmat3x3<T>::row_type operator* (
tmat3x3<T> const & m,
typename tmat3x3<T>::col_type const & v);
template <typename T>
typename tmat3x3<T>::col_type operator* (
typename tmat3x3<T>::row_type const & v,
tmat3x3<T> const & m);
template <typename T>
tmat3x3<T> operator* (
tmat3x3<T> const & m1,
tmat3x3<T> const & m2);
template <typename T>
tmat3x3<T> operator/ (
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s);
template <typename T>
tmat3x3<T> operator/ (
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m);
template <typename T>
typename tmat3x3<T>::row_type operator/ (
tmat3x3<T> const & m,
typename tmat3x3<T>::col_type const & v);
template <typename T>
typename tmat3x3<T>::col_type operator/ (
typename tmat3x3<T>::row_type const & v,
tmat3x3<T> const & m);
template <typename T>
tmat3x3<T> operator/ (
tmat3x3<T> const & m1,
tmat3x3<T> const & m2);
// Unary constant operators
template <typename T>
tmat3x3<T> const operator- (
tmat3x3<T> const & m);
template <typename T>
tmat3x3<T> const operator-- (
tmat3x3<T> const & m,
int);
template <typename T>
tmat3x3<T> const operator++ (
tmat3x3<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 3 columns of 3 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x3<lowp_float> lowp_mat3x3;
//! 3 columns of 3 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x3<mediump_float> mediump_mat3x3;
//! 3 columns of 3 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x3<highp_float> highp_mat3x3;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat3x3.inl"
#endif //glm_core_type_mat3x3

View File

@@ -1,670 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-27
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat3x3.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat3x3<T>::size_type tmat3x3<T>::col_size()
{
return 3;
}
template <typename T>
inline typename tmat3x3<T>::size_type tmat3x3<T>::row_size()
{
return 3;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat3x3<T>::col_type &
tmat3x3<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat3x3<T>::col_type const &
tmat3x3<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat3x3<T>::tmat3x3()
{
value_type const Zero(0);
value_type const One(1);
this->value[0] = col_type(One, Zero, Zero);
this->value[1] = col_type(Zero, One, Zero);
this->value[2] = col_type(Zero, Zero, One);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat3x3<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
this->value[2] = m.value[2];
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
ctor
)
{}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero, Zero);
this->value[1] = col_type(Zero, s, Zero);
this->value[2] = col_type(Zero, Zero, s);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1,
value_type const & x2, value_type const & y2, value_type const & z2
)
{
this->value[0] = col_type(x0, y0, z0);
this->value[1] = col_type(x1, y1, z1);
this->value[2] = col_type(x2, y2, z2);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
col_type const & v0,
col_type const & v1,
col_type const & v2
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
}
//////////////////////////////////////////////////////////////
// Conversions
template <typename T>
template <typename U>
inline tmat3x3<T>::tmat3x3
(
tmat3x3<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat2x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(1));
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(detail::tvec2<T>(0), value_type(1));
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(1));
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x3<T>::tmat3x3
(
tmat4x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
}
//////////////////////////////////////////////////////////////
// Operators
template <typename T>
inline tmat3x3<T> & tmat3x3<T>::operator=
(
tmat3x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator=
(
tmat3x3<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator+=
(
tmat3x3<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator-=
(
tmat3x3<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator*=
(
tmat3x3<U> const & m
)
{
return (*this = *this * m);
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x3<T> & tmat3x3<T>::operator/=
(
tmat3x3<U> const & m
)
{
return (*this = *this / m);
}
template <typename T>
inline tmat3x3<T> & tmat3x3<T>::operator++ ()
{
this->value[0]++;
this->value[1]++;
this->value[2]++;
return *this;
}
template <typename T>
inline tmat3x3<T> & tmat3x3<T>::operator-- ()
{
this->value[0]--;
this->value[1]--;
this->value[2]--;
return *this;
}
template <typename T>
inline tmat3x3<T> tmat3x3<T>::_inverse() const
{
T S00 = value[0][0];
T S01 = value[0][1];
T S02 = value[0][2];
T S10 = value[1][0];
T S11 = value[1][1];
T S12 = value[1][2];
T S20 = value[2][0];
T S21 = value[2][1];
T S22 = value[2][2];
tmat3x3<T> Inverse(
+ (S11 * S22 - S21 * S12),
- (S10 * S22 - S20 * S12),
+ (S10 * S21 - S20 * S11),
- (S01 * S22 - S21 * S02),
+ (S00 * S22 - S20 * S02),
- (S00 * S21 - S20 * S01),
+ (S01 * S12 - S11 * S02),
- (S00 * S12 - S10 * S02),
+ (S00 * S11 - S10 * S01));
T Determinant = S00 * (S11 * S22 - S21 * S12)
- S10 * (S01 * S22 - S21 * S02)
+ S20 * (S01 * S12 - S11 * S02);
Inverse /= Determinant;
return Inverse;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat3x3<T> operator+
(
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s
)
{
return tmat3x3<T>(
m[0] + s,
m[1] + s,
m[2] + s);
}
template <typename T>
inline tmat3x3<T> operator+
(
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m
)
{
return tmat3x3<T>(
m[0] + s,
m[1] + s,
m[2] + s);
}
template <typename T>
inline tmat3x3<T> operator+
(
tmat3x3<T> const & m1,
tmat3x3<T> const & m2
)
{
return tmat3x3<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2]);
}
template <typename T>
inline tmat3x3<T> operator-
(
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s
)
{
return tmat3x3<T>(
m[0] - s,
m[1] - s,
m[2] - s);
}
template <typename T>
inline tmat3x3<T> operator-
(
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m
)
{
return tmat3x3<T>(
s - m[0],
s - m[1],
s - m[2]);
}
template <typename T>
inline tmat3x3<T> operator-
(
tmat3x3<T> const & m1,
tmat3x3<T> const & m2
)
{
return tmat3x3<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2]);
}
template <typename T>
inline tmat3x3<T> operator*
(
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s
)
{
return tmat3x3<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline tmat3x3<T> operator*
(
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m
)
{
return tmat3x3<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline typename tmat3x3<T>::row_type operator*
(
tmat3x3<T> const & m,
typename tmat3x3<T>::col_type const & v
)
{
return typename tmat3x3<T>::row_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,
m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z);
}
template <typename T>
inline typename tmat3x3<T>::col_type operator*
(
typename tmat3x3<T>::row_type const & v,
tmat3x3<T> const & m
)
{
return typename tmat3x3<T>::col_type(
m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z,
m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z,
m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z);
}
template <typename T>
inline tmat3x3<T> operator*
(
tmat3x3<T> const & m1,
tmat3x3<T> const & m2
)
{
typename tmat3x3<T>::value_type const SrcA00 = m1[0][0];
typename tmat3x3<T>::value_type const SrcA01 = m1[0][1];
typename tmat3x3<T>::value_type const SrcA02 = m1[0][2];
typename tmat3x3<T>::value_type const SrcA10 = m1[1][0];
typename tmat3x3<T>::value_type const SrcA11 = m1[1][1];
typename tmat3x3<T>::value_type const SrcA12 = m1[1][2];
typename tmat3x3<T>::value_type const SrcA20 = m1[2][0];
typename tmat3x3<T>::value_type const SrcA21 = m1[2][1];
typename tmat3x3<T>::value_type const SrcA22 = m1[2][2];
typename tmat3x3<T>::value_type const SrcB00 = m2[0][0];
typename tmat3x3<T>::value_type const SrcB01 = m2[0][1];
typename tmat3x3<T>::value_type const SrcB02 = m2[0][2];
typename tmat3x3<T>::value_type const SrcB10 = m2[1][0];
typename tmat3x3<T>::value_type const SrcB11 = m2[1][1];
typename tmat3x3<T>::value_type const SrcB12 = m2[1][2];
typename tmat3x3<T>::value_type const SrcB20 = m2[2][0];
typename tmat3x3<T>::value_type const SrcB21 = m2[2][1];
typename tmat3x3<T>::value_type const SrcB22 = m2[2][2];
tmat3x3<T> Result(tmat3x3<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;
return Result;
}
template <typename T>
inline tmat3x3<T> operator/
(
tmat3x3<T> const & m,
typename tmat3x3<T>::value_type const & s
)
{
return tmat3x3<T>(
m[0] / s,
m[1] / s,
m[2] / s);
}
template <typename T>
inline tmat3x3<T> operator/
(
typename tmat3x3<T>::value_type const & s,
tmat3x3<T> const & m
)
{
return tmat3x3<T>(
s / m[0],
s / m[1],
s / m[2]);
}
template <typename T>
inline typename tmat3x3<T>::row_type operator/
(
tmat3x3<T> const & m,
typename tmat3x3<T>::col_type const & v
)
{
return m._inverse() * v;
}
template <typename T>
inline typename tmat3x3<T>::col_type operator/
(
typename tmat3x3<T>::row_type const & v,
tmat3x3<T> const & m
)
{
return v * m._inverse();
}
template <typename T>
inline tmat3x3<T> operator/
(
tmat3x3<T> const & m1,
tmat3x3<T> const & m2
)
{
return m1 * m2._inverse();
}
// Unary constant operators
template <typename T>
inline tmat3x3<T> const operator-
(
tmat3x3<T> const & m
)
{
return tmat3x3<T>(
-m[0],
-m[1],
-m[2]);
}
template <typename T>
inline tmat3x3<T> const operator++
(
tmat3x3<T> const & m,
int
)
{
return tmat3x3<T>(
m[0] + T(1),
m[1] + T(1),
m[2] + T(1));
}
template <typename T>
inline tmat3x3<T> const operator--
(
tmat3x3<T> const & m,
int
)
{
return tmat3x3<T>(
m[0] - T(1),
m[1] - T(1),
m[2] - T(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,214 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-05
// Licence : This source is under MIT License
// File : glm/core/type_mat3x4.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat3x4
#define glm_core_type_mat3x4
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat3x4();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 3 * 4 matrix of floating-point numbers.
template <typename T>
struct tmat3x4
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec4<T> col_type;
typedef tvec3<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat3x4<T> type;
typedef tmat4x3<T> transpose_type;
private:
// Data
col_type value[3];
public:
// Constructors
tmat3x4();
tmat3x4(tmat3x4 const & m);
explicit tmat3x4(
ctor Null);
explicit tmat3x4(
value_type const & s);
explicit tmat3x4(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2);
explicit tmat3x4(
col_type const & v0,
col_type const & v1,
col_type const & v2);
// Conversion
template <typename U>
explicit tmat3x4(tmat3x4<U> const & m);
explicit tmat3x4(tmat2x2<T> const & x);
explicit tmat3x4(tmat3x3<T> const & x);
explicit tmat3x4(tmat4x4<T> const & x);
explicit tmat3x4(tmat2x3<T> const & x);
explicit tmat3x4(tmat3x2<T> const & x);
explicit tmat3x4(tmat2x4<T> const & x);
explicit tmat3x4(tmat4x2<T> const & x);
explicit tmat3x4(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat3x4<T> & operator= (tmat3x4<T> const & m);
template <typename U>
tmat3x4<T> & operator= (tmat3x4<U> const & m);
template <typename U>
tmat3x4<T> & operator+= (U const & s);
template <typename U>
tmat3x4<T> & operator+= (tmat3x4<U> const & m);
template <typename U>
tmat3x4<T> & operator-= (U const & s);
template <typename U>
tmat3x4<T> & operator-= (tmat3x4<U> const & m);
template <typename U>
tmat3x4<T> & operator*= (U const & s);
template <typename U>
tmat3x4<T> & operator*= (tmat3x4<U> const & m);
template <typename U>
tmat3x4<T> & operator/= (U const & s);
tmat3x4<T> & operator++ ();
tmat3x4<T> & operator-- ();
};
// Binary operators
template <typename T>
tmat3x4<T> operator+ (
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s);
template <typename T>
tmat3x4<T> operator+ (
tmat3x4<T> const & m1,
tmat3x4<T> const & m2);
template <typename T>
tmat3x4<T> operator- (
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s);
template <typename T>
tmat3x4<T> operator- (
tmat3x4<T> const & m1,
tmat3x4<T> const & m2);
template <typename T>
tmat3x4<T> operator* (
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s);
template <typename T>
tmat3x4<T> operator* (
typename tmat3x4<T>::value_type const & s,
tmat3x4<T> const & m);
template <typename T>
typename tmat3x4<T>::row_type operator* (
tmat3x4<T> const & m,
typename tmat3x4<T>::col_type const & v);
template <typename T>
typename tmat3x4<T>::col_type operator* (
typename tmat3x4<T>::row_type const & v,
tmat3x4<T> const & m);
template <typename T>
tmat4x4<T> operator* (
tmat3x4<T> const & m1,
tmat4x3<T> const & m2);
template <typename T>
tmat3x4<T> operator/ (
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s);
template <typename T>
tmat3x4<T> operator/ (
typename tmat3x4<T>::value_type const & s,
tmat3x4<T> const & m);
// Unary constant operators
template <typename T>
tmat3x4<T> const operator- (
tmat3x4<T> const & m);
template <typename T>
tmat3x4<T> const operator-- (
tmat3x4<T> const & m,
int);
template <typename T>
tmat3x4<T> const operator++ (
tmat3x4<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 3 columns of 4 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x4<lowp_float> lowp_mat3x4;
//! 3 columns of 4 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x4<mediump_float> mediump_mat3x4;
//! 3 columns of 4 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat3x4<highp_float> highp_mat3x4;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat3x4.inl"
#endif //glm_core_type_mat3x4

View File

@@ -1,583 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-05
// Updated : 2010-02-05
// Licence : This source is under MIT License
// File : glm/core/type_mat3x4.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat3x4<T>::size_type tmat3x4<T>::col_size()
{
return 4;
}
template <typename T>
inline typename tmat3x4<T>::size_type tmat3x4<T>::row_size()
{
return 3;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat3x4<T>::col_type &
tmat3x4<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat3x4<T>::col_type const &
tmat3x4<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat3x4<T>::tmat3x4()
{
value_type const Zero(0);
value_type const One(1);
this->value[0] = col_type(1, 0, 0, 0);
this->value[1] = col_type(0, 1, 0, 0);
this->value[2] = col_type(0, 0, 1, 0);
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat3x4<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
this->value[2] = m.value[2];
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
ctor
)
{}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero, Zero, Zero);
this->value[1] = col_type(Zero, s, Zero, Zero);
this->value[2] = col_type(Zero, Zero, s, Zero);
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2
)
{
this->value[0] = col_type(x0, y0, z0, w0);
this->value[1] = col_type(x1, y1, z1, w1);
this->value[2] = col_type(x2, y2, z2, w2);
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
col_type const & v0,
col_type const & v1,
col_type const & v2
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
}
// Conversion
template <typename T>
template <typename U>
inline tmat3x4<T>::tmat3x4
(
tmat3x4<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
this->value[2] = col_type(T(0), T(0), T(1), T(0));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
this->value[2] = col_type(m[2], T(0));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
this->value[2] = col_type(T(0), T(0), T(1), T(0));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
this->value[2] = col_type(m[2], T(0), T(1));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(T(0), T(0), T(1), T(0));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(T(0)));
this->value[1] = col_type(m[1], detail::tvec2<T>(T(0)));
this->value[2] = col_type(m[2], detail::tvec2<T>(T(1), T(0)));
}
template <typename T>
inline tmat3x4<T>::tmat3x4
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
this->value[2] = col_type(m[2], T(0));
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat3x4<T>& tmat3x4<T>::operator=
(
tmat3x4<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator=
(
tmat3x4<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator+=
(
tmat3x4<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator-=
(
tmat3x4<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat3x4<T>& tmat3x4<T>::operator*=
(
tmat3x4<U> const & m
)
{
return (*this = tmat3x4<T>(*this * m));
}
template <typename T>
template <typename U>
inline tmat3x4<T> & tmat3x4<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
return *this;
}
template <typename T>
inline tmat3x4<T>& tmat3x4<T>::operator++ ()
{
++this->value[0];
++this->value[1];
++this->value[2];
return *this;
}
template <typename T>
inline tmat3x4<T>& tmat3x4<T>::operator-- ()
{
--this->value[0];
--this->value[1];
--this->value[2];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat3x4<T> operator+
(
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s
)
{
return tmat3x4<T>(
m[0] + s,
m[1] + s,
m[2] + s);
}
template <typename T>
inline tmat3x4<T> operator+
(
tmat3x4<T> const & m1,
tmat3x4<T> const & m2
)
{
return tmat3x4<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2]);
}
template <typename T>
inline tmat3x4<T> operator-
(
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s
)
{
return tmat3x4<T>(
m[0] - s,
m[1] - s,
m[2] - s);
}
template <typename T>
inline tmat3x4<T> operator-
(
tmat3x4<T> const & m1,
tmat3x4<T> const & m2
)
{
return tmat3x4<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2]);
}
template <typename T>
inline tmat3x4<T> operator*
(
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s
)
{
return tmat3x4<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline tmat3x4<T> operator*
(
typename tmat3x4<T>::value_type const & s,
tmat3x4<T> const & m
)
{
return tmat3x4<T>(
m[0] * s,
m[1] * s,
m[2] * s);
}
template <typename T>
inline typename tmat3x4<T>::row_type operator*
(
tmat3x4<T> const & m,
typename tmat3x4<T>::col_type const & v
)
{
return typename tmat3x4<T>::row_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z,
m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z,
m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z);
}
template <typename T>
inline typename tmat3x4<T>::col_type operator*
(
typename tmat3x4<T>::row_type const & v,
tmat3x4<T> const & m
)
{
return typename tmat3x4<T>::col_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w,
m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w);
}
template <typename T>
inline tmat4x4<T> operator*
(
tmat3x4<T> const & m1,
tmat4x3<T> const & m2
)
{
const T SrcA00 = m1[0][0];
const T SrcA01 = m1[0][1];
const T SrcA02 = m1[0][2];
const T SrcA03 = m1[0][3];
const T SrcA10 = m1[1][0];
const T SrcA11 = m1[1][1];
const T SrcA12 = m1[1][2];
const T SrcA13 = m1[1][3];
const T SrcA20 = m1[2][0];
const T SrcA21 = m1[2][1];
const T SrcA22 = m1[2][2];
const T SrcA23 = m1[2][3];
const T SrcB00 = m2[0][0];
const T SrcB01 = m2[0][1];
const T SrcB02 = m2[0][2];
const T SrcB10 = m2[1][0];
const T SrcB11 = m2[1][1];
const T SrcB12 = m2[1][2];
const T SrcB20 = m2[2][0];
const T SrcB21 = m2[2][1];
const T SrcB22 = m2[2][2];
const T SrcB30 = m2[3][0];
const T SrcB31 = m2[3][1];
const T SrcB32 = m2[3][2];
tmat4x4<T> Result(tmat4x4<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02;
Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12;
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12;
Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12;
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22;
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22;
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22;
Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22;
Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32;
Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32;
Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32;
Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32;
return Result;
}
template <typename T>
inline tmat3x4<T> operator/
(
tmat3x4<T> const & m,
typename tmat3x4<T>::value_type const & s
)
{
return tmat3x4<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat3x4<T> operator/
(
typename tmat3x4<T>::value_type const & s,
tmat3x4<T> const & m
)
{
return tmat3x4<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
// Unary constant operators
template <typename T>
inline tmat3x4<T> const operator-
(
tmat3x4<T> const & m
)
{
return tmat3x4<T>(
-m[0],
-m[1],
-m[2]);
}
template <typename T>
inline tmat3x4<T> const operator++
(
tmat3x4<T> const & m,
int
)
{
return tmat3x4<T>(
m[0] + T(1),
m[1] + T(1),
m[2] + T(1));
}
template <typename T>
inline tmat3x4<T> const operator--
(
tmat3x4<T> const & m,
int
)
{
return tmat3x4<T>(
m[0] - T(1),
m[1] - T(1),
m[2] - T(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,216 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-10-01
// Updated : 2010-02-11
// Licence : This source is under MIT License
// File : glm/core/type_mat4x2.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat4x2
#define glm_core_type_mat4x2
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat4x2();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 4 columns and 2 rows matrix of floating-point numbers.
template <typename T>
struct tmat4x2
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec2<T> col_type;
typedef tvec4<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat4x2<T> type;
typedef tmat2x4<T> transpose_type;
private:
// Data
col_type value[4];
public:
// Constructors
tmat4x2();
tmat4x2(tmat4x2 const & m);
explicit tmat4x2(
ctor Null);
explicit tmat4x2(
value_type const & x);
explicit tmat4x2(
value_type const & x0, value_type const & y0,
value_type const & x1, value_type const & y1,
value_type const & x2, value_type const & y2,
value_type const & x3, value_type const & y3);
explicit tmat4x2(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3);
// Conversions
template <typename U>
explicit tmat4x2(tmat4x2<U> const & m);
explicit tmat4x2(tmat2x2<T> const & x);
explicit tmat4x2(tmat3x3<T> const & x);
explicit tmat4x2(tmat4x4<T> const & x);
explicit tmat4x2(tmat2x3<T> const & x);
explicit tmat4x2(tmat3x2<T> const & x);
explicit tmat4x2(tmat2x4<T> const & x);
explicit tmat4x2(tmat4x3<T> const & x);
explicit tmat4x2(tmat3x4<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat4x2<T>& operator= (tmat4x2<T> const & m);
template <typename U>
tmat4x2<T>& operator= (tmat4x2<U> const & m);
template <typename U>
tmat4x2<T>& operator+= (U const & s);
template <typename U>
tmat4x2<T>& operator+= (tmat4x2<U> const & m);
template <typename U>
tmat4x2<T>& operator-= (U const & s);
template <typename U>
tmat4x2<T>& operator-= (tmat4x2<U> const & m);
template <typename U>
tmat4x2<T>& operator*= (U const & s);
template <typename U>
tmat4x2<T>& operator*= (tmat4x2<U> const & m);
template <typename U>
tmat4x2<T>& operator/= (U const & s);
tmat4x2<T>& operator++ ();
tmat4x2<T>& operator-- ();
};
// Binary operators
template <typename T>
tmat4x2<T> operator+ (
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s);
template <typename T>
tmat4x2<T> operator+ (
tmat4x2<T> const & m1,
tmat4x2<T> const & m2);
template <typename T>
tmat4x2<T> operator- (
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s);
template <typename T>
tmat4x2<T> operator- (
tmat4x2<T> const & m1,
tmat4x2<T> const & m2);
template <typename T>
tmat4x2<T> operator* (
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s);
template <typename T>
tmat4x2<T> operator* (
typename tmat4x2<T>::value_type const & s,
tmat4x2<T> const & m);
template <typename T>
typename tmat4x2<T>::row_type operator* (
tmat4x2<T> const & m,
typename tmat4x2<T>::col_type const & v);
template <typename T>
typename tmat4x2<T>::col_type operator* (
typename tmat4x2<T>::row_type const & v,
tmat4x2<T> const & m);
template <typename T>
tmat2x2<T> operator* (
tmat4x2<T> const & m1,
tmat2x4<T> const & m2);
template <typename T>
tmat4x2<T> operator/ (
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s);
template <typename T>
tmat4x2<T> operator/ (
typename tmat4x2<T>::value_type const & s,
tmat4x2<T> const & m);
// Unary constant operators
template <typename T>
tmat4x2<T> const operator- (
tmat4x2<T> const & m);
template <typename T>
tmat4x2<T> const operator-- (
tmat4x2<T> const & m,
int);
template <typename T>
tmat4x2<T> const operator++ (
tmat4x2<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 4 columns of 2 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x2<lowp_float> lowp_mat4x2;
//! 4 columns of 2 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x2<mediump_float> mediump_mat4x2;
//! 4 columns of 2 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x2<highp_float> highp_mat4x2;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat4x2.inl"
#endif //glm_core_type_mat4x2

View File

@@ -1,597 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-10-01
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_mat4x2.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat4x2<T>::size_type tmat4x2<T>::col_size()
{
return 2;
}
template <typename T>
inline typename tmat4x2<T>::size_type tmat4x2<T>::row_size()
{
return 4;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat4x2<T>::col_type &
tmat4x2<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat4x2<T>::col_type const &
tmat4x2<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat4x2<T>::tmat4x2()
{
value_type const Zero(0);
value_type const One(1);
this->value[0] = col_type(One, Zero);
this->value[1] = col_type(Zero, One);
this->value[2] = col_type(Zero, Zero);
this->value[3] = col_type(Zero, Zero);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat4x2<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
this->value[2] = m.value[2];
this->value[3] = m.value[3];
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
ctor
)
{}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero);
this->value[1] = col_type(Zero, s);
this->value[2] = col_type(Zero, Zero);
this->value[3] = col_type(Zero, Zero);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
value_type const & x0, value_type const & y0,
value_type const & x1, value_type const & y1,
value_type const & x2, value_type const & y2,
value_type const & x3, value_type const & y3
)
{
this->value[0] = col_type(x0, y0);
this->value[1] = col_type(x1, y1);
this->value[2] = col_type(x2, y2);
this->value[3] = col_type(x3, y3);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
this->value[3] = v3;
}
// Conversion
template <typename T>
template <typename U>
inline tmat4x2<T>::tmat4x2
(
tmat4x2<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(value_type(0));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(value_type(0));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(value_type(0));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x2<T>::tmat4x2
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(value_type(0));
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat4x2<T>& tmat4x2<T>::operator=
(
tmat4x2<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T>& tmat4x2<T>::operator=
(
tmat4x2<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
this->value[3] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator+=
(
tmat4x2<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
this->value[3] += m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
this->value[3] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator-=
(
tmat4x2<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
this->value[3] -= m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
this->value[3] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator*=
(
tmat4x2<U> const & m
)
{
return (*this = tmat4x2<T>(*this * m));
}
template <typename T>
template <typename U>
inline tmat4x2<T> & tmat4x2<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
this->value[3] /= s;
return *this;
}
template <typename T>
inline tmat4x2<T> & tmat4x2<T>::operator++ ()
{
++this->value[0];
++this->value[1];
++this->value[2];
++this->value[3];
return *this;
}
template <typename T>
inline tmat4x2<T> & tmat4x2<T>::operator-- ()
{
--this->value[0];
--this->value[1];
--this->value[2];
--this->value[3];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat4x2<T> operator+
(
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s
)
{
return tmat4x2<T>(
m[0] + s,
m[1] + s,
m[2] + s,
m[3] + s);
}
template <typename T>
inline tmat4x2<T> operator+
(
tmat4x2<T> const & m1,
tmat4x2<T> const & m2
)
{
return tmat4x2<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2],
m1[3] + m2[3]);
}
template <typename T>
inline tmat4x2<T> operator-
(
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s
)
{
return tmat4x2<T>(
m[0] - s,
m[1] - s,
m[2] - s,
m[3] - s);
}
template <typename T>
inline tmat4x2<T> operator-
(
tmat4x2<T> const & m1,
tmat4x2<T> const & m2
)
{
return tmat4x2<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2],
m1[3] - m2[3]);
}
template <typename T>
inline tmat4x2<T> operator*
(
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s
)
{
return tmat4x2<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline tmat4x2<T> operator*
(
typename tmat4x2<T>::value_type const & s,
tmat4x2<T> const & m
)
{
return tmat4x2<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline typename tmat4x2<T>::row_type operator*
(
tmat4x2<T> const & m,
typename tmat4x2<T>::col_type const & v
)
{
return typename tmat4x2<T>::row_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w);
}
template <typename T>
inline typename tmat4x2<T>::row_type operator*
(
typename tmat4x2<T>::row_type const & v,
tmat4x2<T> const & m
)
{
return typename tmat4x2<T>::row_type(
v.x * m[0][0] + v.y * m[0][1],
v.x * m[1][0] + v.y * m[1][1],
v.x * m[2][0] + v.y * m[2][1],
v.x * m[3][0] + v.y * m[3][1]);
}
template <typename T>
inline tmat2x2<T> operator*
(
tmat4x2<T> const & m1,
tmat2x4<T> const & m2
)
{
T const SrcA00 = m1[0][0];
T const SrcA01 = m1[0][1];
T const SrcA10 = m1[1][0];
T const SrcA11 = m1[1][1];
T const SrcA20 = m1[2][0];
T const SrcA21 = m1[2][1];
T const SrcA30 = m1[3][0];
T const SrcA31 = m1[3][1];
T const SrcB00 = m2[0][0];
T const SrcB01 = m2[0][1];
T const SrcB02 = m2[0][2];
T const SrcB03 = m2[0][3];
T const SrcB10 = m2[1][0];
T const SrcB11 = m2[1][1];
T const SrcB12 = m2[1][2];
T const SrcB13 = m2[1][3];
tmat2x2<T> Result(tmat2x2<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA01 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;
return Result;
}
template <typename T>
inline tmat4x2<T> operator/
(
tmat4x2<T> const & m,
typename tmat4x2<T>::value_type const & s
)
{
return tmat4x2<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat4x2<T> operator/
(
typename tmat4x2<T>::value_type const & s,
tmat4x2<T> const & m
)
{
return tmat4x2<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
// Unary constant operators
template <typename T>
inline tmat4x2<T> const operator-
(
tmat4x2<T> const & m
)
{
return tmat4x2<T>(
-m[0],
-m[1],
-m[2],
-m[3]);
}
template <typename T>
inline tmat4x2<T> const operator++
(
tmat4x2<T> const & m,
int
)
{
return tmat4x2<T>(
m[0] + typename tmat4x2<T>::value_type(1),
m[1] + typename tmat4x2<T>::value_type(1),
m[2] + typename tmat4x2<T>::value_type(1),
m[3] + typename tmat4x2<T>::value_type(1));
}
template <typename T>
inline tmat4x2<T> const operator--
(
tmat4x2<T> const & m,
int
)
{
return tmat4x2<T>(
m[0] - typename tmat4x2<T>::value_type(1),
m[1] - typename tmat4x2<T>::value_type(1),
m[2] - typename tmat4x2<T>::value_type(1),
m[3] - typename tmat4x2<T>::value_type(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,216 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-08-04
// Updated : 2010-02-11
// Licence : This source is under MIT License
// File : glm/core/type_mat4x3.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat4x3
#define glm_core_type_mat4x3
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat4x3();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 4 * 3 matrix of floating-point numbers.
template <typename T>
struct tmat4x3
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec3<T> col_type;
typedef tvec4<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat4x3<T> type;
typedef tmat3x4<T> transpose_type;
private:
// Data
col_type value[4];
public:
// Constructors
tmat4x3();
tmat4x3(tmat4x3 const & m);
explicit tmat4x3(
ctor Null);
explicit tmat4x3(
value_type const & x);
explicit tmat4x3(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1,
value_type const & x2, value_type const & y2, value_type const & z2,
value_type const & x3, value_type const & y3, value_type const & z3);
explicit tmat4x3(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3);
// Conversion
template <typename U>
explicit tmat4x3(tmat4x3<U> const & m);
explicit tmat4x3(tmat2x2<T> const & x);
explicit tmat4x3(tmat3x3<T> const & x);
explicit tmat4x3(tmat4x4<T> const & x);
explicit tmat4x3(tmat2x3<T> const & x);
explicit tmat4x3(tmat3x2<T> const & x);
explicit tmat4x3(tmat2x4<T> const & x);
explicit tmat4x3(tmat4x2<T> const & x);
explicit tmat4x3(tmat3x4<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat4x3<T> & operator= (tmat4x3<T> const & m);
template <typename U>
tmat4x3<T> & operator= (tmat4x3<U> const & m);
template <typename U>
tmat4x3<T> & operator+= (U const & s);
template <typename U>
tmat4x3<T> & operator+= (tmat4x3<U> const & m);
template <typename U>
tmat4x3<T> & operator-= (U const & s);
template <typename U>
tmat4x3<T> & operator-= (tmat4x3<U> const & m);
template <typename U>
tmat4x3<T> & operator*= (U const & s);
template <typename U>
tmat4x3<T> & operator*= (tmat4x3<U> const & m);
template <typename U>
tmat4x3<T> & operator/= (U const & s);
tmat4x3<T> & operator++ ();
tmat4x3<T> & operator-- ();
};
// Binary operators
template <typename T>
tmat4x3<T> operator+ (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s);
template <typename T>
tmat4x3<T> operator+ (
tmat4x3<T> const & m1,
tmat4x3<T> const & m2);
template <typename T>
tmat4x3<T> operator- (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s);
template <typename T>
tmat4x3<T> operator- (
tmat4x3<T> const & m1,
tmat4x3<T> const & m2);
template <typename T>
tmat4x3<T> operator* (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s);
template <typename T>
tmat4x3<T> operator* (
typename tmat4x3<T>::value_type const & s,
tmat4x3<T> const & m);
template <typename T>
typename tmat4x3<T>::row_type operator* (
tmat4x3<T> const & m,
typename tmat4x3<T>::col_type const & v);
template <typename T>
typename tmat4x3<T>::col_type operator* (
typename tmat4x3<T>::row_type const & v,
tmat4x3<T> const & m);
template <typename T>
tmat3x3<T> operator* (
tmat4x3<T> const & m1,
tmat3x4<T> const & m2);
template <typename T>
tmat4x3<T> operator/ (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s);
template <typename T>
tmat4x3<T> operator/ (
typename tmat4x3<T>::value_type const & s,
tmat4x3<T> const & m);
// Unary constant operators
template <typename T>
tmat4x3<T> const operator- (
tmat4x3<T> const & m);
template <typename T>
tmat4x3<T> const operator-- (
tmat4x3<T> const & m,
int);
template <typename T>
tmat4x3<T> const operator++ (
tmat4x3<T> const & m,
int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 4 columns of 3 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x3<lowp_float> lowp_mat4x3;
//! 4 columns of 3 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x3<mediump_float> mediump_mat4x3;
//! 4 columns of 3 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x3<highp_float> highp_mat4x3;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat4x3.inl"
#endif//glm_core_type_mat4x3

View File

@@ -1,598 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2006-04-17
// Updated : 2010-02-02
// Licence : This source is under MIT License
// File : glm/core/type_mat4x3.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat4x3<T>::size_type tmat4x3<T>::col_size()
{
return 3;
}
template <typename T>
inline typename tmat4x3<T>::size_type tmat4x3<T>::row_size()
{
return 4;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat4x3<T>::col_type &
tmat4x3<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat4x3<T>::col_type const &
tmat4x3<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat4x3<T>::tmat4x3()
{
value_type const Zero(0);
value_type const One(1);
this->value[0] = col_type(One, Zero, Zero);
this->value[1] = col_type(Zero, One, Zero);
this->value[2] = col_type(Zero, Zero, One);
this->value[3] = col_type(Zero, Zero, Zero);
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat4x3<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
this->value[2] = m.value[2];
this->value[3] = m.value[3];
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
ctor
)
{}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero, Zero);
this->value[1] = col_type(Zero, s, Zero);
this->value[2] = col_type(Zero, Zero, s);
this->value[3] = col_type(Zero, Zero, Zero);
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
value_type const & x0, value_type const & y0, value_type const & z0,
value_type const & x1, value_type const & y1, value_type const & z1,
value_type const & x2, value_type const & y2, value_type const & z2,
value_type const & x3, value_type const & y3, value_type const & z3
)
{
this->value[0] = col_type(x0, y0, z0);
this->value[1] = col_type(x1, y1, z1);
this->value[2] = col_type(x2, y2, z2);
this->value[3] = col_type(x3, y3, z3);
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
this->value[3] = v3;
}
//////////////////////////////////////////////////////////////
// Conversions
template <typename T>
template <typename U>
inline tmat4x3<T>::tmat4x3
(
tmat4x3<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(1));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat4x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(value_type(0), value_type(0), value_type(1));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(1));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat2x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(value_type(0), value_type(0), value_type(1));
this->value[3] = col_type(value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(1));
this->value[3] = col_type(m[3], value_type(0));
}
template <typename T>
inline tmat4x3<T>::tmat4x3
(
tmat3x4<T> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(value_type(0));
}
//////////////////////////////////////////////////////////////
// Unary updatable operators
template <typename T>
inline tmat4x3<T>& tmat4x3<T>::operator=
(
tmat4x3<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T>& tmat4x3<T>::operator=
(
tmat4x3<U> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
this->value[3] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator+=
(
tmat4x3<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
this->value[3] += m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
this->value[3] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator-=
(
tmat4x3<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
this->value[3] -= m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
this->value[3] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator*=
(
tmat4x3<U> const & m
)
{
return (*this = tmat4x3<T>(*this * m));
}
template <typename T>
template <typename U>
inline tmat4x3<T> & tmat4x3<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
this->value[3] /= s;
return *this;
}
template <typename T>
inline tmat4x3<T> & tmat4x3<T>::operator++ ()
{
++this->value[0];
++this->value[1];
++this->value[2];
++this->value[3];
return *this;
}
template <typename T>
inline tmat4x3<T> & tmat4x3<T>::operator-- ()
{
--this->value[0];
--this->value[1];
--this->value[2];
--this->value[3];
return *this;
}
//////////////////////////////////////////////////////////////
// Binary operators
template <typename T>
inline tmat4x3<T> operator+ (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s)
{
return tmat4x3<T>(
m[0] + s,
m[1] + s,
m[2] + s,
m[3] + s);
}
template <typename T>
inline tmat4x3<T> operator+ (
tmat4x3<T> const & m1,
tmat4x3<T> const & m2)
{
return tmat4x3<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2],
m1[3] + m2[3]);
}
template <typename T>
inline tmat4x3<T> operator- (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s)
{
return tmat4x3<T>(
m[0] - s,
m[1] - s,
m[2] - s,
m[3] - s);
}
template <typename T>
inline tmat4x3<T> operator- (
tmat4x3<T> const & m1,
tmat4x3<T> const & m2)
{
return tmat4x3<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2],
m1[3] - m2[3]);
}
template <typename T>
inline tmat4x3<T> operator* (
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s)
{
return tmat4x3<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline tmat4x3<T> operator* (
typename tmat4x3<T>::value_type const & s,
tmat4x3<T> const & m)
{
return tmat4x3<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline typename tmat4x3<T>::row_type operator* (
tmat4x3<T> const & m,
typename tmat4x3<T>::col_type const & v)
{
return row_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w,
m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w);
}
template <typename T>
inline typename tmat4x3<T>::col_type operator* (
typename tmat4x3<T>::row_type const & v,
tmat4x3<T> const & m)
{
return col_type(
v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2],
v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2],
v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2],
v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]);
}
template <typename T>
inline tmat3x3<T> operator*
(
tmat4x3<T> const & m1,
tmat3x4<T> const & m2
)
{
T const SrcA00 = m1[0][0];
T const SrcA01 = m1[0][1];
T const SrcA02 = m1[0][2];
T const SrcA10 = m1[1][0];
T const SrcA11 = m1[1][1];
T const SrcA12 = m1[1][2];
T const SrcA20 = m1[2][0];
T const SrcA21 = m1[2][1];
T const SrcA22 = m1[2][2];
T const SrcA30 = m1[3][0];
T const SrcA31 = m1[3][1];
T const SrcA32 = m1[3][2];
T const SrcB00 = m2[0][0];
T const SrcB01 = m2[0][1];
T const SrcB02 = m2[0][2];
T const SrcB03 = m2[0][3];
T const SrcB10 = m2[1][0];
T const SrcB11 = m2[1][1];
T const SrcB12 = m2[1][2];
T const SrcB13 = m2[1][3];
T const SrcB20 = m2[2][0];
T const SrcB21 = m2[2][1];
T const SrcB22 = m2[2][2];
T const SrcB23 = m2[2][3];
tmat3x3<T> Result(tmat3x3<T>::null);
Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03;
Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03;
Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03;
Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13;
Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13;
Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13;
Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23;
Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23;
Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23;
return Result;
}
template <typename T>
inline tmat4x3<T> operator/
(
tmat4x3<T> const & m,
typename tmat4x3<T>::value_type const & s
)
{
return tmat4x3<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat4x3<T> operator/
(
typename tmat4x3<T>::value_type const & s,
tmat4x3<T> const & m
)
{
return tmat4x3<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
// Unary constant operators
template <typename T>
inline tmat4x3<T> const operator-
(
tmat4x3<T> const & m
)
{
return tmat4x3<T>(
-m[0],
-m[1],
-m[2],
-m[3]);
}
template <typename T>
inline tmat4x3<T> const operator++
(
tmat4x3<T> const & m,
int
)
{
return tmat4x3<T>(
m[0] + T(1),
m[1] + T(1),
m[2] + T(1),
m[3] + T(1));
}
template <typename T>
inline tmat4x3<T> const operator--
(
tmat4x3<T> const & m,
int
)
{
return tmat4x3<T>(
m[0] - T(1),
m[1] - T(1),
m[2] - T(1),
m[3] - T(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,244 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-27
// Updated : 2008-08-30
// Licence : This source is under MIT License
// File : glm/core/type_mat4x4.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_mat4x4
#define glm_core_type_mat4x4
#include "type_mat.hpp"
namespace glm
{
namespace test
{
void main_mat4x4();
}//namespace test
namespace detail
{
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T> struct tmat2x2;
template <typename T> struct tmat2x3;
template <typename T> struct tmat2x4;
template <typename T> struct tmat3x2;
template <typename T> struct tmat3x3;
template <typename T> struct tmat3x4;
template <typename T> struct tmat4x2;
template <typename T> struct tmat4x3;
template <typename T> struct tmat4x4;
//!< \brief Template for 4 * 4 matrix of floating-point numbers.
template <typename T>
struct tmat4x4
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
typedef tvec4<T> col_type;
typedef tvec4<T> row_type;
static size_type col_size();
static size_type row_size();
typedef tmat4x4<T> type;
typedef tmat4x4<T> transpose_type;
public:
// Implementation detail
tmat4x4<T> _inverse() const;
private:
// Data
col_type value[4];
public:
// Constructors
tmat4x4();
tmat4x4(tmat4x4 const & m);
explicit tmat4x4(
ctor Null);
explicit tmat4x4(
value_type const & x);
explicit tmat4x4(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2,
value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3);
explicit tmat4x4(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3);
// Conversions
template <typename U>
explicit tmat4x4(tmat4x4<U> const & m);
explicit tmat4x4(tmat2x2<T> const & x);
explicit tmat4x4(tmat3x3<T> const & x);
explicit tmat4x4(tmat2x3<T> const & x);
explicit tmat4x4(tmat3x2<T> const & x);
explicit tmat4x4(tmat2x4<T> const & x);
explicit tmat4x4(tmat4x2<T> const & x);
explicit tmat4x4(tmat3x4<T> const & x);
explicit tmat4x4(tmat4x3<T> const & x);
// Accesses
col_type & operator[](size_type i);
col_type const & operator[](size_type i) const;
// Unary updatable operators
tmat4x4<T> & operator= (tmat4x4<T> const & m);
template <typename U>
tmat4x4<T> & operator= (tmat4x4<U> const & m);
template <typename U>
tmat4x4<T> & operator+= (U const & s);
template <typename U>
tmat4x4<T> & operator+= (tmat4x4<U> const & m);
template <typename U>
tmat4x4<T> & operator-= (U const & s);
template <typename U>
tmat4x4<T> & operator-= (tmat4x4<U> const & m);
template <typename U>
tmat4x4<T> & operator*= (U const & s);
template <typename U>
tmat4x4<T> & operator*= (tmat4x4<U> const & m);
template <typename U>
tmat4x4<T> & operator/= (U const & s);
template <typename U>
tmat4x4<T> & operator/= (tmat4x4<U> const & m);
tmat4x4<T> & operator++ ();
tmat4x4<T> & operator-- ();
};
// Binary operators
template <typename T>
tmat4x4<T> operator+ (
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s);
template <typename T>
tmat4x4<T> operator+ (
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m);
template <typename T>
tmat4x4<T> operator+ (
tmat4x4<T> const & m1,
tmat4x4<T> const & m2);
template <typename T>
tmat4x4<T> operator- (
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s);
template <typename T>
tmat4x4<T> operator- (
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m);
template <typename T>
tmat4x4<T> operator- (
tmat4x4<T> const & m1,
tmat4x4<T> const & m2);
template <typename T>
tmat4x4<T> operator* (
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s);
template <typename T>
tmat4x4<T> operator* (
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m);
template <typename T>
typename tmat4x4<T>::row_type operator* (
tmat4x4<T> const & m,
typename tmat4x4<T>::col_type const & v);
template <typename T>
typename tmat4x4<T>::col_type operator* (
typename tmat4x4<T>::row_type const & v,
tmat4x4<T> const & m);
template <typename T>
tmat4x4<T> operator* (
tmat4x4<T> const & m1,
tmat4x4<T> const & m2);
template <typename T>
tmat4x4<T> operator/ (
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s);
template <typename T>
tmat4x4<T> operator/ (
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m);
template <typename T>
typename tmat4x4<T>::row_type operator/ (
tmat4x4<T> const & m,
typename tmat4x4<T>::col_type const & v);
template <typename T>
typename tmat4x4<T>::col_type operator/ (
typename tmat4x4<T>::row_type & v,
tmat4x4<T> const & m);
template <typename T>
tmat4x4<T> operator/ (
tmat4x4<T> const & m1,
tmat4x4<T> const & m2);
// Unary constant operators
template <typename T>
tmat4x4<T> const operator- (
tmat4x4<T> const & m);
template <typename T>
tmat4x4<T> const operator-- (
tmat4x4<T> const & m, int);
template <typename T>
tmat4x4<T> const operator++ (
tmat4x4<T> const & m, int);
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 4 columns of 4 components matrix of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x4<lowp_float> lowp_mat4x4;
//! 4 columns of 4 components matrix of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x4<mediump_float> mediump_mat4x4;
//! 4 columns of 4 components matrix of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! (From GLSL 1.30.8 specification, section 4.1.6 Matrices and section 4.5 Precision and Precision Qualifiers)
typedef detail::tmat4x4<highp_float> highp_mat4x4;
}
//namespace precision
}//namespace type
}//namespace core
} //namespace glm
#include "type_mat4x4.inl"
#endif //glm_core_type_mat4x4

View File

@@ -1,714 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-27
// Updated : 2010-02-05
// Licence : This source is under MIT License
// File : glm/core/type_mat4x4.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
template <typename T>
inline typename tmat4x4<T>::size_type tmat4x4<T>::col_size()
{
return 4;
}
template <typename T>
inline typename tmat4x4<T>::size_type tmat4x4<T>::row_size()
{
return 4;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tmat4x4<T>::col_type &
tmat4x4<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
template <typename T>
inline typename tmat4x4<T>::col_type const &
tmat4x4<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < col_size());
return this->value[i];
}
//////////////////////////////////////////////////////////////
// Constructors
template <typename T>
inline tmat4x4<T>::tmat4x4()
{
value_type Zero(0);
value_type One(1);
this->value[0] = col_type(One, Zero, Zero, Zero);
this->value[1] = col_type(Zero, One, Zero, Zero);
this->value[2] = col_type(Zero, Zero, One, Zero);
this->value[3] = col_type(Zero, Zero, Zero, One);
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat4x4<T> const & m
)
{
this->value[0] = m.value[0];
this->value[1] = m.value[1];
this->value[2] = m.value[2];
this->value[3] = m.value[3];
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
ctor
)
{}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
value_type const & s
)
{
value_type const Zero(0);
this->value[0] = col_type(s, Zero, Zero, Zero);
this->value[1] = col_type(Zero, s, Zero, Zero);
this->value[2] = col_type(Zero, Zero, s, Zero);
this->value[3] = col_type(Zero, Zero, Zero, s);
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0,
value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1,
value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2,
value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3
)
{
this->value[0] = col_type(x0, y0, z0, w0);
this->value[1] = col_type(x1, y1, z1, w1);
this->value[2] = col_type(x2, y2, z2, w2);
this->value[3] = col_type(x3, y3, z3, w3);
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
col_type const & v0,
col_type const & v1,
col_type const & v2,
col_type const & v3
)
{
this->value[0] = v0;
this->value[1] = v1;
this->value[2] = v2;
this->value[3] = v3;
}
template <typename T>
template <typename U>
inline tmat4x4<T>::tmat4x4
(
tmat4x4<U> const & m
)
{
this->value[0] = col_type(m[0]);
this->value[1] = col_type(m[1]);
this->value[2] = col_type(m[2]);
this->value[3] = col_type(m[3]);
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat2x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
this->value[2] = col_type(value_type(0));
this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat3x3<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(m[2], value_type(0));
this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat2x3<T> const & m
)
{
this->value[0] = col_type(m[0], value_type(0));
this->value[1] = col_type(m[1], value_type(0));
this->value[2] = col_type(value_type(0));
this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat3x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
this->value[2] = col_type(m[2], detail::tvec2<T>(0));
this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat2x4<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = col_type(T(0));
this->value[3] = col_type(T(0), T(0), T(0), T(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat4x2<T> const & m
)
{
this->value[0] = col_type(m[0], detail::tvec2<T>(0));
this->value[1] = col_type(m[1], detail::tvec2<T>(0));
this->value[2] = col_type(T(0));
this->value[3] = col_type(T(0), T(0), T(0), T(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat3x4<T> const & m
)
{
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = col_type(T(0), T(0), T(0), T(1));
}
template <typename T>
inline tmat4x4<T>::tmat4x4
(
tmat4x3<T> const & m
)
{
this->value[0] = col_type(m[0], T(0));
this->value[1] = col_type(m[1], T(0));
this->value[2] = col_type(m[2], T(0));
this->value[3] = col_type(m[3], T(1));
}
//////////////////////////////////////////////////////////////
// Operators
template <typename T>
inline tmat4x4<T>& tmat4x4<T>::operator=
(
tmat4x4<T> const & m
)
{
//memcpy could be faster
//memcpy(&this->value, &m.value, 16 * sizeof(valType));
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T>& tmat4x4<T>::operator=
(
tmat4x4<U> const & m
)
{
//memcpy could be faster
//memcpy(&this->value, &m.value, 16 * sizeof(valType));
this->value[0] = m[0];
this->value[1] = m[1];
this->value[2] = m[2];
this->value[3] = m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T>& tmat4x4<T>::operator+=
(
U const & s
)
{
this->value[0] += s;
this->value[1] += s;
this->value[2] += s;
this->value[3] += s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T>& tmat4x4<T>::operator+=
(
tmat4x4<U> const & m
)
{
this->value[0] += m[0];
this->value[1] += m[1];
this->value[2] += m[2];
this->value[3] += m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator-=
(
U const & s
)
{
this->value[0] -= s;
this->value[1] -= s;
this->value[2] -= s;
this->value[3] -= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator-=
(
tmat4x4<U> const & m
)
{
this->value[0] -= m[0];
this->value[1] -= m[1];
this->value[2] -= m[2];
this->value[3] -= m[3];
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator*=
(
U const & s
)
{
this->value[0] *= s;
this->value[1] *= s;
this->value[2] *= s;
this->value[3] *= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator*=
(
tmat4x4<U> const & m
)
{
return (*this = *this * m);
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator/=
(
U const & s
)
{
this->value[0] /= s;
this->value[1] /= s;
this->value[2] /= s;
this->value[3] /= s;
return *this;
}
template <typename T>
template <typename U>
inline tmat4x4<T> & tmat4x4<T>::operator/=
(
tmat4x4<U> const & m
)
{
return (*this = *this / m);
}
template <typename T>
inline tmat4x4<T> & tmat4x4<T>::operator++ ()
{
++this->value[0];
++this->value[1];
++this->value[2];
++this->value[3];
return *this;
}
template <typename T>
inline tmat4x4<T> & tmat4x4<T>::operator-- ()
{
--this->value[0];
--this->value[1];
--this->value[2];
--this->value[3];
return *this;
}
template <typename T>
inline tmat4x4<T> tmat4x4<T>::_inverse() const
{
// Calculate all mat2 determinants
value_type SubFactor00 = this->value[2][2] * this->value[3][3] - this->value[3][2] * this->value[2][3];
value_type SubFactor01 = this->value[2][1] * this->value[3][3] - this->value[3][1] * this->value[2][3];
value_type SubFactor02 = this->value[2][1] * this->value[3][2] - this->value[3][1] * this->value[2][2];
value_type SubFactor03 = this->value[2][0] * this->value[3][3] - this->value[3][0] * this->value[2][3];
value_type SubFactor04 = this->value[2][0] * this->value[3][2] - this->value[3][0] * this->value[2][2];
value_type SubFactor05 = this->value[2][0] * this->value[3][1] - this->value[3][0] * this->value[2][1];
value_type SubFactor06 = this->value[1][2] * this->value[3][3] - this->value[3][2] * this->value[1][3];
value_type SubFactor07 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3];
value_type SubFactor08 = this->value[1][1] * this->value[3][2] - this->value[3][1] * this->value[1][2];
value_type SubFactor09 = this->value[1][0] * this->value[3][3] - this->value[3][0] * this->value[1][3];
value_type SubFactor10 = this->value[1][0] * this->value[3][2] - this->value[3][0] * this->value[1][2];
value_type SubFactor11 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3];
value_type SubFactor12 = this->value[1][0] * this->value[3][1] - this->value[3][0] * this->value[1][1];
value_type SubFactor13 = this->value[1][2] * this->value[2][3] - this->value[2][2] * this->value[1][3];
value_type SubFactor14 = this->value[1][1] * this->value[2][3] - this->value[2][1] * this->value[1][3];
value_type SubFactor15 = this->value[1][1] * this->value[2][2] - this->value[2][1] * this->value[1][2];
value_type SubFactor16 = this->value[1][0] * this->value[2][3] - this->value[2][0] * this->value[1][3];
value_type SubFactor17 = this->value[1][0] * this->value[2][2] - this->value[2][0] * this->value[1][2];
value_type SubFactor18 = this->value[1][0] * this->value[2][1] - this->value[2][0] * this->value[1][1];
tmat4x4<T> Inverse(
+ (this->value[1][1] * SubFactor00 - this->value[1][2] * SubFactor01 + this->value[1][3] * SubFactor02),
- (this->value[1][0] * SubFactor00 - this->value[1][2] * SubFactor03 + this->value[1][3] * SubFactor04),
+ (this->value[1][0] * SubFactor01 - this->value[1][1] * SubFactor03 + this->value[1][3] * SubFactor05),
- (this->value[1][0] * SubFactor02 - this->value[1][1] * SubFactor04 + this->value[1][2] * SubFactor05),
- (this->value[0][1] * SubFactor00 - this->value[0][2] * SubFactor01 + this->value[0][3] * SubFactor02),
+ (this->value[0][0] * SubFactor00 - this->value[0][2] * SubFactor03 + this->value[0][3] * SubFactor04),
- (this->value[0][0] * SubFactor01 - this->value[0][1] * SubFactor03 + this->value[0][3] * SubFactor05),
+ (this->value[0][0] * SubFactor02 - this->value[0][1] * SubFactor04 + this->value[0][2] * SubFactor05),
+ (this->value[0][1] * SubFactor06 - this->value[0][2] * SubFactor07 + this->value[0][3] * SubFactor08),
- (this->value[0][0] * SubFactor06 - this->value[0][2] * SubFactor09 + this->value[0][3] * SubFactor10),
+ (this->value[0][0] * SubFactor11 - this->value[0][1] * SubFactor09 + this->value[0][3] * SubFactor12),
- (this->value[0][0] * SubFactor08 - this->value[0][1] * SubFactor10 + this->value[0][2] * SubFactor12),
- (this->value[0][1] * SubFactor13 - this->value[0][2] * SubFactor14 + this->value[0][3] * SubFactor15),
+ (this->value[0][0] * SubFactor13 - this->value[0][2] * SubFactor16 + this->value[0][3] * SubFactor17),
- (this->value[0][0] * SubFactor14 - this->value[0][1] * SubFactor16 + this->value[0][3] * SubFactor18),
+ (this->value[0][0] * SubFactor15 - this->value[0][1] * SubFactor17 + this->value[0][2] * SubFactor18));
value_type Determinant = this->value[0][0] * Inverse[0][0]
+ this->value[0][1] * Inverse[1][0]
+ this->value[0][2] * Inverse[2][0]
+ this->value[0][3] * Inverse[3][0];
Inverse /= Determinant;
return Inverse;
}
// Binary operators
template <typename T>
inline tmat4x4<T> operator+
(
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s
)
{
return tmat4x4<T>(
m[0] + s,
m[1] + s,
m[2] + s,
m[3] + s);
}
template <typename T>
inline tmat4x4<T> operator+
(
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m
)
{
return tmat4x4<T>(
m[0] + s,
m[1] + s,
m[2] + s,
m[3] + s);
}
template <typename T>
inline tmat4x4<T> operator+
(
tmat4x4<T> const & m1,
tmat4x4<T> const & m2
)
{
return tmat4x4<T>(
m1[0] + m2[0],
m1[1] + m2[1],
m1[2] + m2[2],
m1[3] + m2[3]);
}
template <typename T>
inline tmat4x4<T> operator-
(
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s
)
{
return tmat4x4<T>(
m[0] - s,
m[1] - s,
m[2] - s,
m[3] - s);
}
template <typename T>
inline tmat4x4<T> operator-
(
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m
)
{
return tmat4x4<T>(
s - m[0],
s - m[1],
s - m[2],
s - m[3]);
}
template <typename T>
inline tmat4x4<T> operator-
(
tmat4x4<T> const & m1,
tmat4x4<T> const & m2
)
{
return tmat4x4<T>(
m1[0] - m2[0],
m1[1] - m2[1],
m1[2] - m2[2],
m1[3] - m2[3]);
}
template <typename T>
inline tmat4x4<T> operator*
(
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s
)
{
return tmat4x4<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline tmat4x4<T> operator*
(
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m
)
{
return tmat4x4<T>(
m[0] * s,
m[1] * s,
m[2] * s,
m[3] * s);
}
template <typename T>
inline typename tmat4x4<T>::row_type operator*
(
tmat4x4<T> const & m,
typename tmat4x4<T>::col_type const & v
)
{
return typename tmat4x4<T>::row_type(
m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w,
m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w,
m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w,
m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z + m[3][3] * v.w);
}
template <typename T>
inline typename tmat4x4<T>::col_type operator*
(
typename tmat4x4<T>::row_type const & v,
tmat4x4<T> const & m
)
{
return typename tmat4x4<T>::col_type(
m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w,
m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w,
m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w,
m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w);
}
template <typename T>
inline tmat4x4<T> operator*
(
tmat4x4<T> const & m1,
tmat4x4<T> const & m2
)
{
typename tmat4x4<T>::col_type const SrcA0 = m1[0];
typename tmat4x4<T>::col_type const SrcA1 = m1[1];
typename tmat4x4<T>::col_type const SrcA2 = m1[2];
typename tmat4x4<T>::col_type const SrcA3 = m1[3];
typename tmat4x4<T>::col_type const SrcB0 = m2[0];
typename tmat4x4<T>::col_type const SrcB1 = m2[1];
typename tmat4x4<T>::col_type const SrcB2 = m2[2];
typename tmat4x4<T>::col_type const SrcB3 = m2[3];
tmat4x4<T> Result(tmat4x4<T>::null);
Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3];
Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3];
Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3];
Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3];
return Result;
}
template <typename T>
inline tmat4x4<T> operator/
(
tmat4x4<T> const & m,
typename tmat4x4<T>::value_type const & s
)
{
return tmat4x4<T>(
m[0] / s,
m[1] / s,
m[2] / s,
m[3] / s);
}
template <typename T>
inline tmat4x4<T> operator/
(
typename tmat4x4<T>::value_type const & s,
tmat4x4<T> const & m
)
{
return tmat4x4<T>(
s / m[0],
s / m[1],
s / m[2],
s / m[3]);
}
template <typename T>
inline typename tmat4x4<T>::row_type operator/
(
tmat4x4<T> const & m,
typename tmat4x4<T>::col_type const & v
)
{
return m._inverse() * v;
}
template <typename T>
inline typename tmat4x4<T>::col_type operator/
(
typename tmat4x4<T>::row_type const & v,
tmat4x4<T> const & m
)
{
return v * m._inverse();
}
template <typename T>
inline tmat4x4<T> operator/
(
tmat4x4<T> const & m1,
tmat4x4<T> const & m2
)
{
return m1 * m2._inverse();
}
// Unary constant operators
template <typename T>
inline tmat4x4<T> const operator-
(
tmat4x4<T> const & m
)
{
return tmat4x4<T>(
-m[0],
-m[1],
-m[2],
-m[3]);
}
template <typename T>
inline tmat4x4<T> const operator++
(
tmat4x4<T> const & m,
int
)
{
return tmat4x4<T>(
m[0] + typename tmat4x4<T>::value_type(1),
m[1] + typename tmat4x4<T>::value_type(1),
m[2] + typename tmat4x4<T>::value_type(1),
m[3] + typename tmat4x4<T>::value_type(1));
}
template <typename T>
inline tmat4x4<T> const operator--
(
tmat4x4<T> const & m,
int
)
{
return tmat4x4<T>(
m[0] - typename tmat4x4<T>::value_type(1),
m[1] - typename tmat4x4<T>::value_type(1),
m[2] - typename tmat4x4<T>::value_type(1),
m[3] - typename tmat4x4<T>::value_type(1));
}
} //namespace detail
} //namespace glm

View File

@@ -1,24 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-10-05
// Updated : 2008-10-05
// Licence : This source is under MIT License
// File : glm/core/type_size.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_size
#define glm_core_type_size
#include <cstdlib>
namespace glm{
namespace detail
{
//typedef std::size_t size_t;
typedef int sizeType;
}//namespace detail
}//namespace glm
#endif//glm_core_type_size

View File

@@ -1,22 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-01-26
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/type_vec.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_vec
#define glm_core_type_vec
#include "type_gentype.hpp"
namespace glm{
namespace detail
{
}//namespace detail
}//namespace glm
#endif//glm_core_type_vec

View File

View File

@@ -1,172 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-25
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/type_vec1.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_gentype1
#define glm_core_type_gentype1
#include "type_vec.hpp"
#include "type_float.hpp"
#include "type_int.hpp"
#include "type_size.hpp"
#include "_swizzle.hpp"
namespace glm
{
namespace test
{
void main_vec1();
}//namespace test
namespace detail
{
template <typename T> struct tref1;
template <typename T> struct tref2;
template <typename T> struct tref3;
template <typename T> struct tref4;
template <typename T> struct tvec1;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T>
struct tvec1
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec1<T> type;
typedef tvec1<bool> bool_type;
//////////////////////////////////////
// Data
# if defined(GLM_USE_ONLY_XYZW)
value_type x;
# else//GLM_USE_ONLY_XYZW
union {value_type x, r, s;};
# endif//GLM_USE_ONLY_XYZW
//////////////////////////////////////
// Accesses
value_type & operator[](size_type i);
value_type const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec1();
tvec1(tvec1<T> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec1(
ctor);
explicit tvec1(
value_type const & s);
//////////////////////////////////////
// Swizzle constructors
tvec1(tref1<T> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec1(U const & s);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec1(tvec2<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec1(tvec3<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec1(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec1<T> & operator= (tvec1<T> const & v);
tvec1<T> & operator+=(value_type const & s);
tvec1<T> & operator+=(tvec1<T> const & v);
tvec1<T> & operator-=(value_type const & s);
tvec1<T> & operator-=(tvec1<T> const & v);
tvec1<T> & operator*=(value_type const & s);
tvec1<T> & operator*=(tvec1<T> const & v);
tvec1<T> & operator/=(value_type const & s);
tvec1<T> & operator/=(tvec1<T> const & v);
tvec1<T> & operator++();
tvec1<T> & operator--();
//////////////////////////////////////
// Unary bit operators
tvec1<T> & operator%=(value_type const & s);
tvec1<T> & operator%=(tvec1<T> const & v);
tvec1<T> & operator&=(value_type const & s);
tvec1<T> & operator&=(tvec1<T> const & v);
tvec1<T> & operator|=(value_type const & s);
tvec1<T> & operator|=(tvec1<T> const & v);
tvec1<T> & operator^=(value_type const & s);
tvec1<T> & operator^=(tvec1<T> const & v);
tvec1<T> & operator<<=(value_type const & s);
tvec1<T> & operator<<=(tvec1<T> const & v);
tvec1<T> & operator>>=(value_type const & s);
tvec1<T> & operator>>=(tvec1<T> const & v);
//////////////////////////////////////
// Swizzle operators
value_type swizzle(comp X) const;
tvec2<T> swizzle(comp X, comp Y) const;
tvec3<T> swizzle(comp X, comp Y, comp Z) const;
tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
tref1<T> swizzle(comp X);
};
template <typename T>
struct tref1
{
tref1(T & x);
tref1(tref1<T> const & r);
tref1(tvec1<T> const & v);
tref1<T> & operator= (tref1<T> const & r);
tref1<T> & operator= (tvec1<T> const & v);
T& x;
};
typedef detail::tvec1<core::type::precision::highp_float> highp_vec1_t;
typedef detail::tvec1<core::type::precision::mediump_float> mediump_vec1_t;
typedef detail::tvec1<core::type::precision::lowp_float> lowp_vec1_t;
typedef detail::tvec1<core::type::precision::highp_int> highp_ivec1_t;
typedef detail::tvec1<core::type::precision::mediump_int> mediump_ivec1_t;
typedef detail::tvec1<core::type::precision::lowp_int> lowp_ivec1_t;
typedef detail::tvec1<core::type::precision::highp_uint> highp_uvec1_t;
typedef detail::tvec1<core::type::precision::mediump_uint> mediump_uvec1_t;
typedef detail::tvec1<core::type::precision::lowp_uint> lowp_uvec1_t;
} //namespace detail
}//namespace glm
#include "type_vec1.inl"
#endif//glm_core_type_gentype1

View File

@@ -1,856 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-25
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/type_vec1.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace detail
{
template <typename T>
inline typename tvec1<T>::size_type tvec1<T>::value_size()
{
return 1;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tvec1<T>::value_type & tvec1<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < value_size());
return (&x)[i];
}
template <typename T>
inline typename tvec1<T>::value_type const & tvec1<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < value_size());
return (&x)[i];
}
//////////////////////////////////////
// Implicit basic constructors
template <typename T>
inline tvec1<T>::tvec1() :
x(value_type(0))
{}
template <typename T>
inline tvec1<T>::tvec1
(
ctor
)
{}
template <typename T>
inline tvec1<T>::tvec1
(
tvec1<T> const & v
) :
x(v.x)
{}
//////////////////////////////////////
// Explicit basic constructors
template <typename T>
inline tvec1<T>::tvec1
(
value_type const & s
) :
x(s)
{}
//////////////////////////////////////
// Swizzle constructors
template <typename T>
inline tvec1<T>::tvec1
(
tref1<T> const & r
) :
x(r.x)
{}
//////////////////////////////////////
// Convertion scalar constructors
template <typename T>
template <typename U>
inline tvec1<T>::tvec1
(
U const & s
) :
x(value_type(s))
{}
//////////////////////////////////////
// Convertion vector constructors
template <typename T>
template <typename U>
inline tvec1<T>::tvec1
(
tvec2<U> const & v
) :
x(value_type(v.x))
{}
template <typename T>
template <typename U>
inline tvec1<T>::tvec1
(
tvec3<U> const & v
) :
x(value_type(v.x))
{}
template <typename T>
template <typename U>
inline tvec1<T>::tvec1
(
tvec4<U> const & v
) :
x(value_type(v.x))
{}
//////////////////////////////////////
// Unary arithmetic operators
template <typename T>
inline tvec1<T> & tvec1<T>::operator=
(
tvec1<T> const & v
)
{
this->x = v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator+=
(
value_type const & s
)
{
this->x += s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator+=
(
tvec1<T> const & v
)
{
this->x += v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator-=
(
value_type const & s
)
{
this->x -= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator-=
(
tvec1<T> const & v
)
{
this->x -= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator*=
(
value_type const & s
)
{
this->x *= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator*=
(
tvec1<T> const & v
)
{
this->x *= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator/=
(
value_type const & s
)
{
this->x /= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator/=
(
tvec1<T> const & v
)
{
this->x /= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator++()
{
++this->x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator--()
{
--this->x;
return *this;
}
//////////////////////////////////////
// Unary bit operators
template <typename T>
inline tvec1<T> & tvec1<T>::operator%=
(
value_type const & s
)
{
this->x %= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator%=
(
tvec1<T> const & v
)
{
this->x %= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator&=
(
value_type const & s
)
{
this->x &= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator&=
(
tvec1<T> const & v
)
{
this->x &= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator|=
(
value_type const & s
)
{
this->x |= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator|=
(
tvec1<T> const & v
)
{
this->x |= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator^=
(
value_type const & s
)
{
this->x ^= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator^=
(
tvec1<T> const & v
)
{
this->x ^= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator<<=
(
value_type const & s
)
{
this->x <<= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator<<=
(
tvec1<T> const & v
)
{
this->x <<= v.x;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator>>=
(
value_type const & s
)
{
this->x >>= s;
return *this;
}
template <typename T>
inline tvec1<T> & tvec1<T>::operator>>=
(
tvec1<T> const & v
)
{
this->x >>= v.x;
return *this;
}
//////////////////////////////////////
// Swizzle operators
template <typename T>
inline T
tvec1<T>::swizzle(comp x) const
{
return (*this)[x];
}
template <typename T>
inline tvec2<T>
tvec1<T>::swizzle
(
comp x,
comp y
) const
{
return tvec2<T>(
(*this)[x],
(*this)[y]);
}
template <typename T>
inline tvec3<T>
tvec1<T>::swizzle
(
comp x,
comp y,
comp z
) const
{
return tvec3<T>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
template <typename T>
inline tvec4<T>
tvec1<T>::swizzle
(
comp x,
comp y,
comp z,
comp w
) const
{
return tvec4<T>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
template <typename T>
inline tref1<T>
tvec1<T>::swizzle
(
comp x
)
{
return tref1<T>(
(*this)[x]);
}
//////////////////////////////////////
// Binary arithmetic operators
template <typename T>
inline tvec1<T> operator+
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x + s);
}
template <typename T>
inline tvec1<T> operator+
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s + v.x);
}
template <typename T>
inline tvec1<T> operator+
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x + v2.x);
}
//operator-
template <typename T>
inline tvec1<T> operator-
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x - s);
}
template <typename T>
inline tvec1<T> operator-
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s - v.x);
}
template <typename T>
inline tvec1<T> operator-
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x - v2.x);
}
//operator*
template <typename T>
inline tvec1<T> operator*
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x * s);
}
template <typename T>
inline tvec1<T> operator*
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s * v.x);
}
template <typename T>
inline tvec1<T> operator*
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x * v2.x);
}
//operator/
template <typename T>
inline tvec1<T> operator/
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x / s);
}
template <typename T>
inline tvec1<T> operator/
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s / v.x);
}
template <typename T>
inline tvec1<T> operator/
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x / v2.x);
}
// Unary constant operators
template <typename T>
inline tvec1<T> operator-
(
tvec1<T> const & v
)
{
return tvec1<T>(
-v.x);
}
template <typename T>
inline tvec1<T> operator++
(
tvec1<T> const & v,
int
)
{
return tvec1<T>(
v.x + T(1));
}
template <typename T>
inline tvec1<T> operator--
(
tvec1<T> const & v,
int
)
{
return tvec1<T>(
v.x - T(1));
}
//////////////////////////////////////
// Binary bit operators
template <typename T>
inline tvec1<T> operator%
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x % s);
}
template <typename T>
inline tvec1<T> operator%
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s % v.x);
}
template <typename T>
inline tvec1<T> operator%
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x % v2.x);
}
template <typename T>
inline tvec1<T> operator&
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x & s);
}
template <typename T>
inline tvec1<T> operator&
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s & v.x);
}
template <typename T>
inline tvec1<T> operator&
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x & v2.x);
}
template <typename T>
inline tvec1<T> operator|
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x | s);
}
template <typename T>
inline tvec1<T> operator|
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s | v.x);
}
template <typename T>
inline tvec1<T> operator|
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x | v2.x);
}
template <typename T>
inline tvec1<T> operator^
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x ^ s);
}
template <typename T>
inline tvec1<T> operator^
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s ^ v.x);
}
template <typename T>
inline tvec1<T> operator^
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x ^ v2.x);
}
template <typename T>
inline tvec1<T> operator<<
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x << s);
}
template <typename T>
inline tvec1<T> operator<<
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s << v.x);
}
template <typename T>
inline tvec1<T> operator<<
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x << v2.x);
}
template <typename T>
inline tvec1<T> operator>>
(
tvec1<T> const & v,
typename tvec1<T>::value_type const & s
)
{
return tvec1<T>(
v.x >> s);
}
template <typename T>
inline tvec1<T> operator>>
(
typename tvec1<T>::value_type const & s,
tvec1<T> const & v
)
{
return tvec1<T>(
s >> v.x);
}
template <typename T>
inline tvec1<T> operator>>
(
tvec1<T> const & v1,
tvec1<T> const & v2
)
{
return tvec1<T>(
v1.x >> v2.x);
}
template <typename T>
inline tvec1<T> operator~
(
tvec1<T> const & v
)
{
return tvec1<T>(
~v.x);
}
//////////////////////////////////////
// tref definition
template <typename T>
inline tref1<T>::tref1
(
T & x
) :
x(x)
{}
template <typename T>
inline tref1<T>::tref1
(
tref1<T> const & r
) :
x(r.x)
{}
template <typename T>
inline tref1<T>::tref1
(
tvec1<T> const & v
) :
x(v.x)
{}
template <typename T>
inline tref1<T> & tref1<T>::operator=
(
tref1<T> const & r
)
{
x = r.x;
return *this;
}
template <typename T>
inline tref1<T> & tref1<T>::operator=
(
tvec1<T> const & v
)
{
x = v.x;
return *this;
}
}//namespace detail
}//namespace glm

View File

@@ -1,250 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-18
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/core/type_tvec2.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_gentype2
#define glm_core_type_gentype2
#include "type_vec.hpp"
#include "type_float.hpp"
#include "type_int.hpp"
#include "type_size.hpp"
#include "_swizzle.hpp"
namespace glm
{
namespace test
{
void main_vec2();
}
//namespace test
namespace detail
{
template <typename T> struct tref2;
template <typename T> struct tref3;
template <typename T> struct tref4;
template <typename T> struct tvec3;
template <typename T> struct tvec4;
template <typename T>
struct tvec2
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec2<T> type;
typedef tvec2<bool> bool_type;
//////////////////////////////////////
// Data
# if defined(GLM_USE_ONLY_XYZW)
value_type x, y;
# else//GLM_USE_ONLY_XYZW
# ifdef GLM_USE_ANONYMOUS_UNION
union
{
struct{value_type x, y;};
struct{value_type r, g;};
struct{value_type s, t;};
};
# else//GLM_USE_ANONYMOUS_UNION
union {value_type x, r, s;};
union {value_type y, g, t;};
# endif//GLM_USE_ANONYMOUS_UNION
# endif//GLM_USE_ONLY_XYZW
//////////////////////////////////////
// Accesses
value_type & operator[](size_type i);
value_type const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec2();
tvec2(tvec2<T> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec2(
ctor);
explicit tvec2(
value_type const & s);
explicit tvec2(
value_type const & s1,
value_type const & s2);
//////////////////////////////////////
// Swizzle constructors
tvec2(tref2<T> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(
U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U, typename V>
explicit tvec2(
U const & x,
V const & y);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec2<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec3<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec2<T> & operator= (tvec2<T> const & v);
template <typename U>
tvec2<T> & operator= (tvec2<U> const & v);
template <typename U>
tvec2<T> & operator+=(U const & s);
template <typename U>
tvec2<T> & operator+=(tvec2<U> const & v);
template <typename U>
tvec2<T> & operator-=(U const & s);
template <typename U>
tvec2<T> & operator-=(tvec2<U> const & v);
template <typename U>
tvec2<T> & operator*=(U const & s);
template <typename U>
tvec2<T> & operator*=(tvec2<U> const & v);
template <typename U>
tvec2<T> & operator/=(U const & s);
template <typename U>
tvec2<T> & operator/=(tvec2<U> const & v);
tvec2<T> & operator++();
tvec2<T> & operator--();
//////////////////////////////////////
// Unary bit operators
template <typename U>
tvec2<T> & operator%= (U const & s);
template <typename U>
tvec2<T> & operator%= (tvec2<U> const & v);
template <typename U>
tvec2<T> & operator&= (U const & s);
template <typename U>
tvec2<T> & operator&= (tvec2<U> const & v);
template <typename U>
tvec2<T> & operator|= (U const & s);
template <typename U>
tvec2<T> & operator|= (tvec2<U> const & v);
template <typename U>
tvec2<T> & operator^= (U const & s);
template <typename U>
tvec2<T> & operator^= (tvec2<U> const & v);
template <typename U>
tvec2<T> & operator<<=(U const & s);
template <typename U>
tvec2<T> & operator<<=(tvec2<U> const & v);
template <typename U>
tvec2<T> & operator>>=(U const & s);
template <typename U>
tvec2<T> & operator>>=(tvec2<U> const & v);
//////////////////////////////////////
// Swizzle operators
value_type swizzle(comp X) const;
tvec2<T> swizzle(comp X, comp Y) const;
tvec3<T> swizzle(comp X, comp Y, comp Z) const;
tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
tref2<T> swizzle(comp X, comp Y);
};
template <typename T>
struct tref2
{
tref2(T & x, T & y);
tref2(tref2<T> const & r);
tref2(tvec2<T> const & v);
tref2<T> & operator= (tref2<T> const & r);
tref2<T> & operator= (tvec2<T> const & v);
T& x;
T& y;
};
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 2 components vector of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec2<highp_float> highp_vec2;
//! 2 components vector of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec2<mediump_float> mediump_vec2;
//! 2 components vector of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec2<lowp_float> lowp_vec2;
//! 2 components vector of high precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<highp_int> highp_ivec2;
//! 2 components vector of medium precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<mediump_int> mediump_ivec2;
//! 2 components vector of low precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<lowp_int> lowp_ivec2;
//! 2 components vector of high precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<highp_uint> highp_uvec2;
//! 2 components vector of medium precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<mediump_uint> mediump_uvec2;
//! 2 components vector of low precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec2<lowp_uint> lowp_uvec2;
}
//namespace precision
}//namespace type
}//namespace core
}//namespace glm
#include "type_vec2.inl"
#endif//glm_core_type_gentype2

View File

@@ -1,982 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-18
// Updated : 2010-10-26
// Licence : This source is under MIT License
// File : glm/core/type_tvec2.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
namespace detail
{
template <typename T>
inline typename tvec2<T>::size_type tvec2<T>::value_size()
{
return 2;
}
//////////////////////////////////////
// Accesses
template <typename T>
inline typename tvec2<T>::value_type &
tvec2<T>::operator[]
(
size_type i
)
{
assert(i >= size_type(0) && i < value_size());
return (&x)[i];
}
template <typename T>
inline typename tvec2<T>::value_type const &
tvec2<T>::operator[]
(
size_type i
) const
{
assert(i >= size_type(0) && i < value_size());
return (&x)[i];
}
//////////////////////////////////////
// Implicit basic constructors
template <typename T>
inline tvec2<T>::tvec2() :
x(value_type(0)),
y(value_type(0))
{}
template <typename T>
inline tvec2<T>::tvec2
(
ctor
)
{}
template <typename T>
inline tvec2<T>::tvec2
(
tvec2<T> const & v
) :
x(v.x),
y(v.y)
{}
//////////////////////////////////////
// Explicit basic constructors
template <typename T>
inline tvec2<T>::tvec2
(
value_type const & s
) :
x(s),
y(s)
{}
template <typename T>
inline tvec2<T>::tvec2
(
value_type const & s1,
value_type const & s2
) :
x(s1),
y(s2)
{}
//////////////////////////////////////
// Swizzle constructors
template <typename T>
inline tvec2<T>::tvec2
(
tref2<T> const & r
) :
x(r.x),
y(r.y)
{}
//////////////////////////////////////
// Convertion scalar constructors
template <typename T>
template <typename U>
inline tvec2<T>::tvec2
(
U const & x
) :
x(value_type(x)),
y(value_type(x))
{}
template <typename T>
template <typename U, typename V>
inline tvec2<T>::tvec2
(
U const & x,
V const & y
) :
x(value_type(x)),
y(value_type(y))
{}
//////////////////////////////////////
// Convertion vector constructors
template <typename T>
template <typename U>
inline tvec2<T>::tvec2
(
tvec2<U> const & v
) :
x(value_type(v.x)),
y(value_type(v.y))
{}
template <typename T>
template <typename U>
inline tvec2<T>::tvec2
(
tvec3<U> const & v
) :
x(value_type(v.x)),
y(value_type(v.y))
{}
template <typename T>
template <typename U>
inline tvec2<T>::tvec2
(
tvec4<U> const & v
) :
x(value_type(v.x)),
y(value_type(v.y))
{}
//////////////////////////////////////
// Unary arithmetic operators
template <typename T>
inline tvec2<T> & tvec2<T>::operator=
(
tvec2<T> const & v
)
{
this->x = v.x;
this->y = v.y;
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator=
(
tvec2<U> const & v
)
{
this->x = T(v.x);
this->y = T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator+=
(
U const & s
)
{
this->x += T(s);
this->y += T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator+=
(
tvec2<U> const & v
)
{
this->x += T(v.x);
this->y += T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator-=
(
U const & s
)
{
this->x -= T(s);
this->y -= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator-=
(
tvec2<U> const & v
)
{
this->x -= T(v.x);
this->y -= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator*=
(
U const & s
)
{
this->x *= T(s);
this->y *= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator*=
(
tvec2<U> const & v
)
{
this->x *= T(v.x);
this->y *= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator/=
(
U const & s
)
{
this->x /= T(s);
this->y /= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator/=
(
tvec2<U> const & v
)
{
this->x /= T(v.x);
this->y /= T(v.y);
return *this;
}
template <typename T>
inline tvec2<T> & tvec2<T>::operator++()
{
++this->x;
++this->y;
return *this;
}
template <typename T>
inline tvec2<T> & tvec2<T>::operator--()
{
--this->x;
--this->y;
return *this;
}
//////////////////////////////////////
// Unary bit operators
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator%=
(
U const & s
)
{
this->x %= T(s);
this->y %= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator%=
(
tvec2<U> const & v
)
{
this->x %= T(v.x);
this->y %= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator&=
(
U const & s
)
{
this->x &= T(s);
this->y &= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator&=
(
tvec2<U> const & v
)
{
this->x &= T(v.x);
this->y &= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator|=
(
U const & s
)
{
this->x |= T(s);
this->y |= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator|=
(
tvec2<U> const & v
)
{
this->x |= T(v.x);
this->y |= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator^=
(
U const & s
)
{
this->x ^= T(s);
this->y ^= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator^=
(
tvec2<U> const & v
)
{
this->x ^= T(v.x);
this->y ^= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator<<=
(
U const & s
)
{
this->x <<= T(s);
this->y <<= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator<<=
(
tvec2<U> const & v
)
{
this->x <<= T(v.x);
this->y <<= T(v.y);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator>>=
(
U const & s
)
{
this->x >>= T(s);
this->y >>= T(s);
return *this;
}
template <typename T>
template <typename U>
inline tvec2<T> & tvec2<T>::operator>>=
(
tvec2<U> const & v
)
{
this->x >>= T(v.x);
this->y >>= T(v.y);
return *this;
}
//////////////////////////////////////
// Swizzle operators
template <typename T>
inline typename tvec2<T>::value_type tvec2<T>::swizzle
(
comp x
) const
{
return (*this)[x];
}
template <typename T>
inline tvec2<T> tvec2<T>::swizzle
(
comp x,
comp y
) const
{
return tvec2<T>(
(*this)[x],
(*this)[y]);
}
template <typename T>
inline tvec3<T> tvec2<T>::swizzle
(
comp x,
comp y,
comp z
) const
{
return tvec3<T>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
template <typename T>
inline tvec4<T> tvec2<T>::swizzle
(
comp x,
comp y,
comp z,
comp w
) const
{
return tvec4<T>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
template <typename T>
inline tref2<T> tvec2<T>::swizzle
(
comp x,
comp y
)
{
return tref2<T>(
(*this)[x],
(*this)[y]);
}
//////////////////////////////////////
// Binary arithmetic operators
template <typename T>
inline tvec2<T> operator+
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x + T(s),
v.y + T(s));
}
template <typename T>
inline tvec2<T> operator+
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) + v.x,
T(s) + v.y);
}
template <typename T>
inline tvec2<T> operator+
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x + T(v2.x),
v1.y + T(v2.y));
}
//operator-
template <typename T>
inline tvec2<T> operator-
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x - T(s),
v.y - T(s));
}
template <typename T>
inline tvec2<T> operator-
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) - v.x,
T(s) - v.y);
}
template <typename T>
inline tvec2<T> operator-
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x - T(v2.x),
v1.y - T(v2.y));
}
//operator*
template <typename T>
inline tvec2<T> operator*
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x * T(s),
v.y * T(s));
}
template <typename T>
inline tvec2<T> operator*
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) * v.x,
T(s) * v.y);
}
template <typename T>
inline tvec2<T> operator*
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x * T(v2.x),
v1.y * T(v2.y));
}
//operator/
template <typename T>
inline tvec2<T> operator/
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x / T(s),
v.y / T(s));
}
template <typename T>
inline tvec2<T> operator/
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) / v.x,
T(s) / v.y);
}
template <typename T>
inline tvec2<T> operator/
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x / T(v2.x),
v1.y / T(v2.y));
}
// Unary constant operators
template <typename T>
inline tvec2<T> operator-
(
tvec2<T> const & v
)
{
return tvec2<T>(
-v.x,
-v.y);
}
template <typename T>
inline tvec2<T> operator++
(
tvec2<T> const & v,
int
)
{
return tvec2<T>(
v.x + T(1),
v.y + T(1));
}
template <typename T>
inline tvec2<T> operator--
(
tvec2<T> const & v,
int
)
{
return tvec2<T>(
v.x - T(1),
v.y - T(1));
}
//////////////////////////////////////
// Binary bit operators
template <typename T>
inline tvec2<T> operator%
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x % T(s),
v.y % T(s));
}
template <typename T>
inline tvec2<T> operator%
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) % v.x,
T(s) % v.y);
}
template <typename T>
inline tvec2<T> operator%
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x % T(v2.x),
v1.y % T(v2.y));
}
template <typename T>
inline tvec2<T> operator&
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x & T(s),
v.y & T(s));
}
template <typename T>
inline tvec2<T> operator&
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) & v.x,
T(s) & v.y);
}
template <typename T>
inline tvec2<T> operator&
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x & T(v2.x),
v1.y & T(v2.y));
}
template <typename T>
inline tvec2<T> operator|
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x | T(s),
v.y | T(s));
}
template <typename T>
inline tvec2<T> operator|
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) | v.x,
T(s) | v.y);
}
template <typename T>
inline tvec2<T> operator|
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x | T(v2.x),
v1.y | T(v2.y));
}
template <typename T>
inline tvec2<T> operator^
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x ^ T(s),
v.y ^ T(s));
}
template <typename T>
inline tvec2<T> operator^
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) ^ v.x,
T(s) ^ v.y);
}
template <typename T>
inline tvec2<T> operator^
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x ^ T(v2.x),
v1.y ^ T(v2.y));
}
template <typename T>
inline tvec2<T> operator<<
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x << T(s),
v.y << T(s));
}
template <typename T>
inline tvec2<T> operator<<
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
s << T(v.x),
s << T(v.y));
}
template <typename T>
inline tvec2<T> operator<<
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x << T(v2.x),
v1.y << T(v2.y));
}
template <typename T>
inline tvec2<T> operator>>
(
tvec2<T> const & v,
T const & s
)
{
return tvec2<T>(
v.x >> T(s),
v.y >> T(s));
}
template <typename T>
inline tvec2<T> operator>>
(
T const & s,
tvec2<T> const & v
)
{
return tvec2<T>(
T(s) >> v.x,
T(s) >> v.y);
}
template <typename T>
inline tvec2<T> operator>>
(
tvec2<T> const & v1,
tvec2<T> const & v2
)
{
return tvec2<T>(
v1.x >> T(v2.x),
v1.y >> T(v2.y));
}
template <typename T>
inline tvec2<T> operator~
(
tvec2<T> const & v
)
{
return tvec2<T>(
~v.x,
~v.y);
}
//////////////////////////////////////
// tref definition
template <typename T>
tref2<T>::tref2
(
T & x,
T & y
) :
x(x),
y(y)
{}
template <typename T>
tref2<T>::tref2
(
tref2<T> const & r
) :
x(r.x),
y(r.y)
{}
template <typename T>
tref2<T>::tref2
(
tvec2<T> const & v
) :
x(v.x),
y(v.y)
{}
template <typename T>
tref2<T>& tref2<T>::operator=
(
tref2<T> const & r
)
{
x = r.x;
y = r.y;
return *this;
}
template <typename T>
tref2<T>& tref2<T>::operator=
(
tvec2<T> const & v
)
{
x = v.x;
y = v.y;
return *this;
}
}//namespace detail
}//namespace glm

View File

@@ -1,256 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-22
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_tvec3.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_gentype3
#define glm_core_type_gentype3
#include "type_vec.hpp"
#include "type_float.hpp"
#include "type_int.hpp"
#include "type_size.hpp"
#include "_swizzle.hpp"
namespace glm
{
namespace test
{
void main_vec3();
}//namespace test
namespace detail
{
template <typename T> struct tref2;
template <typename T> struct tref3;
template <typename T> struct tref4;
template <typename T> struct tvec2;
template <typename T> struct tvec4;
template <typename T>
struct tvec3
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec3<T> type;
typedef tvec3<bool> bool_type;
//////////////////////////////////////
// Data
# if defined(GLM_USE_ONLY_XYZW)
value_type x, y, z;
# else//GLM_USE_ONLY_XYZW
# ifdef GLM_USE_ANONYMOUS_UNION
union
{
struct{value_type x, y, z;};
struct{value_type r, g, b;};
struct{value_type s, t, p;};
};
# else//GLM_USE_ANONYMOUS_UNION
union {value_type x, r, s;};
union {value_type y, g, t;};
union {value_type z, b, p;};
# endif//GLM_USE_ANONYMOUS_UNION
# endif//GLM_USE_ONLY_XYZW
//////////////////////////////////////
// Accesses
value_type & operator[](size_type i);
value_type const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec3();
tvec3(tvec3<T> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec3(
ctor);
explicit tvec3(
value_type const & s);
explicit tvec3(
value_type const & s1,
value_type const & s2,
value_type const & s3);
//////////////////////////////////////
// Swizzle constructors
tvec3(tref3<T> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(
U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U, typename V, typename W>
explicit tvec3(
U const & x,
V const & y,
W const & z);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec3(tvec2<A> const & v, B const & s);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec3(A const & s, tvec2<B> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(tvec3<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec3<T> & operator= (tvec3<T> const & v);
template <typename U>
tvec3<T> & operator= (tvec3<U> const & v);
template <typename U>
tvec3<T> & operator+=(U const & s);
template <typename U>
tvec3<T> & operator+=(tvec3<U> const & v);
template <typename U>
tvec3<T> & operator-=(U const & s);
template <typename U>
tvec3<T> & operator-=(tvec3<U> const & v);
template <typename U>
tvec3<T> & operator*=(U const & s);
template <typename U>
tvec3<T> & operator*=(tvec3<U> const & v);
template <typename U>
tvec3<T> & operator/=(U const & s);
template <typename U>
tvec3<T> & operator/=(tvec3<U> const & v);
tvec3<T> & operator++();
tvec3<T> & operator--();
//////////////////////////////////////
// Unary bit operators
template <typename U>
tvec3<T> & operator%= (U const & s);
template <typename U>
tvec3<T> & operator%= (tvec3<U> const & v);
template <typename U>
tvec3<T> & operator&= (U const & s);
template <typename U>
tvec3<T> & operator&= (tvec3<U> const & v);
template <typename U>
tvec3<T> & operator|= (U const & s);
template <typename U>
tvec3<T> & operator|= (tvec3<U> const & v);
template <typename U>
tvec3<T> & operator^= (U const & s);
template <typename U>
tvec3<T> & operator^= (tvec3<U> const & v);
template <typename U>
tvec3<T> & operator<<=(U const & s);
template <typename U>
tvec3<T> & operator<<=(tvec3<U> const & v);
template <typename U>
tvec3<T> & operator>>=(U const & s);
template <typename U>
tvec3<T> & operator>>=(tvec3<U> const & v);
//////////////////////////////////////
// Swizzle operators
value_type swizzle(comp X) const;
tvec2<T> swizzle(comp X, comp Y) const;
tvec3<T> swizzle(comp X, comp Y, comp Z) const;
tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
tref3<T> swizzle(comp X, comp Y, comp Z);
};
template <typename T>
struct tref3
{
tref3(T & x, T & y, T & z);
tref3(tref3<T> const & r);
tref3(tvec3<T> const & v);
tref3<T> & operator= (tref3<T> const & r);
tref3<T> & operator= (tvec3<T> const & v);
T & x;
T & y;
T & z;
};
} //namespace detail
namespace core{
namespace type{
namespace precision
{
//! 3 components vector of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec3<highp_float> highp_vec3;
//! 3 components vector of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec3<mediump_float> mediump_vec3;
//! 3 components vector of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec3<lowp_float> lowp_vec3;
//! 3 components vector of high precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<highp_int> highp_ivec3;
//! 3 components vector of medium precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<mediump_int> mediump_ivec3;
//! 3 components vector of low precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<lowp_int> lowp_ivec3;
//! 3 components vector of high precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<highp_uint> highp_uvec3;
//! 3 components vector of medium precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<mediump_uint> mediump_uvec3;
//! 3 components vector of low precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec3<lowp_uint> lowp_uvec3;
}
//namespace precision
}//namespace type
}//namespace core
}//namespace glm
#include "type_vec3.inl"
#endif//glm_core_type_gentype3

File diff suppressed because it is too large Load Diff

View File

@@ -1,276 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-08-22
// Updated : 2010-02-03
// Licence : This source is under MIT License
// File : glm/core/type_tvec4.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_core_type_gentype4
#define glm_core_type_gentype4
#include "type_vec.hpp"
#include "type_float.hpp"
#include "type_int.hpp"
#include "type_size.hpp"
#include "_swizzle.hpp"
#include "_detail.hpp"
namespace glm
{
namespace test
{
void main_vec4();
}//namespace test
namespace detail
{
template <typename T> struct tref2;
template <typename T> struct tref3;
template <typename T> struct tref4;
template <typename T> struct tvec2;
template <typename T> struct tvec3;
template <typename T>
struct tvec4
{
enum ctor{null};
typedef T value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec4<T> type;
typedef tvec4<bool> bool_type;
//////////////////////////////////////
// Data
# if defined(GLM_USE_ONLY_XYZW)
value_type x, y, z, w;
# else//GLM_USE_ONLY_XYZW
# ifdef GLM_USE_ANONYMOUS_UNION
union
{
struct{value_type x, y, z, w;};
struct{value_type r, g, b, a;};
struct{value_type s, t, p, q;};
};
# else//GLM_USE_ANONYMOUS_UNION
union {value_type x, r, s;};
union {value_type y, g, t;};
union {value_type z, b, p;};
union {value_type w, a, q;};
# endif//GLM_USE_ANONYMOUS_UNION
# endif//GLM_USE_ONLY_XYZW
//////////////////////////////////////
// Accesses
value_type & operator[](size_type i);
value_type const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec4();
tvec4(type const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec4(
ctor);
explicit tvec4(
value_type const & s);
explicit tvec4(
value_type const & s0,
value_type const & s1,
value_type const & s2,
value_type const & s3);
//////////////////////////////////////
// Swizzle constructors
tvec4(tref4<T> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec4(
U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C, typename D>
explicit tvec4(
A const & x,
B const & y,
C const & z,
D const & w);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(tvec3<A> const & v, B const & s);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(A const & s, tvec3<B> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec4(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec4<T> & operator= (tvec4<T> const & v);
template <typename U>
tvec4<T> & operator= (tvec4<U> const & v);
template <typename U>
tvec4<T> & operator+=(U const & s);
template <typename U>
tvec4<T> & operator+=(tvec4<U> const & v);
template <typename U>
tvec4<T> & operator-=(U const & s);
template <typename U>
tvec4<T> & operator-=(tvec4<U> const & v);
template <typename U>
tvec4<T> & operator*=(U const & s);
template <typename U>
tvec4<T> & operator*=(tvec4<U> const & v);
template <typename U>
tvec4<T> & operator/=(U const & s);
template <typename U>
tvec4<T> & operator/=(tvec4<U> const & v);
tvec4<T> & operator++();
tvec4<T> & operator--();
//////////////////////////////////////
// Unary bit operators
template <typename U>
tvec4<T> & operator%= (U const & s);
template <typename U>
tvec4<T> & operator%= (tvec4<U> const & v);
template <typename U>
tvec4<T> & operator&= (U const & s);
template <typename U>
tvec4<T> & operator&= (tvec4<U> const & v);
template <typename U>
tvec4<T> & operator|= (U const & s);
template <typename U>
tvec4<T> & operator|= (tvec4<U> const & v);
template <typename U>
tvec4<T> & operator^= (U const & s);
template <typename U>
tvec4<T> & operator^= (tvec4<U> const & v);
template <typename U>
tvec4<T> & operator<<=(U const & s);
template <typename U>
tvec4<T> & operator<<=(tvec4<U> const & v);
template <typename U>
tvec4<T> & operator>>=(U const & s);
template <typename U>
tvec4<T> & operator>>=(tvec4<U> const & v);
//////////////////////////////////////
// Swizzle operators
value_type swizzle(comp X) const;
tvec2<T> swizzle(comp X, comp Y) const;
tvec3<T> swizzle(comp X, comp Y, comp Z) const;
tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
tref4<T> swizzle(comp X, comp Y, comp Z, comp W);
};
template <typename T>
struct tref4
{
tref4(T & x, T & y, T & z, T & w);
tref4(tref4<T> const & r);
tref4(tvec4<T> const & v);
tref4<T> & operator= (tref4<T> const & r);
tref4<T> & operator= (tvec4<T> const & v);
T & x;
T & y;
T & z;
T & w;
};
} //namespace detail
namespace core{
namespace type{
//////////////////////////
// Float definition
namespace precision
{
//! 4 components vector of high precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec4<highp_float> highp_vec4;
//! 4 components vector of medium precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec4<mediump_float> mediump_vec4;
//! 4 components vector of low precision floating-point numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.5.2 Precision Qualifiers.
typedef detail::tvec4<lowp_float> lowp_vec4;
//! 4 components vector of high precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<highp_int> highp_ivec4;
//! 4 components vector of medium precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<mediump_int> mediump_ivec4;
//! 4 components vector of low precision signed integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<lowp_int> lowp_ivec4;
//! 4 components vector of high precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<highp_uint> highp_uvec4;
//! 4 components vector of medium precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<mediump_uint> mediump_uvec4;
//! 4 components vector of low precision unsigned integer numbers.
//! There is no garanty on the actual precision.
//! From GLSL 1.30.8 specification, section 4.1.5 Precision Qualifiers.
typedef detail::tvec4<lowp_uint> lowp_uvec4;
}
//namespace precision
}//namespace type
}//namespace core
using namespace core::type;
}//namespace glm
#include "type_vec4.inl"
#endif//glm_core_type_gentype4

File diff suppressed because it is too large Load Diff

View File

@@ -1,98 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-01
// Updated : 2010-02-20
// Licence : This source is under MIT License
// File : glm/ext.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_ext
#define glm_ext
#include "gtc/double_float.hpp"
#include "gtc/half_float.hpp"
#include "gtc/matrix_access.hpp"
#include "gtc/matrix_operation.hpp"
#include "gtc/matrix_projection.hpp"
#include "gtc/matrix_transform.hpp"
#include "gtc/quaternion.hpp"
#include "gtc/swizzle.hpp"
//#include "./gtx/array_range.hpp"
#include "./gtx/associated_min_max.hpp"
#include "./gtx/bit.hpp"
#include "./gtx/closest_point.hpp"
#include "./gtx/color_cast.hpp"
#include "./gtx/color_space.hpp"
#include "./gtx/color_space_YCoCg.hpp"
#include "./gtx/compatibility.hpp"
#include "./gtx/component_wise.hpp"
//#include "./gtx/complex.hpp"
#include "./gtx/determinant.hpp"
#include "./gtx/double_float.hpp"
#include "./gtx/epsilon.hpp"
#include "./gtx/euler_angles.hpp"
#include "./gtx/extend.hpp"
#include "./gtx/extented_min_max.hpp"
#include "./gtx/fast_exponential.hpp"
#include "./gtx/fast_square_root.hpp"
#include "./gtx/fast_trigonometry.hpp"
//#include "./gtx/flexible_mix.hpp"
//#include "./gtx/gpu_shader4.hpp"
#include "./gtx/gradient_paint.hpp"
#include "./gtx/half_float.hpp"
#include "./gtx/handed_coordinate_space.hpp"
#include "./gtx/inertia.hpp"
#include "./gtx/integer.hpp"
#include "./gtx/intersect.hpp"
#include "./gtx/inverse.hpp"
#include "./gtx/inverse_transpose.hpp"
//#include "./gtx/mat_mn.hpp"
#include "./gtx/log_base.hpp"
#include "./gtx/matrix_access.hpp"
#include "./gtx/matrix_cross_product.hpp"
#include "./gtx/matrix_major_storage.hpp"
#include "./gtx/matrix_projection.hpp"
#include "./gtx/matrix_query.hpp"
#include "./gtx/matrix_selection.hpp"
//#include "./gtx/matx.hpp"
#include "./gtx/mixed_product.hpp"
#include "./gtx/norm.hpp"
#include "./gtx/normal.hpp"
#include "./gtx/normalize_dot.hpp"
#include "./gtx/number_precision.hpp"
#include "./gtx/optimum_pow.hpp"
#include "./gtx/orthonormalize.hpp"
#include "./gtx/perpendicular.hpp"
#include "./gtx/polar_coordinates.hpp"
#include "./gtx/projection.hpp"
#include "./gtx/quaternion.hpp"
#include "./gtx/random.hpp"
#include "./gtx/raw_data.hpp"
#include "./gtx/reciprocal.hpp"
#include "./gtx/rotate_vector.hpp"
#include "./gtx/spline.hpp"
#include "./gtx/std_based_type.hpp"
#include "./gtx/string_cast.hpp"
#include "./gtx/transform.hpp"
#include "./gtx/transform2.hpp"
#include "./gtx/unsigned_int.hpp"
#include "./gtx/vec1.hpp"
#include "./gtx/vector_access.hpp"
#include "./gtx/vector_angle.hpp"
#include "./gtx/vector_query.hpp"
//#include "./gtx/vecx.hpp"
#include "./gtx/verbose_operator.hpp"
#include "./img/multiple.hpp"
#include "./img/wrap.hpp"
#include "./virtrev/address.hpp"
#include "./virtrev/equal_operator.hpp"
#include "./virtrev/xstream.hpp"
//const float goldenRatio = 1.618033988749894848f;
//const float pi = 3.141592653589793238f;
#endif //glm_ext

View File

@@ -1,168 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-01-14
// Updated : 2009-05-01
// Licence : This source is under MIT License
// File : glm/glm.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
/*! \mainpage OpenGL Mathematics
*
* OpenGL Mathematics (GLM) is a C++ mathematics library for 3D applications based on the OpenGL Shading Language (GLSL) specification.
*
* The goal of the project is to provide to 3D programmers math classes and functions that miss in C++ when we use to program with GLSL or any high level GPU language. With GLM, the idea is to have a library that works the same way that GLSL which imply a strict following of GLSL specification for the implementation.
*
* However, this project isn't limited by GLSL features. An extension system based on GLSL extensions development conventions allows to extend GLSL capabilities.
*
* GLM is release under MIT license and available for all version of GCC from version 3.4 and Visual Studio from version 8.0 as a platform independent library.
*
* Any feedback is welcome, please send them to g.truc.creation[NO_SPAM_THANKS]gmail.com.
*
*/
#ifndef glm_glm
#define glm_glm
#ifdef max
#undef max
#endif
#ifdef min
#undef min
#endif
#define GLMvalType typename genType::value_type
#define GLMcolType typename genType::col_type
#define GLMrowType typename genType::row_type
#include <cmath>
#include <climits>
#include <cfloat>
#include <limits>
#include "./setup.hpp"
//! GLM namespace, it contains all GLSL based features.
namespace glm
{
namespace test
{
bool main_bug();
bool main_core();
}//namespace test
//! GLM core. Namespace that includes all the feature define by GLSL 1.30.8 specification. This namespace is included in glm namespace.
namespace core
{
//! Scalar, vectors and matrices
//! from section 4.1.2 Booleans, 4.1.3 Integers section, 4.1.4 Floats section,
//! 4.1.5 Vectors and section 4.1.6 Matrices of GLSL 1.30.8 specification.
//! This namespace resolves precision qualifier define in section 4.5 of GLSL 1.30.8 specification.
namespace type
{
/*
//! Scalar types from section 4.1.2 Booleans, 4.1.3 Integers and 4.1.4 Floats of GLSL 1.30.8 specification.
//! This namespace is included in glm namespace.
namespace scalar{}
//! Vector types from section 4.1.5 of GLSL 1.30.8 specification.
//! This namespace is included in glm namespace.
namespace vector{}
//! Matrix types from section 4.1.6 of GLSL 1.30.8 specification.
//! This namespace is included in glm namespace.
namespace matrix{}
*/
}
//! Some of the functions defined in section 8 Built-in Functions of GLSL 1.30.8 specification.
//! Angle and trigonometry, exponential, common, geometric, matrix and vector relational functions.
namespace function{}
}
//namespace core
//! G-Truc Creation stable extensions.
namespace gtc{}
//! G-Truc Creation experimental extensions.
//! The interface could change between releases.
namespace gtx{}
//! IMG extensions.
namespace img{}
//! VIRTREV extensions.
namespace img{}
} //namespace glm
#include "./core/_detail.hpp"
#include "./core/type.hpp"
#include "./core/func_trigonometric.hpp"
#include "./core/func_exponential.hpp"
#include "./core/func_common.hpp"
#include "./core/func_packing.hpp"
#include "./core/func_geometric.hpp"
#include "./core/func_matrix.hpp"
#include "./core/func_vector_relational.hpp"
#include "./core/func_integer.hpp"
#include "./core/func_noise.hpp"
#include "./core/_swizzle.hpp"
//#include "./core/_xref2.hpp"
//#include "./core/_xref3.hpp"
//#include "./core/_xref4.hpp"
#if(defined(GLM_MESSAGE) && (GLM_MESSAGE & (GLM_MESSAGE_CORE | GLM_MESSAGE_NOTIFICATION)))
# pragma message("GLM message: Core library included")
#endif//GLM_MESSAGE
#if(defined(GLM_COMPILER) && (GLM_COMPILER & GLM_COMPILER_VC))
#define GLM_DEPRECATED __declspec(deprecated)
#define GLM_RESTRICT __restrict
#define GLM_ALIGN(x) __declspec(align(x))
//#define aligned(x) __declspec(align(x)) struct
#else
#define GLM_DEPRECATED
#define GLM_RESTRICT
#define GLM_ALIGN(x)
#endif//GLM_COMPILER
////////////////////
// check type sizes
#ifndef GLM_STATIC_ASSERT_NULL
GLM_STATIC_ASSERT(sizeof(glm::detail::int8)==1);
GLM_STATIC_ASSERT(sizeof(glm::detail::int16)==2);
GLM_STATIC_ASSERT(sizeof(glm::detail::int32)==4);
GLM_STATIC_ASSERT(sizeof(glm::detail::int64)==8);
GLM_STATIC_ASSERT(sizeof(glm::detail::uint8)==1);
GLM_STATIC_ASSERT(sizeof(glm::detail::uint16)==2);
GLM_STATIC_ASSERT(sizeof(glm::detail::uint32)==4);
GLM_STATIC_ASSERT(sizeof(glm::detail::uint64)==8);
GLM_STATIC_ASSERT(sizeof(glm::detail::float16)==2);
GLM_STATIC_ASSERT(sizeof(glm::detail::float32)==4);
GLM_STATIC_ASSERT(sizeof(glm::detail::float64)==8);
#endif//GLM_STATIC_ASSERT_NULL
#endif //glm_glm

View File

@@ -1,65 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT License
// File : glm/gtc/double_float.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////
// Note:
// - This implementation doesn't need to redefine all build-in functions to
// support double based type.
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_double_float
#define glm_gtc_double_float
// Dependency:
#include "../glm.hpp"
namespace glm
{
namespace test{
bool main_gtc_double_float();
}//namespace test
namespace gtc{
//! GLM_GTC_double_float extension: Add support for double precision floating-point types
namespace double_float
{
//! Vector of 2 single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tvec2<float> fvec2;
//! Vector of 3 single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tvec3<float> fvec3;
//! Vector of 4 single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tvec4<float> fvec4;
//! 2 * 2 matrix of single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tmat2x2<float> fmat2;
//! 3 * 3 matrix of single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tmat3x3<float> fmat3;
//! 4 * 4 matrix of single-precision floating-point numbers.
//! From GLM_GTC_double_float extension.
typedef detail::tmat4x4<float> fmat4;
}//namespace double_float
}//namespace gtc
}//namespace glm
#include "double_float.inl"
namespace glm{using namespace gtc::double_float;}
#endif//glm_gtc_double_float

View File

@@ -1,16 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT licence
// File : glm/gtc/double_float.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail
{
}//namespace detail
}//namespace glm

View File

@@ -1,362 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2010-02-07
// Licence : This source is under MIT License
// File : glm/gtc/half_float.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_half_float
#define glm_gtc_half_float
// Dependency:
#include "../glm.hpp"
namespace glm
{
namespace test{
bool main_gtc_half_float();
}//namespace test
namespace detail
{
#ifndef GLM_USE_ANONYMOUS_UNION
template <>
struct tvec2<thalf>
{
enum ctor{null};
typedef thalf value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec2<thalf> type;
typedef tvec2<bool> bool_type;
//////////////////////////////////////
// Data
thalf x, y;
//////////////////////////////////////
// Accesses
thalf & operator[](size_type i);
thalf const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec2();
tvec2(tvec2<thalf> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec2(ctor);
explicit tvec2(
thalf const & s);
explicit tvec2(
thalf const & s1,
thalf const & s2);
//////////////////////////////////////
// Swizzle constructors
tvec2(tref2<thalf> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U, typename V>
explicit tvec2(U const & x, V const & y);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec2<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec3<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec2(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec2<thalf>& operator= (tvec2<thalf> const & v);
tvec2<thalf>& operator+=(thalf const & s);
tvec2<thalf>& operator+=(tvec2<thalf> const & v);
tvec2<thalf>& operator-=(thalf const & s);
tvec2<thalf>& operator-=(tvec2<thalf> const & v);
tvec2<thalf>& operator*=(thalf const & s);
tvec2<thalf>& operator*=(tvec2<thalf> const & v);
tvec2<thalf>& operator/=(thalf const & s);
tvec2<thalf>& operator/=(tvec2<thalf> const & v);
tvec2<thalf>& operator++();
tvec2<thalf>& operator--();
//////////////////////////////////////
// Swizzle operators
thalf swizzle(comp X) const;
tvec2<thalf> swizzle(comp X, comp Y) const;
tvec3<thalf> swizzle(comp X, comp Y, comp Z) const;
tvec4<thalf> swizzle(comp X, comp Y, comp Z, comp W) const;
tref2<thalf> swizzle(comp X, comp Y);
};
template <>
struct tvec3<thalf>
{
enum ctor{null};
typedef thalf value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec3<thalf> type;
typedef tvec3<bool> bool_type;
//////////////////////////////////////
// Data
thalf x, y, z;
//////////////////////////////////////
// Accesses
thalf & operator[](size_type i);
thalf const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec3();
tvec3(tvec3<thalf> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec3(ctor);
explicit tvec3(
thalf const & s);
explicit tvec3(
thalf const & s1,
thalf const & s2,
thalf const & s3);
//////////////////////////////////////
// Swizzle constructors
tvec3(tref3<thalf> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U, typename V, typename W>
explicit tvec3(U const & x, V const & y, W const & z);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec3(tvec2<A> const & v, B const & s);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec3(A const & s, tvec2<B> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(tvec3<U> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec3(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec3<thalf>& operator= (tvec3<thalf> const & v);
tvec3<thalf>& operator+=(thalf const & s);
tvec3<thalf>& operator+=(tvec3<thalf> const & v);
tvec3<thalf>& operator-=(thalf const & s);
tvec3<thalf>& operator-=(tvec3<thalf> const & v);
tvec3<thalf>& operator*=(thalf const & s);
tvec3<thalf>& operator*=(tvec3<thalf> const & v);
tvec3<thalf>& operator/=(thalf const & s);
tvec3<thalf>& operator/=(tvec3<thalf> const & v);
tvec3<thalf>& operator++();
tvec3<thalf>& operator--();
//////////////////////////////////////
// Swizzle operators
thalf swizzle(comp X) const;
tvec2<thalf> swizzle(comp X, comp Y) const;
tvec3<thalf> swizzle(comp X, comp Y, comp Z) const;
tvec4<thalf> swizzle(comp X, comp Y, comp Z, comp W) const;
tref3<thalf> swizzle(comp X, comp Y, comp Z);
};
template <>
struct tvec4<thalf>
{
enum ctor{null};
typedef thalf value_type;
typedef std::size_t size_type;
static size_type value_size();
typedef tvec4<thalf> type;
typedef tvec4<bool> bool_type;
//////////////////////////////////////
// Data
thalf x, y, z, w;
//////////////////////////////////////
// Accesses
thalf & operator[](size_type i);
thalf const & operator[](size_type i) const;
//////////////////////////////////////
// Implicit basic constructors
tvec4();
tvec4(tvec4<thalf> const & v);
//////////////////////////////////////
// Explicit basic constructors
explicit tvec4(ctor);
explicit tvec4(
thalf const & s);
explicit tvec4(
thalf const & s0,
thalf const & s1,
thalf const & s2,
thalf const & s3);
//////////////////////////////////////
// Swizzle constructors
tvec4(tref4<thalf> const & r);
//////////////////////////////////////
// Convertion scalar constructors
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec4(U const & x);
//! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C, typename D>
explicit tvec4(A const & x, B const & y, C const & z, D const & w);
//////////////////////////////////////
// Convertion vector constructors
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B, typename C>
explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(tvec3<A> const & v, B const & s);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(A const & s, tvec3<B> const & v);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename A, typename B>
explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2);
//! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
template <typename U>
explicit tvec4(tvec4<U> const & v);
//////////////////////////////////////
// Unary arithmetic operators
tvec4<thalf>& operator= (tvec4<thalf> const & v);
tvec4<thalf>& operator+=(thalf const & s);
tvec4<thalf>& operator+=(tvec4<thalf> const & v);
tvec4<thalf>& operator-=(thalf const & s);
tvec4<thalf>& operator-=(tvec4<thalf> const & v);
tvec4<thalf>& operator*=(thalf const & s);
tvec4<thalf>& operator*=(tvec4<thalf> const & v);
tvec4<thalf>& operator/=(thalf const & s);
tvec4<thalf>& operator/=(tvec4<thalf> const & v);
tvec4<thalf>& operator++();
tvec4<thalf>& operator--();
//////////////////////////////////////
// Swizzle operators
thalf swizzle(comp X) const;
tvec2<thalf> swizzle(comp X, comp Y) const;
tvec3<thalf> swizzle(comp X, comp Y, comp Z) const;
tvec4<thalf> swizzle(comp X, comp Y, comp Z, comp W) const;
tref4<thalf> swizzle(comp X, comp Y, comp Z, comp W);
};
#endif//GLM_USE_ANONYMOUS_UNION
}
//namespace detail
namespace gtc{
//! GLM_GTC_half_float extension: Add support for half precision floating-point types
namespace half_float
{
//! Type for half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::thalf half;
//! Vector of 2 half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tvec2<detail::thalf> hvec2;
//! Vector of 3 half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tvec3<detail::thalf> hvec3;
//! Vector of 4 half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tvec4<detail::thalf> hvec4;
//! 2 * 2 matrix of half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tmat2x2<detail::thalf> hmat2;
//! 3 * 3 matrix of half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tmat3x3<detail::thalf> hmat3;
//! 4 * 4 matrix of half-precision floating-point numbers.
//! From GLM_GTC_half_float extension.
typedef detail::tmat4x4<detail::thalf> hmat4;
}//namespace half_float
}//namespace gtc
}//namespace glm
#include "half_float.inl"
namespace glm{using namespace gtc::half_float;}
#endif//glm_gtc_half_float

View File

@@ -1,975 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-12-21
// Updated : 2010-02-07
// Licence : This source is under MIT licence
// File : glm/gtc/half_float.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace detail{
#ifndef GLM_USE_ANONYMOUS_UNION
//////////////////////////////////////
// hvec2
inline tvec2<thalf>::size_type tvec2<thalf>::value_size()
{
return 2;
}
//////////////////////////////////////
// Accesses
inline thalf & tvec2<thalf>::operator[](tvec2<thalf>::size_type i)
{
assert(i >= tvec2<thalf>::size_type(0) && i < tvec2<thalf>::value_size());
return (&x)[i];
}
inline thalf const & tvec2<thalf>::operator[](tvec2<thalf>::size_type i) const
{
assert(i >= tvec2<thalf>::size_type(0) && i < tvec2<thalf>::value_size());
return (&x)[i];
}
//////////////////////////////////////
// Implicit basic constructors
inline tvec2<thalf>::tvec2() :
x(thalf(0.f)),
y(thalf(0.f))
{}
inline tvec2<thalf>::tvec2
(
tvec2<thalf> const & v
) :
x(v.x),
y(v.y)
{}
//////////////////////////////////////
// Explicit basic constructors
inline tvec2<thalf>::tvec2
(
thalf const & s
) :
x(s),
y(s)
{}
inline tvec2<thalf>::tvec2
(
thalf const & s1,
thalf const & s2
) :
x(s1),
y(s2)
{}
//////////////////////////////////////
// Swizzle constructors
inline tvec2<thalf>::tvec2
(
tref2<thalf> const & r
) :
x(r.x),
y(r.y)
{}
//////////////////////////////////////
// Convertion scalar constructors
template <typename U>
inline tvec2<thalf>::tvec2
(
U const & x
) :
x(thalf(x)),
y(thalf(x))
{}
template <typename U, typename V>
inline tvec2<thalf>::tvec2
(
U const & x,
V const & y
) :
x(thalf(x)),
y(thalf(y))
{}
//////////////////////////////////////
// Convertion vector constructors
template <typename U>
inline tvec2<thalf>::tvec2
(
tvec2<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y))
{}
template <typename U>
inline tvec2<thalf>::tvec2
(
tvec3<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y))
{}
template <typename U>
inline tvec2<thalf>::tvec2
(
tvec4<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y))
{}
//////////////////////////////////////
// Unary arithmetic operators
inline tvec2<thalf> & tvec2<thalf>::operator=
(
tvec2<thalf> const & v
)
{
this->x = v.x;
this->y = v.y;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator+=
(
thalf const & s
)
{
this->x += s;
this->y += s;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator+=
(
tvec2<thalf> const & v
)
{
this->x += v.x;
this->y += v.y;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator-=
(
thalf const & s
)
{
this->x -= s;
this->y -= s;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator-=
(
tvec2<thalf> const & v
)
{
this->x -= v.x;
this->y -= v.y;
return *this;
}
inline tvec2<thalf>& tvec2<thalf>::operator*=
(
thalf const & s
)
{
this->x *= s;
this->y *= s;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator*=
(
tvec2<thalf> const & v
)
{
this->x *= v.x;
this->y *= v.y;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator/=
(
thalf const & s
)
{
this->x /= s;
this->y /= s;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator/=
(
tvec2<thalf> const & v
)
{
this->x /= v.x;
this->y /= v.y;
return *this;
}
inline tvec2<thalf> & tvec2<thalf>::operator++()
{
++this->x;
++this->y;
return *this;
}
inline tvec2<thalf>& tvec2<thalf>::operator--()
{
--this->x;
--this->y;
return *this;
}
//////////////////////////////////////
// Swizzle operators
inline thalf tvec2<thalf>::swizzle(comp x) const
{
return (*this)[x];
}
inline tvec2<thalf> tvec2<thalf>::swizzle(comp x, comp y) const
{
return tvec2<thalf>(
(*this)[x],
(*this)[y]);
}
inline tvec3<thalf> tvec2<thalf>::swizzle(comp x, comp y, comp z) const
{
return tvec3<thalf>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
inline tvec4<thalf> tvec2<thalf>::swizzle(comp x, comp y, comp z, comp w) const
{
return tvec4<thalf>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
inline tref2<thalf> tvec2<thalf>::swizzle(comp x, comp y)
{
return tref2<thalf>(
(*this)[x],
(*this)[y]);
}
//////////////////////////////////////
// hvec3
inline tvec3<thalf>::size_type tvec3<thalf>::value_size()
{
return 3;
}
//////////////////////////////////////
// Accesses
inline thalf & tvec3<thalf>::operator[]
(
tvec3<thalf>::size_type i
)
{
assert(i >= tvec3<thalf>::size_type(0) && i < tvec3<thalf>::value_size());
return (&x)[i];
}
inline thalf const & tvec3<thalf>::operator[]
(
tvec3<thalf>::size_type i
) const
{
assert(i >= tvec3<thalf>::size_type(0) && i < tvec3<thalf>::value_size());
return (&x)[i];
}
//////////////////////////////////////
// Implicit basic constructors
inline tvec3<thalf>::tvec3() :
x(thalf(0)),
y(thalf(0)),
z(thalf(0))
{}
inline tvec3<thalf>::tvec3
(
tvec3<thalf> const & v
) :
x(v.x),
y(v.y),
z(v.z)
{}
//////////////////////////////////////
// Explicit basic constructors
inline tvec3<thalf>::tvec3
(
thalf const & s
) :
x(s),
y(s),
z(s)
{}
inline tvec3<thalf>::tvec3
(
thalf const & s0,
thalf const & s1,
thalf const & s2
) :
x(s0),
y(s1),
z(s2)
{}
//////////////////////////////////////
// Swizzle constructors
inline tvec3<thalf>::tvec3
(
tref3<thalf> const & r
) :
x(r.x),
y(r.y),
z(r.z)
{}
//////////////////////////////////////
// Convertion scalar constructors
template <typename U>
inline tvec3<thalf>::tvec3
(
U const & x
) :
x(thalf(x)),
y(thalf(x)),
z(thalf(x))
{}
template <typename A, typename B, typename C>
inline tvec3<thalf>::tvec3
(
A const & x,
B const & y,
C const & z
) :
x(thalf(x)),
y(thalf(y)),
z(thalf(z))
{}
//////////////////////////////////////
// Convertion vector constructors
template <typename A, typename B>
inline tvec3<thalf>::tvec3
(
tvec2<A> const & v,
B const & s
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(s))
{}
template <typename A, typename B>
inline tvec3<thalf>::tvec3
(
A const & s,
tvec2<B> const & v
) :
x(thalf(s)),
y(thalf(v.x)),
z(thalf(v.y))
{}
template <typename U>
inline tvec3<thalf>::tvec3
(
tvec3<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(v.z))
{}
template <typename U>
inline tvec3<thalf>::tvec3
(
tvec4<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(v.z))
{}
//////////////////////////////////////
// Unary arithmetic operators
inline tvec3<thalf> & tvec3<thalf>::operator=
(
tvec3<thalf> const & v
)
{
this->x = v.x;
this->y = v.y;
this->z = v.z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator+=
(
thalf const & s
)
{
this->x += s;
this->y += s;
this->z += s;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator+=
(
tvec3<thalf> const & v
)
{
this->x += v.x;
this->y += v.y;
this->z += v.z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator-=
(
thalf const & s
)
{
this->x -= s;
this->y -= s;
this->z -= s;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator-=
(
tvec3<thalf> const & v
)
{
this->x -= v.x;
this->y -= v.y;
this->z -= v.z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator*=
(
thalf const & s
)
{
this->x *= s;
this->y *= s;
this->z *= s;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator*=
(
tvec3<thalf> const & v
)
{
this->x *= v.x;
this->y *= v.y;
this->z *= v.z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator/=
(
thalf const & s
)
{
this->x /= s;
this->y /= s;
this->z /= s;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator/=
(
tvec3<thalf> const & v
)
{
this->x /= v.x;
this->y /= v.y;
this->z /= v.z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator++()
{
++this->x;
++this->y;
++this->z;
return *this;
}
inline tvec3<thalf> & tvec3<thalf>::operator--()
{
--this->x;
--this->y;
--this->z;
return *this;
}
//////////////////////////////////////
// Swizzle operators
inline thalf tvec3<thalf>::swizzle(comp x) const
{
return (*this)[x];
}
inline tvec2<thalf> tvec3<thalf>::swizzle(comp x, comp y) const
{
return tvec2<thalf>(
(*this)[x],
(*this)[y]);
}
inline tvec3<thalf> tvec3<thalf>::swizzle(comp x, comp y, comp z) const
{
return tvec3<thalf>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
inline tvec4<thalf> tvec3<thalf>::swizzle(comp x, comp y, comp z, comp w) const
{
return tvec4<thalf>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
inline tref3<thalf> tvec3<thalf>::swizzle(comp x, comp y, comp z)
{
return tref3<thalf>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
//////////////////////////////////////
// hvec4
inline tvec4<thalf>::size_type tvec4<thalf>::value_size()
{
return 4;
}
//////////////////////////////////////
// Accesses
inline thalf & tvec4<thalf>::operator[]
(
tvec4<thalf>::size_type i
)
{
assert(i >= tvec4<thalf>::size_type(0) && i < tvec4<thalf>::value_size());
return (&x)[i];
}
inline thalf const & tvec4<thalf>::operator[]
(
tvec4<thalf>::size_type i
) const
{
assert(i >= tvec4<thalf>::size_type(0) && i < tvec4<thalf>::value_size());
return (&x)[i];
}
//////////////////////////////////////
// Implicit basic constructors
inline tvec4<thalf>::tvec4() :
x(thalf(0)),
y(thalf(0)),
z(thalf(0)),
w(thalf(0))
{}
inline tvec4<thalf>::tvec4
(
tvec4<thalf> const & v
) :
x(v.x),
y(v.y),
z(v.z),
w(v.w)
{}
//////////////////////////////////////
// Explicit basic constructors
inline tvec4<thalf>::tvec4
(
thalf const & s
) :
x(s),
y(s),
z(s),
w(s)
{}
inline tvec4<thalf>::tvec4
(
thalf const & s1,
thalf const & s2,
thalf const & s3,
thalf const & s4
) :
x(s1),
y(s2),
z(s3),
w(s4)
{}
//////////////////////////////////////
// Swizzle constructors
inline tvec4<thalf>::tvec4
(
tref4<thalf> const & r
) :
x(r.x),
y(r.y),
z(r.z),
w(r.w)
{}
//////////////////////////////////////
// Convertion scalar constructors
template <typename U>
inline tvec4<thalf>::tvec4
(
U const & x
) :
x(thalf(x)),
y(thalf(x)),
z(thalf(x)),
w(thalf(x))
{}
template <typename A, typename B, typename C, typename D>
inline tvec4<thalf>::tvec4
(
A const & x,
B const & y,
C const & z,
D const & w
) :
x(thalf(x)),
y(thalf(y)),
z(thalf(z)),
w(thalf(w))
{}
//////////////////////////////////////
// Convertion vector constructors
template <typename A, typename B, typename C>
inline tvec4<thalf>::tvec4
(
tvec2<A> const & v,
B const & s1,
C const & s2
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(s1)),
w(thalf(s2))
{}
template <typename A, typename B, typename C>
inline tvec4<thalf>::tvec4
(
A const & s1,
tvec2<B> const & v,
C const & s2
) :
x(thalf(s1)),
y(thalf(v.x)),
z(thalf(v.y)),
w(thalf(s2))
{}
template <typename A, typename B, typename C>
inline tvec4<thalf>::tvec4
(
A const & s1,
B const & s2,
tvec2<C> const & v
) :
x(thalf(s1)),
y(thalf(s2)),
z(thalf(v.x)),
w(thalf(v.y))
{}
template <typename A, typename B>
inline tvec4<thalf>::tvec4
(
tvec3<A> const & v,
B const & s
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(v.z)),
w(thalf(s))
{}
template <typename A, typename B>
inline tvec4<thalf>::tvec4
(
A const & s,
tvec3<B> const & v
) :
x(thalf(s)),
y(thalf(v.x)),
z(thalf(v.y)),
w(thalf(v.z))
{}
template <typename A, typename B>
inline tvec4<thalf>::tvec4
(
tvec2<A> const & v1,
tvec2<B> const & v2
) :
x(thalf(v1.x)),
y(thalf(v1.y)),
z(thalf(v2.x)),
w(thalf(v2.y))
{}
template <typename U>
inline tvec4<thalf>::tvec4
(
tvec4<U> const & v
) :
x(thalf(v.x)),
y(thalf(v.y)),
z(thalf(v.z)),
w(thalf(v.w))
{}
//////////////////////////////////////
// Unary arithmetic operators
inline tvec4<thalf>& tvec4<thalf>::operator=
(
tvec4<thalf> const & v
)
{
this->x = v.x;
this->y = v.y;
this->z = v.z;
this->w = v.w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator+=
(
thalf const & s
)
{
this->x += s;
this->y += s;
this->z += s;
this->w += s;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator+=
(
tvec4<thalf> const & v
)
{
this->x += v.x;
this->y += v.y;
this->z += v.z;
this->w += v.w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator-=
(
thalf const & s
)
{
this->x -= s;
this->y -= s;
this->z -= s;
this->w -= s;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator-=
(
tvec4<thalf> const & v
)
{
this->x -= v.x;
this->y -= v.y;
this->z -= v.z;
this->w -= v.w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator*=
(
thalf const & s
)
{
this->x *= s;
this->y *= s;
this->z *= s;
this->w *= s;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator*=
(
tvec4<thalf> const & v
)
{
this->x *= v.x;
this->y *= v.y;
this->z *= v.z;
this->w *= v.w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator/=
(
thalf const & s
)
{
this->x /= s;
this->y /= s;
this->z /= s;
this->w /= s;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator/=
(
tvec4<thalf> const & v
)
{
this->x /= v.x;
this->y /= v.y;
this->z /= v.z;
this->w /= v.w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator++()
{
++this->x;
++this->y;
++this->z;
++this->w;
return *this;
}
inline tvec4<thalf>& tvec4<thalf>::operator--()
{
--this->x;
--this->y;
--this->z;
--this->w;
return *this;
}
//////////////////////////////////////
// Swizzle operators
inline thalf tvec4<thalf>::swizzle(comp x) const
{
return (*this)[x];
}
inline tvec2<thalf> tvec4<thalf>::swizzle(comp x, comp y) const
{
return tvec2<thalf>(
(*this)[x],
(*this)[y]);
}
inline tvec3<thalf> tvec4<thalf>::swizzle(comp x, comp y, comp z) const
{
return tvec3<thalf>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
inline tvec4<thalf> tvec4<thalf>::swizzle(comp x, comp y, comp z, comp w) const
{
return tvec4<thalf>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
inline tref4<thalf> tvec4<thalf>::swizzle(comp x, comp y, comp z, comp w)
{
return tref4<thalf>(
(*this)[x],
(*this)[y],
(*this)[z],
(*this)[w]);
}
#endif//GLM_USE_ANONYMOUS_UNION
}//namespace detail
}//namespace glm

View File

@@ -1,33 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT License
// File : glm/gtc/matrix_operation.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_matrix_operation
#define glm_gtc_matrix_operation
// Dependency:
#include "../glm.hpp"
namespace glm{
namespace gtc{
//! GLM_GTC_matrix_operation extension: Matrix operation functions
namespace matrix_operation
{
}//namespace matrix_operation
}//namespace gtc
}//namespace glm
#include "matrix_operation.inl"
namespace glm{using namespace gtc::matrix_operation;}
#endif//glm_gtc_matrix_operation

View File

@@ -1,17 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT License
// File : glm/gtc/matrix_operation.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace gtc{
namespace matrix_operation
{
}//namespace matrix_operation
}//namespace gtc
}//namespace glm

View File

@@ -1,99 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2010-02-07
// Licence : This source is under MIT License
// File : glm/gtc/matrix_projection.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTC_matrix_operation
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_matrix_projection
#define glm_gtc_matrix_projection
// Dependency:
#include "../glm.hpp"
#include "../gtc/matrix_operation.hpp"
namespace glm
{
namespace test{
bool main_gtc_matrix_projection();
}//namespace test
namespace gtc{
//! GLM_GTC_matrix_projection: Varius ways to build and operate on projection matrices
namespace matrix_projection
{
using namespace gtc::matrix_operation;
//! Creates a matrix for projecting two-dimensional coordinates onto the screen.
//! From GLM_GTC_matrix_projection extension.
template <typename T>
detail::tmat4x4<T> ortho(
T const & left,
T const & right,
T const & bottom,
T const & top);
//! Creates a matrix for an orthographic parallel viewing volume.
//! From GLM_GTC_matrix_projection extension.
template <typename T>
detail::tmat4x4<T> ortho(
T const & left,
T const & right,
T const & bottom,
T const & top,
T const & zNear,
T const & zFar);
//! Creates a frustum matrix.
//! From GLM_GTC_matrix_projection extension.
template <typename T>
detail::tmat4x4<T> frustum(
T const & left,
T const & right,
T const & bottom,
T const & top,
T const & nearVal,
T const & farVal);
//! Creates a matrix for a symetric perspective-view frustum.
//! From GLM_GTC_matrix_projection extension.
template <typename T>
detail::tmat4x4<T> perspective(
T const & fovy,
T const & aspect,
T const & zNear,
T const & zFar);
//! Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates.
//! From GLM_GTC_matrix_projection extension.
template <typename T, typename U>
detail::tvec3<T> project(
detail::tvec3<T> const & obj,
detail::tmat4x4<T> const & model,
detail::tmat4x4<T> const & proj,
detail::tvec4<U> const & viewport);
//! Map the specified window coordinates (win.x, win.y, win.z) into object coordinates.
//! From GLM_GTC_matrix_projection extension.
template <typename T, typename U>
detail::tvec3<T> unProject(
detail::tvec3<T> const & win,
detail::tmat4x4<T> const & model,
detail::tmat4x4<T> const & proj,
detail::tvec4<U> const & viewport);
}//namespace matrix_projection
}//namespace gtc
}//namespace glm
#include "matrix_projection.inl"
namespace glm{using namespace gtc::matrix_projection;}
#endif//glm_gtc_matrix_projection

View File

@@ -1,132 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2010-02-07
// Licence : This source is under MIT License
// File : glm/gtc/matrix_projection.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace gtc{
namespace matrix_projection
{
template <typename valType>
inline 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>
inline 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>
inline 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>
inline 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;
}
template <typename T, typename U>
inline 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]);
return detail::tvec3<T>(tmp);
}
template <typename T, typename U>
inline 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> obj = inverse * tmp;
obj /= obj.w;
return detail::tvec3<T>(obj);
}
}//namespace matrix_projection
}//namespace gtc
}//namespace glm

View File

@@ -1,63 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT License
// File : glm/gtc/matrix_transform.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTC_matrix_operation
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_matrix_transform
#define glm_gtc_matrix_transform
// Dependency:
#include "../glm.hpp"
#include "../gtc/matrix_operation.hpp"
namespace glm
{
namespace test{
bool main_gtc_matrix_transform();
}//namespace test
namespace gtc{
//! GLM_GTC_matrix_transform extension: Add transformation matrices
namespace matrix_transform
{
using namespace gtc::matrix_operation;
//! Builds a translation 4 * 4 matrix created from a vector of 3 components.
//! From GLM_GTC_matrix_transform extension.
template <typename T>
detail::tmat4x4<T> translate(
detail::tmat4x4<T> const & m,
detail::tvec3<T> const & v);
//! Builds a rotation 4 * 4 matrix created from an axis vector and an angle expressed in degrees.
//! From GLM_GTC_matrix_transform extension.
template <typename T>
detail::tmat4x4<T> rotate(
detail::tmat4x4<T> const & m,
T const & angle,
detail::tvec3<T> const & v);
//! Builds a scale 4 * 4 matrix created from 3 scalars.
//! From GLM_GTC_matrix_transform extension.
template <typename T>
detail::tmat4x4<T> scale(
detail::tmat4x4<T> const & m,
detail::tvec3<T> const & v);
}//namespace matrix_transform
}//namespace gtc
}//namespace glm
#include "matrix_transform.inl"
namespace glm{using namespace gtc::matrix_transform;}
#endif//glm_gtc_matrix_transform

View File

@@ -1,148 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-04-29
// Updated : 2009-04-29
// Licence : This source is under MIT License
// File : glm/gtc/matrix_transform.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace gtc{
namespace matrix_transform
{
template <typename T>
inline 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>
inline 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> 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];
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];
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>
inline 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>
inline 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;
}
template <typename T>
inline 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);
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[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;
}
template <typename T>
inline 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;
}
}//namespace matrix_transform
}//namespace gtc
}//namespace glm

View File

@@ -1,222 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-21
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/gtc/quaternion.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTC_half_float
// - GLM_GTC_double_float
///////////////////////////////////////////////////////////////////////////////////////////////////
// ToDo:
// - Study constructors with angles and axis
// - Study constructors with vec3 that are the imaginary component of quaternion
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_quaternion
#define glm_gtc_quaternion
// Dependency:
#include "../glm.hpp"
#include "../gtc/half_float.hpp"
#include "../gtc/double_float.hpp"
namespace glm
{
namespace test{
bool main_gtc_quaternion();
}//namespace test
namespace detail
{
//! \brief Template for quaternion.
//! From GLM_GTC_quaternion extension.
template <typename T>
struct tquat// : public genType<T, tquat>
{
typedef T value_type;
public:
value_type x, y, z, w;
// Constructors
tquat();
explicit tquat(
value_type const & s,
tvec3<T> const & v);
explicit tquat(
value_type const & w,
value_type const & x,
value_type const & y,
value_type const & z);
// Convertions
//explicit tquat(valType const & pitch, valType const & yaw, valType const & roll);
//! pitch, yaw, roll
explicit tquat(
tvec3<T> const & eulerAngles);
explicit tquat(
tmat3x3<T> const & m);
explicit tquat(
tmat4x4<T> const & m);
// Accesses
value_type & operator[](int i);
value_type const & operator[](int i) const;
// Operators
tquat<T> & operator*=(value_type const & s);
tquat<T> & operator/=(value_type const & s);
};
template <typename T>
detail::tquat<T> operator- (
detail::tquat<T> const & q);
template <typename T>
detail::tvec3<T> operator* (
detail::tquat<T> const & q,
detail::tvec3<T> const & v);
template <typename T>
detail::tvec3<T> operator* (
detail::tvec3<T> const & v,
detail::tquat<T> const & q);
template <typename T>
detail::tvec4<T> operator* (
detail::tquat<T> const & q,
detail::tvec4<T> const & v);
template <typename T>
detail::tvec4<T> operator* (
detail::tvec4<T> const & v,
detail::tquat<T> const & q);
template <typename T>
detail::tquat<T> operator* (
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & s);
template <typename T>
detail::tquat<T> operator* (
typename detail::tquat<T>::value_type const & s,
detail::tquat<T> const & q);
template <typename T>
detail::tquat<T> operator/ (
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & s);
} //namespace detail
namespace gtc{
//! GLM_GTC_quaternion extension: Quaternion types and functions
namespace quaternion
{
//! Returns the length of the quaternion x.
//! From GLM_GTC_quaternion extension.
template <typename T>
typename detail::tquat<T>::value_type length(
detail::tquat<T> const & q);
//! Returns the normalized quaternion of from x.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> normalize(
detail::tquat<T> const & q);
//! Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...
//! From GLM_GTC_quaternion extension.
template <typename T>
typename detail::tquat<T>::value_type dot(
detail::tquat<T> const & q1,
detail::tquat<T> const & q2);
//! Returns the cross product of q1 and q2.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> cross(
detail::tquat<T> const & q1,
detail::tquat<T> const & q2);
//! Returns a LERP interpolated quaternion of x and y according a.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> mix(
detail::tquat<T> const & x,
detail::tquat<T> const & y,
typename detail::tquat<T>::value_type const & a);
//! Returns the q conjugate.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> conjugate(
detail::tquat<T> const & q);
//! Returns the q inverse.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> inverse(
detail::tquat<T> const & q);
//! Rotates a quaternion from an vector of 3 components axis and an angle expressed in degrees.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> rotate(
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & angle,
detail::tvec3<T> const & v);
//! Converts a quaternion to a 3 * 3 matrix.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tmat3x3<T> mat3_cast(
detail::tquat<T> const & x);
//! Converts a quaternion to a 4 * 4 matrix.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tmat4x4<T> mat4_cast(
detail::tquat<T> const & x);
//! Converts a 3 * 3 matrix to a quaternion.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> quat_cast(
detail::tmat3x3<T> const & x);
//! Converts a 4 * 4 matrix to a quaternion.
//! From GLM_GTC_quaternion extension.
template <typename T>
detail::tquat<T> quat_cast(
detail::tmat4x4<T> const & x);
//! Quaternion of floating-point numbers.
//! From GLM_GTC_quaternion extension.
typedef detail::tquat<float> quat;
//! Quaternion of half-precision floating-point numbers.
//! From GLM_GTC_quaternion extension.
typedef detail::tquat<detail::thalf> hquat;
//! Quaternion of single-precision floating-point numbers.
//! From GLM_GTC_quaternion extension.
typedef detail::tquat<float> fquat;
//! Quaternion of double-precision floating-point numbers.
//! From GLM_GTC_quaternion extension.
typedef detail::tquat<double> dquat;
}//namespace quaternion
}//namespace gtc
} //namespace glm
#include "quaternion.inl"
namespace glm{using namespace gtc::quaternion;}
#endif//glm_gtc_quaternion

View File

@@ -1,483 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-05-21
// Updated : 2010-02-04
// Licence : This source is under MIT License
// File : glm/gtc/quaternion.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <limits>
namespace glm{
namespace detail{
template <typename T>
inline tquat<T>::tquat() :
x(0),
y(0),
z(0),
w(1)
{}
template <typename T>
inline tquat<T>::tquat
(
value_type const & s,
tvec3<T> const & v
) :
x(v.x),
y(v.y),
z(v.z),
w(s)
{}
template <typename T>
inline tquat<T>::tquat
(
value_type const & w,
value_type const & x,
value_type const & y,
value_type const & z
) :
x(x),
y(y),
z(z),
w(w)
{}
//////////////////////////////////////////////////////////////
// tquat conversions
//template <typename valType>
//inline tquat<valType>::tquat
//(
// valType const & pitch,
// valType const & yaw,
// valType const & roll
//)
//{
// tvec3<valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5));
// tvec3<valType> c = glm::cos(eulerAngle * valType(0.5));
// tvec3<valType> s = glm::sin(eulerAngle * valType(0.5));
//
// this->w = c.x * c.y * c.z + s.x * s.y * s.z;
// this->x = s.x * c.y * c.z - c.x * s.y * s.z;
// this->y = c.x * s.y * c.z + s.x * c.y * s.z;
// this->z = c.x * c.y * s.z - s.x * s.y * c.z;
//}
template <typename T>
inline tquat<T>::tquat
(
tvec3<T> const & eulerAngle
)
{
tvec3<T> c = glm::cos(eulerAngle * value_type(0.5));
tvec3<T> s = glm::sin(eulerAngle * value_type(0.5));
this->w = c.x * c.y * c.z + s.x * s.y * s.z;
this->x = s.x * c.y * c.z - c.x * s.y * s.z;
this->y = c.x * s.y * c.z + s.x * c.y * s.z;
this->z = c.x * c.y * s.z - s.x * s.y * c.z;
}
template <typename T>
inline tquat<T>::tquat
(
tmat3x3<T> const & m
)
{
*this = toQuat(m);
}
template <typename T>
inline tquat<T>::tquat
(
tmat4x4<T> const & m
)
{
*this = toQuat(m);
}
//////////////////////////////////////////////////////////////
// tquat<T> accesses
template <typename T>
inline typename tquat<T>::value_type & tquat<T>::operator [] (int i)
{
return (&x)[i];
}
template <typename T>
inline typename tquat<T>::value_type const & tquat<T>::operator [] (int i) const
{
return (&x)[i];
}
//////////////////////////////////////////////////////////////
// tquat<valType> operators
template <typename T>
inline tquat<T> & tquat<T>::operator *=
(
value_type const & s
)
{
this->w *= s;
this->x *= s;
this->y *= s;
this->z *= s;
return *this;
}
template <typename T>
inline tquat<T> & tquat<T>::operator /=
(
value_type const & s
)
{
this->w /= s;
this->x /= s;
this->y /= s;
this->z /= s;
return *this;
}
//////////////////////////////////////////////////////////////
// tquat<valType> external operators
template <typename T>
inline detail::tquat<T> operator-
(
detail::tquat<T> const & q
)
{
return detail::tquat<T>(-q.w, -q.x, -q.y, -q.z);
}
// Transformation
template <typename T>
inline detail::tvec3<T> operator*
(
detail::tquat<T> const & q,
detail::tvec3<T> const & v
)
{
typename detail::tquat<T>::value_type Two(2);
detail::tvec3<T> uv, uuv;
detail::tvec3<T> QuatVector(q.x, q.y, q.z);
uv = glm::cross(QuatVector, v);
uuv = glm::cross(QuatVector, uv);
uv *= (Two * q.w);
uuv *= Two;
return v + uv + uuv;
}
template <typename T>
inline detail::tvec3<T> operator*
(
detail::tvec3<T> const & v,
detail::tquat<T> const & q
)
{
return gtc::quaternion::inverse(q) * v;
}
template <typename T>
inline detail::tvec4<T> operator*
(
detail::tquat<T> const & q,
detail::tvec4<T> const & v
)
{
return detail::tvec4<T>(q * detail::tvec3<T>(v), v.w);
}
template <typename T>
inline detail::tvec4<T> operator*
(
detail::tvec4<T> const & v,
detail::tquat<T> const & q
)
{
return gtc::quaternion::inverse(q) * v;
}
template <typename T>
inline detail::tquat<T> operator*
(
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & s
)
{
return detail::tquat<T>(
q.w * s, q.x * s, q.y * s, q.z * s);
}
template <typename T>
inline detail::tquat<T> operator*
(
typename detail::tquat<T>::value_type const & s,
detail::tquat<T> const & q
)
{
return q * s;
}
template <typename T>
inline detail::tquat<T> operator/
(
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & s
)
{
return detail::tquat<T>(
q.w / s, q.x / s, q.y / s, q.z / s);
}
}//namespace detail
namespace gtc{
namespace quaternion{
////////////////////////////////////////////////////////
template <typename T>
inline typename detail::tquat<T>::value_type length
(
detail::tquat<T> const & q
)
{
return glm::sqrt(dot(q, q));
}
template <typename T>
inline detail::tquat<T> normalize
(
detail::tquat<T> const & q
)
{
typename detail::tquat<T>::value_type len = length(q);
if(len <= typename detail::tquat<T>::value_type(0)) // Problem
return detail::tquat<T>(1, 0, 0, 0);
typename detail::tquat<T>::value_type oneOverLen = typename detail::tquat<T>::value_type(1) / len;
return detail::tquat<T>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen);
}
template <typename T>
inline typename detail::tquat<T>::value_type dot
(
detail::tquat<T> const & q1,
detail::tquat<T> const & q2
)
{
return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
}
template <typename T>
inline detail::tquat<T> cross
(
detail::tquat<T> const & q1,
detail::tquat<T> const & q2
)
{
return detail::tquat<T>(
q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z,
q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y,
q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z,
q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x);
}
template <typename T>
inline detail::tquat<T> mix
(
detail::tquat<T> const & x,
detail::tquat<T> const & y,
typename detail::tquat<T>::value_type const & a
)
{
if(a <= typename detail::tquat<T>::value_type(0)) return x;
if(a >= typename detail::tquat<T>::value_type(1)) return y;
float fCos = dot(x, y);
detail::tquat<T> y2(y); //BUG!!! tquat<T> y2;
if(fCos < typename detail::tquat<T>::value_type(0))
{
y2 = -y;
fCos = -fCos;
}
//if(fCos > 1.0f) // problem
float k0, k1;
if(fCos > typename detail::tquat<T>::value_type(0.9999))
{
k0 = typename detail::tquat<T>::value_type(1) - a;
k1 = typename detail::tquat<T>::value_type(0) + a; //BUG!!! 1.0f + a;
}
else
{
typename detail::tquat<T>::value_type fSin = sqrt(T(1) - fCos * fCos);
typename detail::tquat<T>::value_type fAngle = atan(fSin, fCos);
typename detail::tquat<T>::value_type fOneOverSin = T(1) / fSin;
k0 = sin((typename detail::tquat<T>::value_type(1) - a) * fAngle) * fOneOverSin;
k1 = sin((typename detail::tquat<T>::value_type(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>
inline detail::tquat<T> conjugate
(
detail::tquat<T> const & q
)
{
return detail::tquat<T>(q.w, -q.x, -q.y, -q.z);
}
template <typename T>
inline detail::tquat<T> inverse
(
detail::tquat<T> const & q
)
{
return gtc::quaternion::conjugate(q) / gtc::quaternion::length(q);
}
template <typename T>
inline detail::tquat<T> rotate
(
detail::tquat<T> const & q,
typename detail::tquat<T>::value_type const & angle,
detail::tvec3<T> const & v
)
{
detail::tvec3<T> Tmp = v;
// Axis of rotation must be normalised
typename detail::tquat<T>::value_type len = glm::core::function::geometric::length(Tmp);
if(abs(len - typename detail::tquat<T>::value_type(1)) > typename detail::tquat<T>::value_type(0.001))
{
T oneOverLen = T(1) / len;
Tmp.x *= oneOverLen;
Tmp.y *= oneOverLen;
Tmp.z *= oneOverLen;
}
typename detail::tquat<T>::value_type AngleRad = radians(angle);
typename detail::tquat<T>::value_type fSin = sin(AngleRad * T(0.5));
return gtc::quaternion::cross(q, detail::tquat<T>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin));
}
template <typename T>
inline detail::tmat3x3<T> mat3_cast
(
detail::tquat<T> const & q
)
{
detail::tmat3x3<T> Result(typename detail::tquat<T>::value_type(1));
Result[0][0] = 1 - 2 * q.y * q.y - 2 * q.z * q.z;
Result[0][1] = 2 * q.x * q.y + 2 * q.w * q.z;
Result[0][2] = 2 * q.x * q.z - 2 * q.w * q.y;
Result[1][0] = 2 * q.x * q.y - 2 * q.w * q.z;
Result[1][1] = 1 - 2 * q.x * q.x - 2 * q.z * q.z;
Result[1][2] = 2 * q.y * q.z + 2 * q.w * q.x;
Result[2][0] = 2 * q.x * q.z + 2 * q.w * q.y;
Result[2][1] = 2 * q.y * q.z - 2 * q.w * q.x;
Result[2][2] = 1 - 2 * q.x * q.x - 2 * q.y * q.y;
return Result;
}
template <typename T>
inline detail::tmat4x4<T> mat4_cast
(
detail::tquat<T> const & q
)
{
return detail::tmat4x4<T>(mat3_cast(q));
}
template <typename T>
inline detail::tquat<T> quat_cast
(
detail::tmat3x3<T> const & m
)
{
typename detail::tquat<T>::value_type fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2];
typename detail::tquat<T>::value_type fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2];
typename detail::tquat<T>::value_type fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1];
typename detail::tquat<T>::value_type fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2];
int biggestIndex = 0;
typename detail::tquat<T>::value_type fourBiggestSquaredMinus1 = fourWSquaredMinus1;
if(fourXSquaredMinus1 > fourBiggestSquaredMinus1)
{
fourBiggestSquaredMinus1 = fourXSquaredMinus1;
biggestIndex = 1;
}
if(fourYSquaredMinus1 > fourBiggestSquaredMinus1)
{
fourBiggestSquaredMinus1 = fourYSquaredMinus1;
biggestIndex = 2;
}
if(fourZSquaredMinus1 > fourBiggestSquaredMinus1)
{
fourBiggestSquaredMinus1 = fourZSquaredMinus1;
biggestIndex = 3;
}
typename detail::tquat<T>::value_type biggestVal = sqrt(fourBiggestSquaredMinus1 + typename detail::tquat<T>::value_type(1)) * typename detail::tquat<T>::value_type(0.5);
typename detail::tquat<T>::value_type mult = typename detail::tquat<T>::value_type(0.25) / biggestVal;
detail::tquat<T> Result;
switch(biggestIndex)
{
case 0:
Result.w = biggestVal;
Result.x = (m[1][2] - m[2][1]) * mult;
Result.y = (m[2][0] - m[0][2]) * mult;
Result.z = (m[0][1] - m[1][0]) * mult;
break;
case 1:
Result.w = (m[1][2] - m[2][1]) * mult;
Result.x = biggestVal;
Result.y = (m[0][1] + m[1][0]) * mult;
Result.z = (m[2][0] + m[0][2]) * mult; //Result.z = (m[2][1] + m[1][2]) * mult;
break;
case 2:
Result.w = (m[2][0] - m[0][2]) * mult;
Result.x = (m[0][1] + m[1][0]) * mult;
Result.y = biggestVal;
Result.z = (m[1][2] + m[2][1]) * mult;
break;
case 3:
Result.w = (m[0][1] - m[1][0]) * mult;
Result.x = (m[2][0] + m[0][2]) * mult;
Result.y = (m[1][2] + m[2][1]) * mult;
Result.z = biggestVal;
break;
}
return Result;
}
template <typename T>
inline detail::tquat<T> quat_cast
(
detail::tmat4x4<T> const & m4
)
{
return quat_cast(detail::tmat3x3<T>(m4));
}
}//namespace quaternion
}//namespace gtc
}//namespace glm

View File

@@ -1,39 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2010-02-20
// Updated : 2010-02-20
// Licence : This source is under MIT License
// File : glm/gtc/swizzle.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_swizzle
#define glm_gtc_closest_point
// Dependency:
#include "../glm.hpp"
namespace glm
{
namespace test{
void main_gtc_swizzle();
}//namespace test
namespace gtc{
//! GLM_GTC_swizzle extension
namespace glm_gtc_swizzle{
}//namespace closest_point
}//namespace gtc
}//namespace glm
#include "swizzle.inl"
namespace glm{using namespace gtc::swizzle;}
#endif//glm_gtc_swizzle

View File

@@ -1,62 +0,0 @@
namespace glm{
namespace gtc{
namespace glm_gtc_swizzle
{
template <typename T>
inline typename tvec4<T>::value_type swizzle
(
detail::tvec4<T> const & v,
comp x
) const
{
return v[x];
}
template <typename T>
inline tvec2<T> tvec4<T>::swizzle
(
detail::tvec4<T> const & v,
comp x, comp y
) const
{
return tvec2<T>(
(*this)[x],
(*this)[y]);
}
template <typename T>
inline tvec3<T> tvec4<T>::swizzle
(
detail::tvec4<T> const & v,
comp x, comp y, comp z
) const
{
return tvec3<T>(
(*this)[x],
(*this)[y],
(*this)[z]);
}
template <typename T>
inline tvec4<T> tvec4<T>::swizzle
(
detail::tvec4<T> const & v,
comp x, comp y, comp z, comp w
) const
{
return tvec4<T>(v[x], v[y], v[z], v[w]);
}
template <typename T>
inline tref4<T> swizzle
(
detail::tvec4<T> const & v,
comp x, comp y, comp z, comp w
)
{
return tref4<T>(v[x], v[y], v[z], v[w]);
}
}//namespace glm_gtc_swizzle
}//namespace gtc
}//namespace glm

View File

@@ -1,200 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-04
// Updated : 2009-06-04
// Licence : This source is under MIT License
// File : glm/gtc/type_precision.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTC_half
// - GLM_GTC_double
// - GLM_GTC_quaternion
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtc_type_precision
#define glm_gtc_type_precision
// Dependency:
#include "../glm.hpp"
#include "../gtc/half_float.hpp"
#include "../gtc/double_float.hpp"
#include "../gtc/quaternion.hpp"
namespace glm
{
namespace test{
bool main_gtc_type_precision();
}//namespace test
namespace gtc{
//! GLM_GTC_type_precision extension: Defined types with specific size.
namespace type_precision
{
///////////////////////////
// Dependences
using namespace gtc::half_float;
using namespace gtc::double_float;
using namespace gtc::quaternion;
///////////////////////////
// Signed int vector types
typedef detail::int8 int8; //!< \brief 8bit signed integer. (from GLM_GTC_type_precision extension)
typedef detail::int16 int16; //!< \brief 16bit signed integer. (from GLM_GTC_type_precision extension)
typedef detail::int32 int32; //!< \brief 32bit signed integer. (from GLM_GTC_type_precision extension)
typedef detail::int64 int64; //!< \brief 64bit signed integer. (from GLM_GTC_type_precision extension)
typedef int8 i8; //!< \brief 8bit signed integer. (from GLM_GTC_type_precision extension)
typedef int16 i16; //!< \brief 16bit signed integer. (from GLM_GTC_type_precision extension)
typedef int32 i32; //!< \brief 32bit signed integer. (from GLM_GTC_type_precision extension)
typedef int64 i64; //!< \brief 64bit signed integer. (from GLM_GTC_type_precision extension)
//typedef i8 i8vec1; //!< \brief 8bit signed integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<i8> i8vec2; //!< \brief 8bit signed integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<i8> i8vec3; //!< \brief 8bit signed integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<i8> i8vec4; //!< \brief 8bit signed integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef i16 i16vec1; //!< \brief 16bit signed integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<i16> i16vec2; //!< \brief 16bit signed integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<i16> i16vec3; //!< \brief 16bit signed integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<i16> i16vec4; //!< \brief 16bit signed integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef i32 i32vec1; //!< \brief 32bit signed integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<i32> i32vec2; //!< \brief 32bit signed integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<i32> i32vec3; //!< \brief 32bit signed integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<i32> i32vec4; //!< \brief 32bit signed integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef i64 i64vec1; //!< \brief 32bit signed integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<i64> i64vec2; //!< \brief 64bit signed integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<i64> i64vec3; //!< \brief 64bit signed integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<i64> i64vec4; //!< \brief 64bit signed integer vector of 4 components. (from GLM_GTC_type_precision extension)
/////////////////////////////
// Unsigned int vector types
typedef detail::uint8 uint8; //!< \brief 8bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef detail::uint16 uint16; //!< \brief 16bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef detail::uint32 uint32; //!< \brief 32bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef detail::uint64 uint64; //!< \brief 64bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef uint8 u8; //!< \brief 8bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef uint16 u16; //!< \brief 16bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef uint32 u32; //!< \brief 32bit unsigned integer. (from GLM_GTC_type_precision extension)
typedef uint64 u64; //!< \brief 64bit unsigned integer. (from GLM_GTC_type_precision extension)
//typedef u8 u8vec1; //!< \brief 8bit unsigned integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<u8> u8vec2; //!< \brief 8bit unsigned integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<u8> u8vec3; //!< \brief 8bit unsigned integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<u8> u8vec4; //!< \brief 8bit unsigned integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef u16 u16vec1; //!< \brief 16bit unsigned integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<u16> u16vec2; //!< \brief 16bit unsigned integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<u16> u16vec3; //!< \brief 16bit unsigned integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<u16> u16vec4; //!< \brief 16bit unsigned integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef u32 u32vec1; //!< \brief 32bit unsigned integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<u32> u32vec2; //!< \brief 32bit unsigned integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<u32> u32vec3; //!< \brief 32bit unsigned integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<u32> u32vec4; //!< \brief 32bit unsigned integer vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<u64> u64vec2; //!< \brief 64bit unsigned integer vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<u64> u64vec3; //!< \brief 64bit unsigned integer vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<u64> u64vec4; //!< \brief 64bit unsigned integer vector of 4 components. (from GLM_GTC_type_precision extension)
//////////////////////
// Float vector types
typedef detail::float16 float16; //!< \brief Half-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::float32 float32; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::float64 float64; //!< \brief Double-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef float16 f16; //!< \brief Half-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef float32 f32; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef float64 f64; //!< \brief Double-precision floating-point scalar. (from GLM_GTC_type_precision extension)
//typedef f16 f16vec1; //!< \brief Half-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<f16> f16vec2; //!< \brief Half-precision floating-point vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<f16> f16vec3; //!< \brief Half-precision floating-point vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<f16> f16vec4; //!< \brief Half-precision floating-point vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef f32 f32vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<f32> f32vec2; //!< \brief Single-precision floating-point vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<f32> f32vec3; //!< \brief Single-precision floating-point vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<f32> f32vec4; //!< \brief Single-precision floating-point vector of 4 components. (from GLM_GTC_type_precision extension)
//typedef f64 f64vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tvec2<f64> f64vec2; //!< \brief Double-precision floating-point vector of 2 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec3<f64> f64vec3; //!< \brief Double-precision floating-point vector of 3 components. (from GLM_GTC_type_precision extension)
typedef detail::tvec4<f64> f64vec4; //!< \brief Double-precision floating-point vector of 4 components. (from GLM_GTC_type_precision extension)
//////////////////////
// Float matrix types
//typedef f16 f16mat1; //!< \brief Half-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f16> f16mat2; //!< \brief Half-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f16> f16mat3; //!< \brief Half-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f16> f16mat4; //!< \brief Half-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//typedef f16 f16mat1x1; //!< \brief Half-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f16> f16mat2x2; //!< \brief Half-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x3<f16> f16mat2x3; //!< \brief Half-precision floating-point 2x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x4<f16> f16mat2x4; //!< \brief Half-precision floating-point 2x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x2<f16> f16mat3x2; //!< \brief Half-precision floating-point 3x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f16> f16mat3x3; //!< \brief Half-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x4<f16> f16mat3x4; //!< \brief Half-precision floating-point 3x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x2<f16> f16mat4x2; //!< \brief Half-precision floating-point 4x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x3<f16> f16mat4x3; //!< \brief Half-precision floating-point 4x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f16> f16mat4x4; //!< \brief Half-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//typedef f32 f32mat1; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f32> f32mat2; //!< \brief Single-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f32> f32mat3; //!< \brief Single-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f32> f32mat4; //!< \brief Single-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//typedef f32 f32mat1x1; //!< \brief Single-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f32> f32mat2x2; //!< \brief Single-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x3<f32> f32mat2x3; //!< \brief Single-precision floating-point 2x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x4<f32> f32mat2x4; //!< \brief Single-precision floating-point 2x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x2<f32> f32mat3x2; //!< \brief Single-precision floating-point 3x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f32> f32mat3x3; //!< \brief Single-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x4<f32> f32mat3x4; //!< \brief Single-precision floating-point 3x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x2<f32> f32mat4x2; //!< \brief Single-precision floating-point 4x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x3<f32> f32mat4x3; //!< \brief Single-precision floating-point 4x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f32> f32mat4x4; //!< \brief Single-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//typedef f64 f64mat1; //!< \brief Double-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f64> f64mat2; //!< \brief Double-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f64> f64mat3; //!< \brief Double-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f64> f64mat4; //!< \brief Double-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//typedef f64 f64mat1x1; //!< \brief Double-precision floating-point scalar. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x2<f64> f64mat2x2; //!< \brief Double-precision floating-point 2x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x3<f64> f64mat2x3; //!< \brief Double-precision floating-point 2x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat2x4<f64> f64mat2x4; //!< \brief Double-precision floating-point 2x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x2<f64> f64mat3x2; //!< \brief Double-precision floating-point 3x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x3<f64> f64mat3x3; //!< \brief Double-precision floating-point 3x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat3x4<f64> f64mat3x4; //!< \brief Double-precision floating-point 3x4 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x2<f64> f64mat4x2; //!< \brief Double-precision floating-point 4x2 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x3<f64> f64mat4x3; //!< \brief Double-precision floating-point 4x3 matrix. (from GLM_GTC_type_precision extension)
typedef detail::tmat4x4<f64> f64mat4x4; //!< \brief Double-precision floating-point 4x4 matrix. (from GLM_GTC_type_precision extension)
//////////////////////////
// Float quaternion types
typedef detail::tquat<f16> f16quat; //!< \brief Half-precision floating-point quaternion. (from GLM_GTC_type_precision extension)
typedef detail::tquat<f32> f32quat; //!< \brief Single-precision floating-point quaternion. (from GLM_GTC_type_precision extension)
typedef detail::tquat<f64> f64quat; //!< \brief Double-precision floating-point quaternion. (from GLM_GTC_type_precision extension)
}//namespace type_precision
}//namespace gtc
}//namespace glm
#include "type_precision.inl"
namespace glm{using namespace gtc::type_precision;}
#endif//glm_gtc_type_precision

View File

@@ -1,13 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2009-06-14
// Updated : 2009-06-14
// Licence : This source is under MIT License
// File : glm/gtc/type_precision.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm
{
}

View File

@@ -1,83 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-03-10
// Updated : 2008-03-15
// Licence : This source is under MIT License
// File : gtx_associated_min_max.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTX_extented_min_max
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtx_associated_min_max
#define glm_gtx_associated_min_max
// Dependency:
#include "../glm.hpp"
namespace glm
{
namespace test{
void main_gtx_associated_min_max();
}//namespace test
namespace gtx
{
//! GLM_GTX_associated_min_max extension: Min and max functions that return associated values not the compared onces.
namespace associated_min_max
{
//! \brief Min comparison between 2 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMin(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b);
//! \brief Min comparison between 3 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMin(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b,
const genTypeT& z, const genTypeU& c);
//! \brief Min comparison between 4 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMin(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b,
const genTypeT& z, const genTypeU& c,
const genTypeT& w, const genTypeU& d);
//! \brief Max comparison between 2 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMax(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b);
//! \brief Max comparison between 3 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMax(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b,
const genTypeT& z, const genTypeU& c);
//! \brief Max comparison between 4 variables
template<typename genTypeT, typename genTypeU>
genTypeU associatedMax(
const genTypeT& x, const genTypeU& a,
const genTypeT& y, const genTypeU& b,
const genTypeT& z, const genTypeU& c,
const genTypeT& w, const genTypeU& d);
}//namespace associated_min_max
bool test();
}//namespace gtx
}//namespace glm
#include "associated_min_max.inl"
namespace glm{using namespace gtx::associated_min_max;}
#endif//glm_gtx_associated_min_max

View File

@@ -1,916 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2008-03-10
// Updated : 2008-03-15
// Licence : This source is under MIT License
// File : gtx_associated_min_max.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
namespace glm{
namespace gtx{
namespace associated_min_max{
// Min comparison between 2 variables
template<typename T, typename U>
inline U associatedMin(T x, U a, T y, U b)
{
return x < y ? a : b;
}
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b
)
{
detail::tvec2<U> Result;
//Result.x = x[0] < y[0] ? a[0] : b[0];
//Result.y = x[1] < y[1] ? a[1] : b[1];
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
T x, const detail::tvec2<U>& a,
T y, const detail::tvec2<U>& b
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x < y ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
T x, const detail::tvec3<U>& a,
T y, const detail::tvec3<U>& b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x < y ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
T x, const detail::tvec4<U>& a,
T y, const detail::tvec4<U>& b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x < y ? a[i] : b[i];
return Result;
}
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
const detail::tvec2<T>& x, U a,
const detail::tvec2<T>& y, U b
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
Result[i] = x[i] < y[i] ? a : b;
return Result;
}
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
const detail::tvec3<T>& x, U a,
const detail::tvec3<T>& y, U b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
Result[i] = x[i] < y[i] ? a : b;
return Result;
}
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
const detail::tvec4<T>& x, U a,
const detail::tvec4<T>& y, U b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
Result[i] = x[i] < y[i] ? a : b;
return Result;
}
// Min comparison between 3 variables
template<typename T, typename U>
inline U associatedMin
(
T x, U a,
T y, U b,
T z, U c
)
{
U Result = x < y ? (x < z ? a : c) : (y < z ? b : c);
return Result;
}
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b,
const detail::tvec2<T>& z, const detail::tvec2<U>& c
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
return Result;
}
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b,
const detail::tvec3<T>& z, const detail::tvec3<U>& c
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
return Result;
}
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b,
const detail::tvec4<T>& z, const detail::tvec4<U>& c
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline U associatedMin
(
T x, U a,
T y, U b,
T z, U c,
T w, U d
)
{
T Test1 = min(x, y);
T Test2 = min(z, w);;
U Result1 = x < y ? a : b;
U Result2 = z < w ? c : d;
U Result = Test1 < Test2 ? Result1 : Result2;
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b,
const detail::tvec2<T>& z, const detail::tvec2<U>& c,
const detail::tvec2<T>& w, const detail::tvec2<U>& d
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);
U Result1 = x[i] < y[i] ? a[i] : b[i];
U Result2 = z[i] < w[i] ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b,
const detail::tvec3<T>& z, const detail::tvec3<U>& c,
const detail::tvec3<T>& w, const detail::tvec3<U>& d
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);
U Result1 = x[i] < y[i] ? a[i] : b[i];
U Result2 = z[i] < w[i] ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b,
const detail::tvec4<T>& z, const detail::tvec4<U>& c,
const detail::tvec4<T>& w, const detail::tvec4<U>& d
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);
U Result1 = x[i] < y[i] ? a[i] : b[i];
U Result2 = z[i] < w[i] ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
T x, const detail::tvec2<U>& a,
T y, const detail::tvec2<U>& b,
T z, const detail::tvec2<U>& c,
T w, const detail::tvec2<U>& d
)
{
T Test1 = min(x, y);
T Test2 = min(z, w);
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
{
U Result1 = x < y ? a[i] : b[i];
U Result2 = z < w ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
T x, const detail::tvec3<U>& a,
T y, const detail::tvec3<U>& b,
T z, const detail::tvec3<U>& c,
T w, const detail::tvec3<U>& d
)
{
T Test1 = min(x, y);
T Test2 = min(z, w);
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
{
U Result1 = x < y ? a[i] : b[i];
U Result2 = z < w ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
T x, const detail::tvec4<U>& a,
T y, const detail::tvec4<U>& b,
T z, const detail::tvec4<U>& c,
T w, const detail::tvec4<U>& d
)
{
T Test1 = min(x, y);
T Test2 = min(z, w);
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
{
U Result1 = x < y ? a[i] : b[i];
U Result2 = z < w ? c[i] : d[i];
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMin
(
const detail::tvec2<T>& x, U a,
const detail::tvec2<T>& y, U b,
const detail::tvec2<T>& z, U c,
const detail::tvec2<T>& w, U d
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);;
U Result1 = x[i] < y[i] ? a : b;
U Result2 = z[i] < w[i] ? c : d;
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMin
(
const detail::tvec3<T>& x, U a,
const detail::tvec3<T>& y, U b,
const detail::tvec3<T>& z, U c,
const detail::tvec3<T>& w, U d
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);;
U Result1 = x[i] < y[i] ? a : b;
U Result2 = z[i] < w[i] ? c : d;
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Min comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMin
(
const detail::tvec4<T>& x, U a,
const detail::tvec4<T>& y, U b,
const detail::tvec4<T>& z, U c,
const detail::tvec4<T>& w, U d
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
{
T Test1 = min(x[i], y[i]);
T Test2 = min(z[i], w[i]);;
U Result1 = x[i] < y[i] ? a : b;
U Result2 = z[i] < w[i] ? c : d;
Result[i] = Test1 < Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline U associatedMax(T x, U a, T y, U b)
{
return x > y ? a : b;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
T x, const detail::tvec2<U>& a,
T y, const detail::tvec2<U>& b
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x > y ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
T x, const detail::tvec3<U>& a,
T y, const detail::tvec3<U>& b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x > y ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
T x, const detail::tvec4<U>& a,
T y, const detail::tvec4<U>& b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x > y ? a[i] : b[i];
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, U a,
const detail::tvec2<T>& y, U b
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? a : b;
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, U a,
const detail::tvec3<T>& y, U b
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? a : b;
return Result;
}
// Max comparison between 2 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, U a,
const detail::tvec4<T>& y, U b
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? a : b;
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline U associatedMax
(
T x, U a,
T y, U b,
T z, U c
)
{
U Result = x > y ? (x > z ? a : c) : (y > z ? b : c);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b,
const detail::tvec2<T>& z, const detail::tvec2<U>& c
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b,
const detail::tvec3<T>& z, const detail::tvec3<U>& c
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b,
const detail::tvec4<T>& z, const detail::tvec4<U>& c
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
T x, const detail::tvec2<U>& a,
T y, const detail::tvec2<U>& b,
T z, const detail::tvec2<U>& c
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
T x, const detail::tvec3<U>& a,
T y, const detail::tvec3<U>& b,
T z, const detail::tvec3<U>& c
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
T x, const detail::tvec4<U>& a,
T y, const detail::tvec4<U>& b,
T z, const detail::tvec4<U>& c
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, U a,
const detail::tvec2<T>& y, U b,
const detail::tvec2<T>& z, U c
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, U a,
const detail::tvec3<T>& y, U b,
const detail::tvec3<T>& z, U c
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
return Result;
}
// Max comparison between 3 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, U a,
const detail::tvec4<T>& y, U b,
const detail::tvec4<T>& z, U c
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline U associatedMax
(
T x, U a,
T y, U b,
T z, U c,
T w, U d
)
{
T Test1 = max(x, y);
T Test2 = max(z, w);;
U Result1 = x > y ? a : b;
U Result2 = z > w ? c : d;
U Result = Test1 > Test2 ? Result1 : Result2;
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, const detail::tvec2<U>& a,
const detail::tvec2<T>& y, const detail::tvec2<U>& b,
const detail::tvec2<T>& z, const detail::tvec2<U>& c,
const detail::tvec2<T>& w, const detail::tvec2<U>& d
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);
U Result1 = x[i] > y[i] ? a[i] : b[i];
U Result2 = z[i] > w[i] ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, const detail::tvec3<U>& a,
const detail::tvec3<T>& y, const detail::tvec3<U>& b,
const detail::tvec3<T>& z, const detail::tvec3<U>& c,
const detail::tvec3<T>& w, const detail::tvec3<U>& d
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);
U Result1 = x[i] > y[i] ? a[i] : b[i];
U Result2 = z[i] > w[i] ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, const detail::tvec4<U>& a,
const detail::tvec4<T>& y, const detail::tvec4<U>& b,
const detail::tvec4<T>& z, const detail::tvec4<U>& c,
const detail::tvec4<T>& w, const detail::tvec4<U>& d
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);
U Result1 = x[i] > y[i] ? a[i] : b[i];
U Result2 = z[i] > w[i] ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
T x, const detail::tvec2<U>& a,
T y, const detail::tvec2<U>& b,
T z, const detail::tvec2<U>& c,
T w, const detail::tvec2<U>& d
)
{
T Test1 = max(x, y);
T Test2 = max(z, w);
detail::tvec2<U> Result;
for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i)
{
U Result1 = x > y ? a[i] : b[i];
U Result2 = z > w ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
T x, const detail::tvec3<U>& a,
T y, const detail::tvec3<U>& b,
T z, const detail::tvec3<U>& c,
T w, const detail::tvec3<U>& d
)
{
T Test1 = max(x, y);
T Test2 = max(z, w);
detail::tvec3<U> Result;
for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i)
{
U Result1 = x > y ? a[i] : b[i];
U Result2 = z > w ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
T x, const detail::tvec4<U>& a,
T y, const detail::tvec4<U>& b,
T z, const detail::tvec4<U>& c,
T w, const detail::tvec4<U>& d
)
{
T Test1 = max(x, y);
T Test2 = max(z, w);
detail::tvec4<U> Result;
for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i)
{
U Result1 = x > y ? a[i] : b[i];
U Result2 = z > w ? c[i] : d[i];
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec2<U> associatedMax
(
const detail::tvec2<T>& x, U a,
const detail::tvec2<T>& y, U b,
const detail::tvec2<T>& z, U c,
const detail::tvec2<T>& w, U d
)
{
detail::tvec2<U> Result;
for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);;
U Result1 = x[i] > y[i] ? a : b;
U Result2 = z[i] > w[i] ? c : d;
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec3<U> associatedMax
(
const detail::tvec3<T>& x, U a,
const detail::tvec3<T>& y, U b,
const detail::tvec3<T>& z, U c,
const detail::tvec3<T>& w, U d
)
{
detail::tvec3<U> Result;
for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);;
U Result1 = x[i] > y[i] ? a : b;
U Result2 = z[i] > w[i] ? c : d;
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
// Max comparison between 4 variables
template<typename T, typename U>
inline detail::tvec4<U> associatedMax
(
const detail::tvec4<T>& x, U a,
const detail::tvec4<T>& y, U b,
const detail::tvec4<T>& z, U c,
const detail::tvec4<T>& w, U d
)
{
detail::tvec4<U> Result;
for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i)
{
T Test1 = max(x[i], y[i]);
T Test2 = max(z[i], w[i]);;
U Result1 = x[i] > y[i] ? a : b;
U Result2 = z[i] > w[i] ? c : d;
Result[i] = Test1 > Test2 ? Result1 : Result2;
}
return Result;
}
}//namespace associated_min_max
}//namespace gtx
}//namespace glm

View File

@@ -1,102 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2007-03-14
// Updated : 2008-11-14
// Licence : This source is under MIT License
// File : glm/gtx/bit.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
// - GLM_GTC_half_float
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtx_bit
#define glm_gtx_bit
// Dependency:
#include "../glm.hpp"
#include "../gtc/half_float.hpp"
namespace glm
{
namespace test{
void main_gtx_bit();
}//namespace test
namespace gtx{
//! GLM_GTX_bit extension: Allow to perform bit operations on integer values
namespace bit
{
using namespace gtc::half_float;
//! Build a mask of 'count' bits
//! From GLM_GTX_bit extension.
template <typename genIType>
genIType mask(genIType const & count);
//! Component wise extraction of bit fields.
//! genType and genIType could be a scalar or a vector.
//! From GLM_GTX_bit extension.
template <typename genType, typename genIType>
genIType extractField(genType const & v, genIType const & first, genIType const & count);
//! Find the lowest bit set to 1 in a integer variable.
//! From GLM_GTX_bit extension.
template <typename genType>
int lowestBit(genType const & value);
//! Find the highest bit set to 1 in a integer variable.
//! From GLM_GTX_bit extension.
template <typename genType>
int highestBit(genType const & value);
//! Find the highest bit set to 1 in a integer variable and return its value.
//! From GLM_GTX_bit extension.
template <typename genType>
genType highestBitValue(genType const & value);
//! Return true if the value is a power of two number.
//! From GLM_GTX_bit extension.
template <typename genType>
bool isPowerOfTwo(genType const & value);
//! Return the power of two number which value is just higher the input value.
//! From GLM_GTX_bit extension.
template <typename genType>
genType powerOfTwoAbove(genType const & value);
//! Return the power of two number which value is just lower the input value.
//! From GLM_GTX_bit extension.
template <typename genType>
genType powerOfTwoBelow(genType const & value);
//! Return the power of two number which value is the closet to the input value.
//! From GLM_GTX_bit extension.
template <typename genType>
genType powerOfTwoNearest(genType const & value);
//! Revert all bits of any integer based type.
//! From GLM_GTX_bit extension.
template <typename genType>
genType bitRevert(genType const & value);
//! Rotate all bits to the right.
//! From GLM_GTX_bit extension.
template <typename genType>
genType bitRotateRight(genType const & In, std::size_t Shift);
//! Rotate all bits to the left.
//! From GLM_GTX_bit extension.
template <typename genType>
genType bitRotateLeft(genType const & In, std::size_t Shift);
}//namespace bit
}//namespace gtx
}//namespace glm
#include "bit.inl"
namespace glm{using namespace gtx::bit;}
#endif//glm_gtx_bit

View File

@@ -1,737 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2007-03-14
// Updated : 2008-11-14
// Licence : This source is under MIT License
// File : glm/gtx/bit.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "../core/_detail.hpp"
namespace glm{
namespace gtx{
namespace bit{
template <typename genIType>
inline genIType mask
(
genIType const & count
)
{
return ((genIType(1) << (count)) - genIType(1));
}
template <typename valIType>
inline detail::tvec2<valIType> mask
(
detail::tvec2<valIType> const & count
)
{
return detail::tvec2<valIType>(
mask(count[0]),
mask(count[1]));
}
template <typename valIType>
inline 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>
inline 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>
inline genIType extractField
(
gtc::half_float::half const & value,
genIType const & first,
genIType const & count
)
{
assert(first + count < sizeof(gtc::half_float::half));
return (value._data() << first) >> ((sizeof(gtc::half_float::half) << 3) - count);
}
template <typename genIType>
inline 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>
inline genIType extractField
(
double const & value,
genIType const & first,
genIType const & count
)
{
assert(first + count < sizeof(double));
return (detail::uif64(value).i << first) >> ((sizeof(double) << 3) - count);
}
template <typename genType, typename genIType>
inline genIType extractField
(
genType const & value,
genIType const & first,
genIType const & count
)
{
assert(first + count < sizeof(genType));
return (value << first) >> ((sizeof(genType) << 3) - count);
}
template <typename valType, typename valIType>
inline detail::tvec2<valIType> extractField
(
detail::tvec2<valType> const & value,
valIType const & first,
valIType const & count
)
{
return detail::tvec2<valIType>(
extractField(value[0], first, count),
extractField(value[1], first, count));
}
template <typename valType, typename valIType>
inline detail::tvec3<valIType> extractField
(
detail::tvec3<valType> const & value,
valIType const & first,
valIType const & count
)
{
return detail::tvec3<valIType>(
extractField(value[0], first, count),
extractField(value[1], first, count),
extractField(value[2], first, count));
}
template <typename valType, typename valIType>
inline detail::tvec4<valIType> extractField
(
detail::tvec4<valType> const & value,
valIType const & first,
valIType const & count
)
{
return detail::tvec4<valIType>(
extractField(value[0], first, count),
extractField(value[1], first, count),
extractField(value[2], first, count),
extractField(value[3], first, count));
}
template <typename valType, typename valIType>
inline detail::tvec2<valIType> extractField
(
detail::tvec2<valType> const & value,
detail::tvec2<valIType> const & first,
detail::tvec2<valIType> const & count
)
{
return detail::tvec2<valIType>(
extractField(value[0], first[0], count[0]),
extractField(value[1], first[1], count[1]));
}
template <typename valType, typename valIType>
inline detail::tvec3<valIType> extractField
(
detail::tvec3<valType> const & value,
detail::tvec3<valIType> const & first,
detail::tvec3<valIType> const & count
)
{
return detail::tvec3<valIType>(
extractField(value[0], first[0], count[0]),
extractField(value[1], first[1], count[1]),
extractField(value[2], first[2], count[2]));
}
template <typename valType, typename valIType>
inline detail::tvec4<valIType> extractField
(
detail::tvec4<valType> const & value,
detail::tvec4<valIType> const & first,
detail::tvec4<valIType> const & count
)
{
return detail::tvec4<valIType>(
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 valType, typename valIType>
inline detail::tvec2<valIType> extractField
(
valType const & value,
detail::tvec2<valIType> const & first,
detail::tvec2<valIType> const & count
)
{
return detail::tvec2<valIType>(
extractField(value, first[0], count[0]),
extractField(value, first[1], count[1]));
}
template <typename valType, typename valIType>
inline detail::tvec3<valIType> extractField
(
valType const & value,
detail::tvec3<valIType> const & first,
detail::tvec3<valIType> const & count
)
{
return detail::tvec3<valIType>(
extractField(value, first[0], count[0]),
extractField(value, first[1], count[1]),
extractField(value, first[2], count[2]));
}
template <typename valType, typename valIType>
inline detail::tvec4<valIType> extractField
(
valType const & value,
detail::tvec4<valIType> const & first,
detail::tvec4<valIType> const & count
)
{
return detail::tvec4<valIType>(
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>
inline 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>
inline detail::tvec2<int> lowestBit
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<int>(
lowestBit(value[0]),
lowestBit(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline 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 <>
//inline int highestBit<int>
//(
// int value
//)
//{
// int bit = -1;
// for(int tmp = value; tmp; tmp >>= 1, ++bit);
// return bit;
//}
template <typename valType>
inline detail::tvec2<int> highestBit
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<int>(
highestBit(value[0]),
highestBit(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline 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>
inline detail::tvec2<int> highestBitValue
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<int>(
highestBitValue(value[0]),
highestBitValue(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline 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>
inline detail::tvec2<bool> isPowerOfTwo
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<bool>(
isPowerOfTwo(value[0]),
isPowerOfTwo(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline genType powerOfTwoAbove(genType const & value)
{
return isPowerOfTwo(value) ? value : highestBitValue(value) << 1;
}
template <typename valType>
inline detail::tvec2<valType> powerOfTwoAbove
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<valType>(
powerOfTwoAbove(value[0]),
powerOfTwoAbove(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline genType powerOfTwoBelow
(
genType const & value
)
{
return isPowerOfTwo(value) ? value : highestBitValue(value);
}
template <typename valType>
inline detail::tvec2<valType> powerOfTwoBelow
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<valType>(
powerOfTwoBelow(value[0]),
powerOfTwoBelow(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline 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>
inline detail::tvec2<valType> powerOfTwoNearest
(
detail::tvec2<valType> const & value
)
{
return detail::tvec2<valType>(
powerOfTwoNearest(value[0]),
powerOfTwoNearest(value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline genType bitRevert(genType const & In)
{
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer);
genType Out = 0;
std::size_t BitSize = sizeof(genType) * 8;
for(std::size_t i = 0; i < BitSize; ++i)
if(In & (1 << i))
Out |= 1 << (BitSize - 1 - i);
return Out;
}
template <typename valType>
inline detail::tvec2<valType> bitRevert
(
detail::tvec2<valType> const & Value
)
{
return detail::tvec2<valType>(
bitRevert(Value[0]),
bitRevert(Value[1]));
}
template <typename valType>
inline 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>
inline 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>
inline genType bitRotateRight(genType const & In, std::size_t Shift)
{
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer);
std::size_t BitSize = sizeof(genType) * 8;
return (In << Shift) | (In >> (BitSize - Shift));
}
template <typename valType>
inline 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>
inline 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>
inline 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>
inline genType bitRotateLeft(genType const & In, std::size_t Shift)
{
GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer);
std::size_t BitSize = sizeof(genType) * 8;
return (In >> Shift) | (In << (BitSize - Shift));
}
template <typename valType>
inline 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>
inline 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>
inline 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));
}
}//namespace bit
}//namespace gtx
}//namespace glm

View File

@@ -1,45 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-12-30
// Updated : 2008-10-05
// Licence : This source is under MIT License
// File : glm/gtx/closest_point.hpp
///////////////////////////////////////////////////////////////////////////////////////////////////
// Dependency:
// - GLM core
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtx_closest_point
#define glm_gtx_closest_point
// Dependency:
#include "../glm.hpp"
namespace glm
{
namespace test{
void main_gtx_closest_point();
}//namespace test
namespace gtx{
//! GLM_GTX_closest_point extension: Find the point on a straight line which is the closet of a point.
namespace closest_point{
//! Find the point on a straight line which is the closet of a point.
//! From GLM_GTX_closest_point extension.
template <typename T>
detail::tvec3<T> closestPointOnLine(
detail::tvec3<T> const & point,
detail::tvec3<T> const & a,
detail::tvec3<T> const & b);
}//namespace closest_point
}//namespace gtx
}//namespace glm
#include "closest_point.inl"
namespace glm{using namespace gtx::closest_point;}
#endif//glm_gtx_closest_point

View File

@@ -1,41 +0,0 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Created : 2005-12-30
// Updated : 2008-10-05
// Licence : This source is under MIT License
// File : glm/gtx/closest_point.inl
///////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef glm_gtx_closest_point
#define glm_gtx_closest_point
namespace glm{
namespace gtx{
namespace closest_point{
template <typename valType>
inline 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;
}
}//namespace closest_point
}//namespace gtx
}//namespace glm
#endif//glm_gtx_closest_point

Some files were not shown because too many files have changed in this diff Show More