Merge branch '0.9.1' of ssh://ogl-math.git.sourceforge.net/gitroot/ogl-math/ogl-math into 0.9.1

This commit is contained in:
Christophe Riccio 2011-02-08 23:55:15 +00:00
commit dd07c3cb5b
14 changed files with 399 additions and 165 deletions

View File

@ -6,7 +6,7 @@ project(glm)
add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_CRT_SECURE_NO_WARNINGS)
#add_definitions(-S) #add_definitions(-S)
#add_definitions(-s) #add_definitions(-s)
add_definitions(-msse2) #add_definitions(-msse2)
#add_definitions(-m32) #add_definitions(-m32)
#add_definitions(-mfpmath=387) #add_definitions(-mfpmath=387)
#add_definitions(-ffast-math) #add_definitions(-ffast-math)

View File

@ -1,10 +1,12 @@
set(NAME glm-doc) set(NAME glm-doc)
file(GLOB ROOT_TXT doxyfile ../*.txt)
file(GLOB ROOT_CPP src/*.cpp) file(GLOB ROOT_CPP src/*.cpp)
file(GLOB ROOT_XML src/*.xml) file(GLOB ROOT_XML src/*.xml)
file(GLOB ROOT_XSL src/*.xsl) file(GLOB ROOT_XSL src/*.xsl)
source_group("TXT Files" FILES ${ROOT_TXT})
source_group("XML Files" FILES ${ROOT_XML}) source_group("XML Files" FILES ${ROOT_XML})
source_group("XSL Files" FILES ${ROOT_XSL}) source_group("XSL Files" FILES ${ROOT_XSL})
add_executable(${NAME} ${ROOT_CPP} ${ROOT_XML} ${ROOT_XSL}) add_executable(${NAME} ${ROOT_CPP} ${ROOT_XML} ${ROOT_XSL} ${ROOT_TXT})

View File

@ -327,7 +327,7 @@ namespace detail
# define GLM_RESTRICT_VAR __restrict # define GLM_RESTRICT_VAR __restrict
#elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) #elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC31))
# define GLM_DEPRECATED __attribute__((__deprecated__)) # define GLM_DEPRECATED __attribute__((__deprecated__))
# define GLM_ALIGN(x) __attribute__(aligned(x)) # define GLM_ALIGN(x) __attribute__((aligned(x)))
# if(GLM_COMPILER >= GLM_COMPILER_GCC33) # if(GLM_COMPILER >= GLM_COMPILER_GCC33)
# define GLM_RESTRICT __restrict__ # define GLM_RESTRICT __restrict__
# define GLM_RESTRICT_VAR __restrict__ # define GLM_RESTRICT_VAR __restrict__

View File

@ -258,7 +258,7 @@ inline __m128 sse_inf_ps(__m128 x)
} }
// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration // SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration
// By Elan Ruskin, // By Elan Ruskin, http://assemblyrequired.crashworks.org/
inline __m128 sse_sqrt_wip_ss(__m128 const & x) inline __m128 sse_sqrt_wip_ss(__m128 const & x)
{ {
__m128 recip = _mm_rsqrt_ss(x); // "estimate" opcode __m128 recip = _mm_rsqrt_ss(x); // "estimate" opcode

View File

@ -133,6 +133,14 @@ namespace glm
detail::tmat4x4<T> const & proj, detail::tmat4x4<T> const & proj,
detail::tvec4<U> const & viewport); detail::tvec4<U> const & viewport);
//! Define a picking region
//! From GLM_GTC_matrix_transform extension.
template <typename T, typename U>
detail::tmat4x4<T> pickMatrix(
detail::tvec2<T> const & center,
detail::tvec2<T> const & delta,
detail::tvec4<U> const & viewport);
//! Build a look at view matrix. //! Build a look at view matrix.
//! From GLM_GTC_matrix_transform extension. //! From GLM_GTC_matrix_transform extension.
template <typename T> template <typename T>

View File

@ -324,6 +324,25 @@ namespace matrix_transform
return detail::tvec3<T>(obj); return detail::tvec3<T>(obj);
} }
template <typename T, typename U>
detail::tmat4x4<T> pickMatrix
(
detail::tvec2<T> const & center,
detail::tvec2<T> const & delta,
detail::tvec4<U> const & viewport
)
{
assert(delta.x > 0.0f && delta.y > 0.0f)
detail::tmat4x4<T> Result(1.0f);
if(!(delta.x > 0.0f && delta.y > 0.0f))
return Result; // Error
// Translate and scale the picked region to the entire window
Result = translate(Result, (T(viewport[2]) - T(2) * (x - T(viewport[0]))) / delta.x, (T(viewport[3]) - T(2) * (y - T(viewport[1]))) / delta.y, T(0));
return scale(Result, T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1));
}
template <typename T> template <typename T>
inline detail::tmat4x4<T> lookAt( inline detail::tmat4x4<T> lookAt(
const detail::tvec3<T>& eye, const detail::tvec3<T>& eye,

View File

@ -150,7 +150,7 @@ namespace glm
detail::tquat<T> const & q1, detail::tquat<T> const & q1,
detail::tquat<T> const & q2); detail::tquat<T> const & q2);
//! Returns a LERP interpolated quaternion of x and y according a. //! Returns a SLERP interpolated quaternion of x and y according a.
//! From GLM_GTC_quaternion extension. //! From GLM_GTC_quaternion extension.
template <typename T> template <typename T>
detail::tquat<T> mix( detail::tquat<T> mix(

View File

@ -370,6 +370,43 @@ namespace quaternion{
k0 * x.z + k1 * y2.z); k0 * x.z + k1 * y2.z);
} }
template <typename T>
inline detail::tquat<T> mix2
(
detail::tquat<T> const & x,
detail::tquat<T> const & y,
T const & a
)
{
bool flip = false;
if(a <= T(0)) return x;
if(a >= T(1)) return y;
T cos_t = dot(x, y);
if(cos_t < T(0))
{
cos_t = -cos_t;
flip = true;
}
T alpha(0), beta(0);
if(T(1) - cos_t < 1e-7)
beta = T(1) - alpha;
else
{
T theta = acos(cos_t);
T sin_t = sin(theta);
beta = sin(theta * (T(1) - alpha)) / sin_t;
alpha = sin(alpha * theta) / sin_t;
}
if(flip)
alpha = -alpha;
return normalize(beta * x + alpha * y2);
}
template <typename T> template <typename T>
inline detail::tquat<T> conjugate inline detail::tquat<T> conjugate
( (

View File

@ -142,7 +142,7 @@ namespace glm
//! Multiply matrix x by matrix y component-wise, i.e., //! 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]. //! result[i][j] is the scalar product of x[i][j] and y[i][j].
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simdMatrixCompMult( detail::fmat4x4SIMD matrixCompMult(
detail::fmat4x4SIMD const & x, detail::fmat4x4SIMD const & x,
detail::fmat4x4SIMD const & y); detail::fmat4x4SIMD const & y);
@ -150,23 +150,23 @@ namespace glm
//! and the second parameter r as a row vector //! and the second parameter r as a row vector
//! and does a linear algebraic matrix multiply c * r. //! and does a linear algebraic matrix multiply c * r.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simdOuterProduct( detail::fmat4x4SIMD outerProduct(
detail::fvec4SIMD const & c, detail::fvec4SIMD const & c,
detail::fvec4SIMD const & r); detail::fvec4SIMD const & r);
//! Returns the transposed matrix of x //! Returns the transposed matrix of x
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simdTranspose( detail::fmat4x4SIMD transpose(
detail::fmat4x4SIMD const & x); detail::fmat4x4SIMD const & x);
//! Return the determinant of a mat4 matrix. //! Return the determinant of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
float simdDeterminant( float determinant(
detail::fmat4x4SIMD const & m); detail::fmat4x4SIMD const & m);
//! Return the inverse of a mat4 matrix. //! Return the inverse of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simdInverse( detail::fmat4x4SIMD inverse(
detail::fmat4x4SIMD const & m); detail::fmat4x4SIMD const & m);
}//namespace simd_mat4 }//namespace simd_mat4

View File

@ -242,7 +242,7 @@ namespace simd_mat4
detail::fmat4x4SIMD const & x detail::fmat4x4SIMD const & x
) )
{ {
detail::tmat4x4<float> Result; GLM_ALIGN(16) detail::tmat4x4<float> Result;
_mm_store_ps(&Result[0][0], x.Data[0].Data); _mm_store_ps(&Result[0][0], x.Data[0].Data);
_mm_store_ps(&Result[1][0], x.Data[1].Data); _mm_store_ps(&Result[1][0], x.Data[1].Data);
_mm_store_ps(&Result[2][0], x.Data[2].Data); _mm_store_ps(&Result[2][0], x.Data[2].Data);
@ -250,7 +250,7 @@ namespace simd_mat4
return Result; return Result;
} }
inline detail::fmat4x4SIMD simdMatrixCompMult inline detail::fmat4x4SIMD matrixCompMult
( (
detail::fmat4x4SIMD const & x, detail::fmat4x4SIMD const & x,
detail::fmat4x4SIMD const & y detail::fmat4x4SIMD const & y
@ -264,30 +264,40 @@ namespace simd_mat4
return result; return result;
} }
inline detail::fmat4x4SIMD simdOuterProduct inline detail::fmat4x4SIMD outerProduct
( (
detail::fvec4SIMD const & c, detail::fvec4SIMD const & c,
detail::fvec4SIMD const & r detail::fvec4SIMD const & r
) )
{ {
__m128 Shu0 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(0, 0, 0, 0));
__m128 Shu1 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(1, 1, 1, 1));
__m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2));
__m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3));
detail::fmat4x4SIMD result(detail::fmat4x4SIMD::null);
result[0].Data = _mm_mul_ps(c.Data, Shu0);
result[1].Data = _mm_mul_ps(c.Data, Shu1);
result[2].Data = _mm_mul_ps(c.Data, Shu2);
result[3].Data = _mm_mul_ps(c.Data, Shu3);
return result;
} }
inline detail::fmat4x4SIMD simdTranspose(detail::fmat4x4SIMD const & m) inline detail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const & m)
{ {
detail::fmat4x4SIMD result; detail::fmat4x4SIMD result;
detail::sse_transpose_ps(&m[0].Data, &result[0].Data); detail::sse_transpose_ps(&m[0].Data, &result[0].Data);
return result; return result;
} }
inline float simdDeterminant(detail::fmat4x4SIMD const & m) inline float determinant(detail::fmat4x4SIMD const & m)
{ {
float Result; float Result;
_mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data)); _mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data));
return Result; return Result;
} }
inline detail::fmat4x4SIMD simdInverse(detail::fmat4x4SIMD const & m) inline detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m)
{ {
detail::fmat4x4SIMD result; detail::fmat4x4SIMD result;
detail::sse_inverse_ps(&m[0].Data, &result[0].Data); detail::sse_inverse_ps(&m[0].Data, &result[0].Data);

View File

@ -336,23 +336,47 @@ namespace glm
//! Returns the length of x, i.e., sqrt(x * x). //! Returns the length of x, i.e., sqrt(x * x).
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
float simdLength( float length(
detail::fvec4SIMD const & x);
//! Returns the length of x, i.e., sqrt(x * x).
//! Less accurate but much faster than simdLength.
//! (From GLM_GTX_simd_vec4 extension, geometry functions)
float fastLength(
detail::fvec4SIMD const & x);
//! Returns the length of x, i.e., sqrt(x * x).
//! Slightly more accurate but much slower than simdLength.
//! (From GLM_GTX_simd_vec4 extension, geometry functions)
float niceLength(
detail::fvec4SIMD const & x); detail::fvec4SIMD const & x);
//! Returns the length of x, i.e., sqrt(x * x). //! Returns the length of x, i.e., sqrt(x * x).
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdLength4( detail::fvec4SIMD length4(
detail::fvec4SIMD const & x);
//! Returns the length of x, i.e., sqrt(x * x).
//! Less accurate but much faster than simdLength4.
//! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD fastLength4(
detail::fvec4SIMD const & x);
//! Returns the length of x, i.e., sqrt(x * x).
//! Slightly more accurate but much slower than simdLength4.
//! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD niceLength4(
detail::fvec4SIMD const & x); detail::fvec4SIMD const & x);
//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
float simdDistance( float distance(
detail::fvec4SIMD const & p0, detail::fvec4SIMD const & p0,
detail::fvec4SIMD const & p1); detail::fvec4SIMD const & p1);
//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdDistance4( detail::fvec4SIMD distance4(
detail::fvec4SIMD const & p0, detail::fvec4SIMD const & p0,
detail::fvec4SIMD const & p1); detail::fvec4SIMD const & p1);
@ -364,19 +388,25 @@ namespace glm
//! Returns the dot product of x and y, i.e., result = x * y. //! Returns the dot product of x and y, i.e., result = x * y.
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdDot4( detail::fvec4SIMD dot4(
detail::fvec4SIMD const & x, detail::fvec4SIMD const & x,
detail::fvec4SIMD const & y); detail::fvec4SIMD const & y);
//! Returns the cross product of x and y. //! Returns the cross product of x and y.
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdCross( detail::fvec4SIMD cross(
detail::fvec4SIMD const & x, detail::fvec4SIMD const & x,
detail::fvec4SIMD const & y); detail::fvec4SIMD const & y);
//! Returns a vector in the same direction as x but with length of 1. //! Returns a vector in the same direction as x but with length of 1.
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdNormalize( detail::fvec4SIMD normalize(
detail::fvec4SIMD const & x);
//! Returns a vector in the same direction as x but with length of 1.
//! Less accurate but much faster than simdNormalize.
//! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD fastNormalize(
detail::fvec4SIMD const & x); detail::fvec4SIMD const & x);
//! If dot(Nref, I) < 0.0, return N, otherwise, return -N. //! If dot(Nref, I) < 0.0, return N, otherwise, return -N.
@ -389,7 +419,7 @@ namespace glm
//! For the incident vector I and surface orientation N, //! For the incident vector I and surface orientation N,
//! returns the reflection direction : result = I - 2.0 * dot(N, I) * N. //! returns the reflection direction : result = I - 2.0 * dot(N, I) * N.
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdReflect( detail::fvec4SIMD reflect(
detail::fvec4SIMD const & I, detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N); detail::fvec4SIMD const & N);
@ -397,10 +427,39 @@ namespace glm
//! and the ratio of indices of refraction eta, //! and the ratio of indices of refraction eta,
//! return the refraction vector. //! return the refraction vector.
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
detail::fvec4SIMD simdRefract( detail::fvec4SIMD refract(
detail::fvec4SIMD const & I, detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N, detail::fvec4SIMD const & N,
float const & eta); float const & eta);
//! Returns the positive square root of x.
//! (From GLM_GTX_simd_vec4 extension, exponential function)
detail::fvec4SIMD sqrt(
detail::fvec4SIMD const & x);
//! Returns the positive square root of x with the nicest quality but very slow.
//! Slightly more accurate but much slower than simdSqrt.
//! (From GLM_GTX_simd_vec4 extension, exponential function)
detail::fvec4SIMD niceSqrt(
detail::fvec4SIMD const & x);
//! Returns the positive square root of x
//! Less accurate but much faster than sqrt.
//! (From GLM_GTX_simd_vec4 extension, exponential function)
detail::fvec4SIMD fastSqrt(
detail::fvec4SIMD const & x);
//! Returns the reciprocal of the positive square root of x.
//! (From GLM_GTX_simd_vec4 extension, exponential function)
detail::fvec4SIMD inversesqrt(
detail::fvec4SIMD const & x);
//! Returns the reciprocal of the positive square root of x.
//! Faster than inversesqrt but less accurate.
//! (From GLM_GTX_simd_vec4 extension, exponential function)
detail::fvec4SIMD fastInversesqrt(
detail::fvec4SIMD const & x);
}//namespace simd_vec4 }//namespace simd_vec4
}//namespace gtx }//namespace gtx
}//namespace glm }//namespace glm

View File

@ -275,7 +275,7 @@ namespace glm
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
detail::tvec4<float> Result; GLM_ALIGN(4) detail::tvec4<float> Result;
_mm_store_ps(&Result[0], x.Data); _mm_store_ps(&Result[0], x.Data);
return Result; return Result;
} }
@ -530,25 +530,67 @@ namespace glm
return _mm_add_ps(_mm_mul_ps(a.Data, b.Data), c.Data); return _mm_add_ps(_mm_mul_ps(a.Data, b.Data), c.Data);
} }
inline float simdLength inline float length
( (
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);
detail::fvec4SIMD sqt0 = sqrt(dot0);
float Result = 0; float Result = 0;
_mm_store_ss(&Result, detail::sse_len_ps(x.Data)); _mm_store_ss(&Result, sqt0.Data);
return Result; return Result;
} }
inline detail::fvec4SIMD simdLength4 inline float fastLength
( (
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
return detail::sse_len_ps(x.Data); detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);
detail::fvec4SIMD sqt0 = fastSqrt(dot0);
float Result = 0;
_mm_store_ss(&Result, sqt0.Data);
return Result;
} }
inline float simdDistance inline float niceLength
(
detail::fvec4SIMD const & x
)
{
detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data);
detail::fvec4SIMD sqt0 = niceSqrt(dot0);
float Result = 0;
_mm_store_ss(&Result, sqt0.Data);
return Result;
}
inline detail::fvec4SIMD length4
(
detail::fvec4SIMD const & x
)
{
return sqrt(dot4(x, x));
}
inline detail::fvec4SIMD fastLength4
(
detail::fvec4SIMD const & x
)
{
return fastSqrt(dot4(x, x));
}
inline detail::fvec4SIMD niceLength4
(
detail::fvec4SIMD const & x
)
{
return niceSqrt(dot4(x, x));
}
inline float distance
( (
detail::fvec4SIMD const & p0, detail::fvec4SIMD const & p0,
detail::fvec4SIMD const & p1 detail::fvec4SIMD const & p1
@ -559,7 +601,7 @@ namespace glm
return Result; return Result;
} }
inline detail::fvec4SIMD simdDistance4 inline detail::fvec4SIMD distance4
( (
detail::fvec4SIMD const & p0, detail::fvec4SIMD const & p0,
detail::fvec4SIMD const & p1 detail::fvec4SIMD const & p1
@ -568,7 +610,7 @@ namespace glm
return detail::sse_dst_ps(p0.Data, p1.Data); return detail::sse_dst_ps(p0.Data, p1.Data);
} }
inline float simdDot inline float dot
( (
detail::fvec4SIMD const & x, detail::fvec4SIMD const & x,
detail::fvec4SIMD const & y detail::fvec4SIMD const & y
@ -579,16 +621,16 @@ namespace glm
return Result; return Result;
} }
inline detail::fvec4SIMD simdDot4 inline detail::fvec4SIMD dot4
( (
detail::fvec4SIMD const & x, detail::fvec4SIMD const & x,
detail::fvec4SIMD const & y detail::fvec4SIMD const & y
) )
{ {
return detail::sse_dot_ss(x.Data, y.Data); return detail::sse_dot_ps(x.Data, y.Data);
} }
inline detail::fvec4SIMD simdCross inline detail::fvec4SIMD cross
( (
detail::fvec4SIMD const & x, detail::fvec4SIMD const & x,
detail::fvec4SIMD const & y detail::fvec4SIMD const & y
@ -597,15 +639,29 @@ namespace glm
return detail::sse_xpd_ps(x.Data, y.Data); return detail::sse_xpd_ps(x.Data, y.Data);
} }
inline detail::fvec4SIMD simdNormalize inline detail::fvec4SIMD normalize
( (
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
return detail::sse_nrm_ps(x.Data); __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data);
__m128 isr0 = inversesqrt(dot0).Data;
__m128 mul0 = _mm_mul_ps(x.Data, isr0);
return mul0;
} }
inline detail::fvec4SIMD simdFaceforward inline detail::fvec4SIMD fastNormalize
(
detail::fvec4SIMD const & x
)
{
__m128 dot0 = detail::sse_dot_ps(x.Data, x.Data);
__m128 isr0 = fastInversesqrt(dot0).Data;
__m128 mul0 = _mm_mul_ps(x.Data, isr0);
return mul0;
}
inline detail::fvec4SIMD faceforward
( (
detail::fvec4SIMD const & N, detail::fvec4SIMD const & N,
detail::fvec4SIMD const & I, detail::fvec4SIMD const & I,
@ -615,7 +671,7 @@ namespace glm
return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data); return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data);
} }
inline detail::fvec4SIMD simdReflect inline detail::fvec4SIMD reflect
( (
detail::fvec4SIMD const & I, detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N detail::fvec4SIMD const & N
@ -624,7 +680,7 @@ namespace glm
return detail::sse_rfe_ps(I.Data, N.Data); return detail::sse_rfe_ps(I.Data, N.Data);
} }
inline detail::fvec4SIMD simdRefract inline detail::fvec4SIMD refract
( (
detail::fvec4SIMD const & I, detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N, detail::fvec4SIMD const & N,
@ -634,6 +690,39 @@ namespace glm
return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta)); return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta));
} }
inline detail::fvec4SIMD sqrt(detail::fvec4SIMD const & x)
{
return _mm_mul_ps(inversesqrt(x.Data).Data, x.Data);
}
inline detail::fvec4SIMD niceSqrt(detail::fvec4SIMD const & x)
{
return _mm_sqrt_ps(x.Data);
}
inline detail::fvec4SIMD fastSqrt(detail::fvec4SIMD const & x)
{
return _mm_mul_ps(fastInversesqrt(x.Data).Data, x.Data);
}
// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration
// By Elan Ruskin, http://assemblyrequired.crashworks.org/
inline detail::fvec4SIMD inversesqrt(detail::fvec4SIMD const & x)
{
GLM_ALIGN(4) static const __m128 three = {3, 3, 3, 3}; // aligned consts for fast load
GLM_ALIGN(4) static const __m128 half = {0.5,0.5,0.5,0.5};
__m128 recip = _mm_rsqrt_ps(x.Data); // "estimate" opcode
__m128 halfrecip = _mm_mul_ps(half, recip);
__m128 threeminus_xrr = _mm_sub_ps(three, _mm_mul_ps(x.Data, _mm_mul_ps(recip, recip)));
return _mm_mul_ps(halfrecip, threeminus_xrr);
}
inline detail::fvec4SIMD fastInversesqrt(detail::fvec4SIMD const & x)
{
return _mm_rsqrt_ps(x.Data);
}
}//namespace simd_vec4 }//namespace simd_vec4
}//namespace gtx }//namespace gtx
}//namespace glm }//namespace glm

View File

@ -1,12 +1,21 @@
============================= ================================================================================
G-Truc Creation G-Truc Creation
----------------------------- --------------------------------------------------------------------------------
www.g-truc.net www.g-truc.net
glm@g-truc.net glm@g-truc.net
============================= ================================================================================
GLM Usage
--------------------------------------------------------------------------------
GLM is a header only library, there is nothing to build, just include it.
#include <glm/glm.hpp>
More informations in GLM manual:
http://glm.g-truc.net/glm-manual.pdf
================================================================================
GLM 0.9.1.A: 2010-01-31 GLM 0.9.1.A: 2010-01-31
----------------------------- --------------------------------------------------------------------------------
- Added SIMD support - Added SIMD support
- Added new swizzle functions - Added new swizzle functions
- Improved static assert error message with C++0x static_assert - Improved static assert error message with C++0x static_assert
@ -14,314 +23,315 @@ GLM 0.9.1.A: 2010-01-31
- Reduced branching - Reduced branching
- Fixed trunc implementation - Fixed trunc implementation
============================= ================================================================================
GLM 0.9.0.7: 2010-01-30 GLM 0.9.0.7: 2011-01-30
----------------------------- --------------------------------------------------------------------------------
- Added == and != operator for *mat* and *vec*
- Added GLSL 4.10 packing functions - Added GLSL 4.10 packing functions
- Added == and != operators for every types.
============================= ================================================================================
GLM 0.9.0.6: 2010-12-21 GLM 0.9.0.6: 2010-12-21
----------------------------- --------------------------------------------------------------------------------
- Many matrices bugs fixed - Many matrices bugs fixed
============================= ================================================================================
GLM 0.9.0.5: 2010-11-01 GLM 0.9.0.5: 2010-11-01
----------------------------- --------------------------------------------------------------------------------
- Improved Clang support - Improved Clang support
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.9.0.4: 2010-10-04 GLM 0.9.0.4: 2010-10-04
----------------------------- --------------------------------------------------------------------------------
- Added autoexp for GLM - Added autoexp for GLM
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.9.0.3: 2010-08-26 GLM 0.9.0.3: 2010-08-26
----------------------------- --------------------------------------------------------------------------------
- Fixed non-squared matrix operators - Fixed non-squared matrix operators
============================= ================================================================================
GLM 0.9.0.2: 2010-07-08 GLM 0.9.0.2: 2010-07-08
----------------------------- --------------------------------------------------------------------------------
- Added GLM_GTX_int_10_10_10_2 - Added GLM_GTX_int_10_10_10_2
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.9.0.1: 2010-06-21 GLM 0.9.0.1: 2010-06-21
----------------------------- --------------------------------------------------------------------------------
- Fixed extensions errors - Fixed extensions errors
============================= ================================================================================
GLM 0.9.0.0: 2010-05-25 GLM 0.9.0.0: 2010-05-25
----------------------------- --------------------------------------------------------------------------------
- Objective-C support - Objective-C support
- Fixed warnings - Fixed warnings
- Updated documentation - Updated documentation
============================= ================================================================================
GLM 0.9.B.2: 2010-04-30 GLM 0.9.B.2: 2010-04-30
----------------------------- --------------------------------------------------------------------------------
- Git transition - Git transition
- Removed experimental code from releases - Removed experimental code from releases
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.9.B.1: 2010-04-03 GLM 0.9.B.1: 2010-04-03
----------------------------- --------------------------------------------------------------------------------
- Based on GLSL 4.00 specification - Based on GLSL 4.00 specification
- Added the new core functions - Added the new core functions
- Added some implicit conversion support - Added some implicit conversion support
============================= ================================================================================
GLM 0.9.A.2: 2010-02-20 GLM 0.9.A.2: 2010-02-20
----------------------------- --------------------------------------------------------------------------------
- Improved some possible errors messages - Improved some possible errors messages
- Improved declarations and definitions match - Improved declarations and definitions match
============================= ================================================================================
GLM 0.9.A.1: 2010-02-09 GLM 0.9.A.1: 2010-02-09
----------------------------- --------------------------------------------------------------------------------
- Removed deprecated features - Removed deprecated features
- Internal redesign - Internal redesign
============================= ================================================================================
GLM 0.8.4.4 final: 2010-01-25 GLM 0.8.4.4 final: 2010-01-25
----------------------------- --------------------------------------------------------------------------------
- Fixed warnings - Fixed warnings
============================= ================================================================================
GLM 0.8.4.3 final: 2009-11-16 GLM 0.8.4.3 final: 2009-11-16
----------------------------- --------------------------------------------------------------------------------
- Fixed Half float arithmetic - Fixed Half float arithmetic
- Fixed setup defines - Fixed setup defines
============================= ================================================================================
GLM 0.8.4.2 final: 2009-10-19 GLM 0.8.4.2 final: 2009-10-19
----------------------------- --------------------------------------------------------------------------------
- Fixed Half float adds - Fixed Half float adds
============================= ================================================================================
GLM 0.8.4.1 final: 2009-10-05 GLM 0.8.4.1 final: 2009-10-05
----------------------------- --------------------------------------------------------------------------------
- Updated documentation - Updated documentation
- Fixed MacOS X build - Fixed MacOS X build
============================= ================================================================================
GLM 0.8.4.0 final: 2009-09-16 GLM 0.8.4.0 final: 2009-09-16
----------------------------- --------------------------------------------------------------------------------
- Added GCC 4.4 and VC2010 support - Added GCC 4.4 and VC2010 support
- Added matrix optimizations - Added matrix optimizations
============================= ================================================================================
GLM 0.8.3.5 final: 2009-08-11 GLM 0.8.3.5 final: 2009-08-11
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.8.3.4 final: 2009-08-10 GLM 0.8.3.4 final: 2009-08-10
----------------------------- --------------------------------------------------------------------------------
- Updated GLM according GLSL 1.5 spec - Updated GLM according GLSL 1.5 spec
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.8.3.3 final: 2009-06-25 GLM 0.8.3.3 final: 2009-06-25
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs - Fixed bugs
============================= ================================================================================
GLM 0.8.3.2 final: 2009-06-04 GLM 0.8.3.2 final: 2009-06-04
----------------------------- --------------------------------------------------------------------------------
- Added GLM_GTC_quaternion - Added GLM_GTC_quaternion
- Added GLM_GTC_type_precision - Added GLM_GTC_type_precision
============================= ================================================================================
GLM 0.8.3.1 final: 2009-05-21 GLM 0.8.3.1 final: 2009-05-21
----------------------------- --------------------------------------------------------------------------------
- Fixed old extension system. - Fixed old extension system.
============================= ================================================================================
GLM 0.8.3.0 final: 2009-05-06 GLM 0.8.3.0 final: 2009-05-06
----------------------------- --------------------------------------------------------------------------------
- Added stable extensions. - Added stable extensions.
- Added new extension system. - Added new extension system.
============================= ================================================================================
GLM 0.8.2.3 final: 2009-04-01 GLM 0.8.2.3 final: 2009-04-01
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs. - Fixed bugs.
============================= ================================================================================
GLM 0.8.2.2 final: 2009-02-24 GLM 0.8.2.2 final: 2009-02-24
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs. - Fixed bugs.
============================= ================================================================================
GLM 0.8.2.1 final: 2009-02-13 GLM 0.8.2.1 final: 2009-02-13
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs. - Fixed bugs.
============================= ================================================================================
GLM 0.8.2 final: 2009-01-21 GLM 0.8.2 final: 2009-01-21
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs. - Fixed bugs.
============================= ================================================================================
GLM 0.8.1 final: 2008-10-30 GLM 0.8.1 final: 2008-10-30
----------------------------- --------------------------------------------------------------------------------
- Fixed bugs. - Fixed bugs.
============================= ================================================================================
GLM 0.8.0 final: 2008-10-23 GLM 0.8.0 final: 2008-10-23
----------------------------- --------------------------------------------------------------------------------
- New method to use extension. - New method to use extension.
============================= ================================================================================
GLM 0.8.0 beta3: 2008-10-10 GLM 0.8.0 beta3: 2008-10-10
----------------------------- --------------------------------------------------------------------------------
- Added CMake support for GLM tests. - Added CMake support for GLM tests.
============================= ================================================================================
GLM 0.8.0 beta2: 2008-10-04 GLM 0.8.0 beta2: 2008-10-04
----------------------------- --------------------------------------------------------------------------------
- Improved half scalars and vectors support. - Improved half scalars and vectors support.
============================= ================================================================================
GLM 0.8.0 beta1: 2008-09-26 GLM 0.8.0 beta1: 2008-09-26
----------------------------- --------------------------------------------------------------------------------
- Improved GLSL conformance - Improved GLSL conformance
- Added GLSL 1.30 support - Added GLSL 1.30 support
- Improved API documentation - Improved API documentation
============================= ================================================================================
GLM 0.7.6 final: 2008-08-08 GLM 0.7.6 final: 2008-08-08
--------------------------- --------------------------------------------------------------------------------
- Improved C++ standard comformance - Improved C++ standard comformance
- Added Static assert for types checking - Added Static assert for types checking
=========================== ================================================================================
GLM 0.7.5 final: 2008-07-05 GLM 0.7.5 final: 2008-07-05
--------------------------- --------------------------------------------------------------------------------
- Added build message system with Visual Studio - Added build message system with Visual Studio
- Pedantic build with GCC - Pedantic build with GCC
=========================== ================================================================================
GLM 0.7.4 final: 2008-06-01 GLM 0.7.4 final: 2008-06-01
--------------------------- --------------------------------------------------------------------------------
- Added external dependencies system. - Added external dependencies system.
=========================== ================================================================================
GLM 0.7.3 final: 2008-05-24 GLM 0.7.3 final: 2008-05-24
--------------------------- --------------------------------------------------------------------------------
- Fixed bugs - Fixed bugs
- Added new extension group - Added new extension group
=========================== ================================================================================
GLM 0.7.2 final: 2008-04-27 GLM 0.7.2 final: 2008-04-27
--------------------------- --------------------------------------------------------------------------------
- Updated documentation - Updated documentation
- Added preprocessor options - Added preprocessor options
=========================== ================================================================================
GLM 0.7.1 final: 2008-03-24 GLM 0.7.1 final: 2008-03-24
--------------------------- --------------------------------------------------------------------------------
- Disabled half on GCC - Disabled half on GCC
- Fixed extensions - Fixed extensions
=========================== ================================================================================
GLM 0.7.0 final: 2008-03-22 GLM 0.7.0 final: 2008-03-22
--------------------------- --------------------------------------------------------------------------------
- Changed to MIT license - Changed to MIT license
- Added new documentation - Added new documentation
=========================== ================================================================================
GLM 0.6.4 : 2007-12-10 GLM 0.6.4 : 2007-12-10
--------------------------- --------------------------------------------------------------------------------
- Fixed swizzle operators - Fixed swizzle operators
=========================== ================================================================================
GLM 0.6.3 : 2007-11-05 GLM 0.6.3 : 2007-11-05
--------------------------- --------------------------------------------------------------------------------
- Fixed type data accesses - Fixed type data accesses
- Fixed 3DSMax sdk conflict - Fixed 3DSMax sdk conflict
=========================== ================================================================================
GLM 0.6.2 : 2007-10-08 GLM 0.6.2 : 2007-10-08
--------------------------- --------------------------------------------------------------------------------
- Fixed extension - Fixed extension
=========================== ================================================================================
GLM 0.6.1 : 2007-10-07 GLM 0.6.1 : 2007-10-07
--------------------------- --------------------------------------------------------------------------------
- Fixed a namespace error - Fixed a namespace error
- Added extensions - Added extensions
=========================== ================================================================================
GLM 0.6.0 : 2007-09-16 GLM 0.6.0 : 2007-09-16
--------------------------- --------------------------------------------------------------------------------
- Added new extension namespace mecanium - Added new extension namespace mecanium
- Added Automatic compiler detection - Added Automatic compiler detection
=========================== ================================================================================
GLM 0.5.1 : 2007-02-19 GLM 0.5.1 : 2007-02-19
--------------------------- --------------------------------------------------------------------------------
- Fixed swizzle operators - Fixed swizzle operators
=========================== ================================================================================
GLM 0.5.0 : 2007-01-06 GLM 0.5.0 : 2007-01-06
--------------------------- --------------------------------------------------------------------------------
- Upgrated to GLSL 1.2 - Upgrated to GLSL 1.2
- Added swizzle operators - Added swizzle operators
- Added setup settings - Added setup settings
=========================== ================================================================================
GLM 0.4.1 : 2006-05-22 GLM 0.4.1 : 2006-05-22
--------------------------- --------------------------------------------------------------------------------
- Added OpenGL examples - Added OpenGL examples
=========================== ================================================================================
GLM 0.4.0 : 2006-05-17 GLM 0.4.0 : 2006-05-17
--------------------------- --------------------------------------------------------------------------------
- Added missing operators to vec* and mat* - Added missing operators to vec* and mat*
- Added first GLSL 1.2 features - Added first GLSL 1.2 features
- Fixed windows.h before glm.h when windows.h required - Fixed windows.h before glm.h when windows.h required
=========================== ================================================================================
GLM 0.3.2 : 2006-04-21 GLM 0.3.2 : 2006-04-21
--------------------------- --------------------------------------------------------------------------------
- Fixed texcoord components access. - Fixed texcoord components access.
- Fixed mat4 and imat4 division operators. - Fixed mat4 and imat4 division operators.
=========================== ================================================================================
GLM 0.3.1 : 2006-03-28 GLM 0.3.1 : 2006-03-28
--------------------------- --------------------------------------------------------------------------------
- Added GCC 4.0 support under MacOS X. - Added GCC 4.0 support under MacOS X.
- Added GCC 4.0 and 4.1 support under Linux. - Added GCC 4.0 and 4.1 support under Linux.
- Added code optimisations. - Added code optimisations.
=========================== ================================================================================
GLM 0.3 : 2006-02-19 GLM 0.3 : 2006-02-19
--------------------------- --------------------------------------------------------------------------------
- Improved GLSL type conversion and construction compliance. - Improved GLSL type conversion and construction compliance.
- Added experimental extensions. - Added experimental extensions.
- Added Doxygen Documentation. - Added Doxygen Documentation.
- Added code optimisations. - Added code optimisations.
- Fixed bugs. - Fixed bugs.
=========================== ================================================================================
GLM 0.2: 2005-05-05 GLM 0.2: 2005-05-05
--------------------------- --------------------------------------------------------------------------------
- Improve adaptative from GLSL. - Improve adaptative from GLSL.
- Add experimental extensions based on OpenGL extension process. - Add experimental extensions based on OpenGL extension process.
- Fixe bugs. - Fixe bugs.
=========================== ================================================================================
GLM 0.1: 2005-02-21 GLM 0.1: 2005-02-21
--------------------------- --------------------------------------------------------------------------------
- Add vec2, vec3, vec4 GLSL types - Add vec2, vec3, vec4 GLSL types
- Add ivec2, ivec3, ivec4 GLSL types - Add ivec2, ivec3, ivec4 GLSL types
- Add bvec2, bvec3, bvec4 GLSL types - Add bvec2, bvec3, bvec4 GLSL types
- Add mat2, mat3, mat4 GLSL types - Add mat2, mat3, mat4 GLSL types
- Add almost all functions - Add almost all functions
================================================================================

View File

@ -28,7 +28,7 @@ std::vector<float> test_detA(std::vector<glm::mat4> const & Data)
Test[i] = glm::determinant(Data[i]); Test[i] = glm::determinant(Data[i]);
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Det A: %d\n", TimeEnd - TimeStart); printf("Det A: %ld\n", TimeEnd - TimeStart);
return Test; return Test;
} }
@ -49,7 +49,7 @@ std::vector<float> test_detB(std::vector<glm::mat4> const & Data)
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Det B: %d\n", TimeEnd - TimeStart); printf("Det B: %ld\n", TimeEnd - TimeStart);
return Test; return Test;
} }
@ -70,7 +70,7 @@ std::vector<float> test_detC(std::vector<glm::mat4> const & Data)
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Det C: %d\n", TimeEnd - TimeStart); printf("Det C: %ld\n", TimeEnd - TimeStart);
return Test; return Test;
} }
@ -91,7 +91,7 @@ std::vector<float> test_detD(std::vector<glm::mat4> const & Data)
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Det D: %d\n", TimeEnd - TimeStart); printf("Det D: %ld\n", TimeEnd - TimeStart);
return Test; return Test;
} }
@ -109,7 +109,7 @@ void test_invA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Inv A: %d\n", TimeEnd - TimeStart); printf("Inv A: %ld\n", TimeEnd - TimeStart);
} }
void test_invC(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out) void test_invC(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)
@ -129,7 +129,7 @@ void test_invC(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Inv C: %d\n", TimeEnd - TimeStart); printf("Inv C: %ld\n", TimeEnd - TimeStart);
} }
void test_invD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out) void test_invD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)
@ -149,7 +149,7 @@ void test_invD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Inv D: %d\n", TimeEnd - TimeStart); printf("Inv D: %ld\n", TimeEnd - TimeStart);
} }
void test_mulA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out) void test_mulA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)
@ -165,7 +165,7 @@ void test_mulA(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Mul A: %d\n", TimeEnd - TimeStart); printf("Mul A: %ld\n", TimeEnd - TimeStart);
} }
void test_mulD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out) void test_mulD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out)
@ -183,7 +183,7 @@ void test_mulD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("Mul D: %d\n", TimeEnd - TimeStart); printf("Mul D: %ld\n", TimeEnd - TimeStart);
} }
int test_compute_glm() int test_compute_glm()
@ -222,7 +222,7 @@ int test_compute_gtx()
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
printf("test_compute_gtx: %d\n", TimeEnd - TimeStart); printf("test_compute_gtx: %ld\n", TimeEnd - TimeStart);
return Output.size() != 0; return Output.size() != 0;
} }
@ -280,8 +280,8 @@ int main()
Failed += test_compute_glm(); Failed += test_compute_glm();
Failed += test_compute_gtx(); Failed += test_compute_gtx();
float Det = glm::simdDeterminant(glm::simdMat4(1.0)); float Det = glm::determinant(glm::simdMat4(1.0));
glm::simdMat4 D = glm::simdMatrixCompMult(glm::simdMat4(1.0), glm::simdMat4(1.0)); glm::simdMat4 D = glm::matrixCompMult(glm::simdMat4(1.0), glm::simdMat4(1.0));
system("pause"); system("pause");