diff --git a/doc/src/data.xml b/doc/src/data.xml index e0ba3945..fdfaa64a 100644 --- a/doc/src/data.xml +++ b/doc/src/data.xml @@ -3,16 +3,17 @@
- - - - - - - - - - + + + + + + + + + + + @@ -64,6 +65,7 @@
+ @@ -152,6 +154,46 @@ + + + The main improvement of this version comes from the extented number of matrix contructors so that a programmer can used diffent scalar types for each parameter. + + + + #include + <glm/glm.hpp> + + + + + + // Create an identity matrix + + + glm::mat3 m( + + + 1, 0.0, 0, + + + 0.0, 1.0, 0.0f, + + + 0, 0.0, 1.0f); + + + + The quaternion implementation has been updated as well, fixing the various slerp implementation flavour (mix, shortMix and fastMix) and providing more completeness: Added interaction with GLM_GTX_epsilon and missing lowp_quat, mediump_quat and highp_quat but also none square matrix equivalents. + + + Finally, some efforts have been put to remove warnings across all supported compilers. + + + GLM 0.9.2.2 (zip) + GLM 0.9.2.2 (7z) + Submit a bug report + + GLM 0.9.2.1 significantly improves compiler detection which allows CUDA to be automatically recognized when GLM is used inside a CUDA kernel. diff --git a/glm/core/intrinsic_common.inl b/glm/core/intrinsic_common.inl index 47935d29..b4cccd35 100644 --- a/glm/core/intrinsic_common.inl +++ b/glm/core/intrinsic_common.inl @@ -21,107 +21,107 @@ namespace detail{ 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 __m128 GLM_VAR_USED zero = _mm_setzero_ps(); + static const __m128 GLM_VAR_USED one = _mm_set_ps1(1.0f); + static const __m128 GLM_VAR_USED minus_one = _mm_set_ps1(-1.0f); + static const __m128 GLM_VAR_USED two = _mm_set_ps1(2.0f); + static const __m128 GLM_VAR_USED three = _mm_set_ps1(3.0f); + static const __m128 GLM_VAR_USED pi = _mm_set_ps1(3.1415926535897932384626433832795f); + static const __m128 GLM_VAR_USED hundred_eighty = _mm_set_ps1(180.f); + static const __m128 GLM_VAR_USED pi_over_hundred_eighty = _mm_set_ps1(0.017453292519943295769236907684886f); + static const __m128 GLM_VAR_USED 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 GLM_VAR_USED 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 GLM_VAR_USED _epi32_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x80000000)); + //static const __m128 GLM_VAR_USED _epi32_inv_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)); + //static const __m128 GLM_VAR_USED _epi32_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000)); + //static const __m128 GLM_VAR_USED _epi32_inv_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x807FFFFF)); + //static const __m128 GLM_VAR_USED _epi32_min_norm_pos = _mm_castsi128_ps(_mm_set1_epi32(0x00800000)); + static const __m128 GLM_VAR_USED _epi32_0 = _mm_set_ps1(0); + static const __m128 GLM_VAR_USED _epi32_1 = _mm_set_ps1(1); + static const __m128 GLM_VAR_USED _epi32_2 = _mm_set_ps1(2); + static const __m128 GLM_VAR_USED _epi32_3 = _mm_set_ps1(3); + static const __m128 GLM_VAR_USED _epi32_4 = _mm_set_ps1(4); + static const __m128 GLM_VAR_USED _epi32_5 = _mm_set_ps1(5); + static const __m128 GLM_VAR_USED _epi32_6 = _mm_set_ps1(6); + static const __m128 GLM_VAR_USED _epi32_7 = _mm_set_ps1(7); + static const __m128 GLM_VAR_USED _epi32_8 = _mm_set_ps1(8); + static const __m128 GLM_VAR_USED _epi32_9 = _mm_set_ps1(9); + static const __m128 GLM_VAR_USED _epi32_127 = _mm_set_ps1(127); + //static const __m128 GLM_VAR_USED _epi32_ninf = _mm_castsi128_ps(_mm_set1_epi32(0xFF800000)); + //static const __m128 GLM_VAR_USED _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 GLM_VAR_USED _ps_1_3 = _mm_set_ps1(0.33333333333333333333333333333333f); + static const __m128 GLM_VAR_USED _ps_0p5 = _mm_set_ps1(0.5f); + static const __m128 GLM_VAR_USED _ps_1 = _mm_set_ps1(1.0f); + static const __m128 GLM_VAR_USED _ps_m1 = _mm_set_ps1(-1.0f); + static const __m128 GLM_VAR_USED _ps_2 = _mm_set_ps1(2.0f); + static const __m128 GLM_VAR_USED _ps_3 = _mm_set_ps1(3.0f); + static const __m128 GLM_VAR_USED _ps_127 = _mm_set_ps1(127.0f); + static const __m128 GLM_VAR_USED _ps_255 = _mm_set_ps1(255.0f); + static const __m128 GLM_VAR_USED _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 GLM_VAR_USED _ps_1_0_0_0 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f); + static const __m128 GLM_VAR_USED _ps_0_1_0_0 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); + static const __m128 GLM_VAR_USED _ps_0_0_1_0 = _mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f); + static const __m128 GLM_VAR_USED _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 GLM_VAR_USED _ps_pi = _mm_set_ps1(3.1415926535897932384626433832795f); + static const __m128 GLM_VAR_USED _ps_pi2 = _mm_set_ps1(6.283185307179586476925286766560f); + static const __m128 GLM_VAR_USED _ps_2_pi = _mm_set_ps1(0.63661977236758134307553505349006f); + static const __m128 GLM_VAR_USED _ps_pi_2 = _mm_set_ps1(1.5707963267948966192313216916398f); + static const __m128 GLM_VAR_USED _ps_4_pi = _mm_set_ps1(1.2732395447351626861510701069801f); + static const __m128 GLM_VAR_USED _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 GLM_VAR_USED _ps_sincos_p0 = _mm_set_ps1(0.15707963267948963959e1f); + static const __m128 GLM_VAR_USED _ps_sincos_p1 = _mm_set_ps1(-0.64596409750621907082e0f); + static const __m128 GLM_VAR_USED _ps_sincos_p2 = _mm_set_ps1(0.7969262624561800806e-1f); + static const __m128 GLM_VAR_USED _ps_sincos_p3 = _mm_set_ps1(-0.468175413106023168e-2f); + static const __m128 GLM_VAR_USED _ps_tan_p0 = _mm_set_ps1(-1.79565251976484877988e7f); + static const __m128 GLM_VAR_USED _ps_tan_p1 = _mm_set_ps1(1.15351664838587416140e6f); + static const __m128 GLM_VAR_USED _ps_tan_p2 = _mm_set_ps1(-1.30936939181383777646e4f); + static const __m128 GLM_VAR_USED _ps_tan_q0 = _mm_set_ps1(-5.38695755929454629881e7f); + static const __m128 GLM_VAR_USED _ps_tan_q1 = _mm_set_ps1(2.50083801823357915839e7f); + static const __m128 GLM_VAR_USED _ps_tan_q2 = _mm_set_ps1(-1.32089234440210967447e6f); + static const __m128 GLM_VAR_USED _ps_tan_q3 = _mm_set_ps1(1.36812963470692954678e4f); + static const __m128 GLM_VAR_USED _ps_tan_poleval = _mm_set_ps1(3.68935e19f); + static const __m128 GLM_VAR_USED _ps_atan_t0 = _mm_set_ps1(-0.91646118527267623468e-1f); + static const __m128 GLM_VAR_USED _ps_atan_t1 = _mm_set_ps1(-0.13956945682312098640e1f); + static const __m128 GLM_VAR_USED _ps_atan_t2 = _mm_set_ps1(-0.94393926122725531747e2f); + static const __m128 GLM_VAR_USED _ps_atan_t3 = _mm_set_ps1(0.12888383034157279340e2f); + static const __m128 GLM_VAR_USED _ps_atan_s0 = _mm_set_ps1(0.12797564625607904396e1f); + static const __m128 GLM_VAR_USED _ps_atan_s1 = _mm_set_ps1(0.21972168858277355914e1f); + static const __m128 GLM_VAR_USED _ps_atan_s2 = _mm_set_ps1(0.68193064729268275701e1f); + static const __m128 GLM_VAR_USED _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); + static const __m128 GLM_VAR_USED _ps_exp_hi = _mm_set_ps1(88.3762626647949f); + static const __m128 GLM_VAR_USED _ps_exp_lo = _mm_set_ps1(-88.3762626647949f); + static const __m128 GLM_VAR_USED _ps_exp_rln2 = _mm_set_ps1(1.4426950408889634073599f); + static const __m128 GLM_VAR_USED _ps_exp_p0 = _mm_set_ps1(1.26177193074810590878e-4f); + static const __m128 GLM_VAR_USED _ps_exp_p1 = _mm_set_ps1(3.02994407707441961300e-2f); + static const __m128 GLM_VAR_USED _ps_exp_q0 = _mm_set_ps1(3.00198505138664455042e-6f); + static const __m128 GLM_VAR_USED _ps_exp_q1 = _mm_set_ps1(2.52448340349684104192e-3f); + static const __m128 GLM_VAR_USED _ps_exp_q2 = _mm_set_ps1(2.27265548208155028766e-1f); + static const __m128 GLM_VAR_USED _ps_exp_q3 = _mm_set_ps1(2.00000000000000000009e0f); + static const __m128 GLM_VAR_USED _ps_exp_c1 = _mm_set_ps1(6.93145751953125e-1f); + static const __m128 GLM_VAR_USED _ps_exp_c2 = _mm_set_ps1(1.42860682030941723212e-6f); + static const __m128 GLM_VAR_USED _ps_exp2_hi = _mm_set_ps1(127.4999961853f); + static const __m128 GLM_VAR_USED _ps_exp2_lo = _mm_set_ps1(-127.4999961853f); + static const __m128 GLM_VAR_USED _ps_exp2_p0 = _mm_set_ps1(2.30933477057345225087e-2f); + static const __m128 GLM_VAR_USED _ps_exp2_p1 = _mm_set_ps1(2.02020656693165307700e1f); + static const __m128 GLM_VAR_USED _ps_exp2_p2 = _mm_set_ps1(1.51390680115615096133e3f); + static const __m128 GLM_VAR_USED _ps_exp2_q0 = _mm_set_ps1(2.33184211722314911771e2f); + static const __m128 GLM_VAR_USED _ps_exp2_q1 = _mm_set_ps1(4.36821166879210612817e3f); + static const __m128 GLM_VAR_USED _ps_log_p0 = _mm_set_ps1(-7.89580278884799154124e-1f); + static const __m128 GLM_VAR_USED _ps_log_p1 = _mm_set_ps1(1.63866645699558079767e1f); + static const __m128 GLM_VAR_USED _ps_log_p2 = _mm_set_ps1(-6.41409952958715622951e1f); + static const __m128 GLM_VAR_USED _ps_log_q0 = _mm_set_ps1(-3.56722798256324312549e1f); + static const __m128 GLM_VAR_USED _ps_log_q1 = _mm_set_ps1(3.12093766372244180303e2f); + static const __m128 GLM_VAR_USED _ps_log_q2 = _mm_set_ps1(-7.69691943550460008604e2f); + static const __m128 GLM_VAR_USED _ps_log_c0 = _mm_set_ps1(0.693147180559945f); + static const __m128 GLM_VAR_USED _ps_log2_c0 = _mm_set_ps1(1.44269504088896340735992f); GLM_FUNC_QUALIFIER __m128 sse_abs_ps(__m128 x) { @@ -205,12 +205,19 @@ GLM_FUNC_QUALIFIER __m128 sse_mod_ps(__m128 x, __m128 y) } /// TODO +<<<<<<< HEAD /* GLM_FUNC_QUALIFIER __m128 sse_modf_ps(__m128 x, __m128i & i) { return __m128(); } */ +======= +//GLM_FUNC_QUALIFIER __m128 sse_modf_ps(__m128 x, __m128i & i) +//{ +// return __m128(); +//} +>>>>>>> d373c85b676bf28e721f3b30fd3fb0b1ceadd0d2 //GLM_FUNC_QUALIFIER __m128 _mm_min_ps(__m128 x, __m128 y) @@ -254,17 +261,19 @@ GLM_FUNC_QUALIFIER __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x) return mul2; } -/* TODO +/// \todo GLM_FUNC_QUALIFIER __m128 sse_nan_ps(__m128 x) { - + __m128 empty; + return empty; } +/// \todo GLM_FUNC_QUALIFIER __m128 sse_inf_ps(__m128 x) { - + __m128 empty; + return empty; } -*/ // SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration // By Elan Ruskin, http://assemblyrequired.crashworks.org/ diff --git a/glm/core/intrinsic_matrix.inl b/glm/core/intrinsic_matrix.inl index 7350488f..c3ec68a7 100644 --- a/glm/core/intrinsic_matrix.inl +++ b/glm/core/intrinsic_matrix.inl @@ -10,9 +10,8 @@ namespace glm{ namespace detail{ -/// \todo -//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); +static const __m128 GLM_VAR_USED _m128_rad_ps = _mm_set_ps1(3.141592653589793238462643383279f / 180.f); +static const __m128 GLM_VAR_USED _m128_deg_ps = _mm_set_ps1(180.f / 3.141592653589793238462643383279f); template GLM_FUNC_QUALIFIER matType sse_comp_mul_ps @@ -969,7 +968,7 @@ GLM_FUNC_QUALIFIER void sse_inverse_fast_ps(__m128 const in[4], __m128 out[4]) out[2] = _mm_mul_ps(Inv2, Rcp0); out[3] = _mm_mul_ps(Inv3, Rcp0); } - +/* GLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4]) { float a = glm::radians(Angle); @@ -1039,7 +1038,7 @@ GLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float con //return Result; sse_mul_ps(in, Result, out); } - +*/ GLM_FUNC_QUALIFIER void sse_outer_ps(__m128 const & c, __m128 const & r, __m128 out[4]) { out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0))); diff --git a/glm/core/setup.hpp b/glm/core/setup.hpp index 01075f3c..28a89b52 100644 --- a/glm/core/setup.hpp +++ b/glm/core/setup.hpp @@ -43,8 +43,8 @@ // GCC defines #define GLM_COMPILER_GCC 0x02000000 -#define GLM_COMPILER_GCC_LLVM 0x02000000 -#define GLM_COMPILER_GCC_CLANG 0x02000000 +#define GLM_COMPILER_GCC_LLVM 0x02000001 +#define GLM_COMPILER_GCC_CLANG 0x02000002 #define GLM_COMPILER_GCC30 0x02000010 #define GLM_COMPILER_GCC31 0x02000020 #define GLM_COMPILER_GCC32 0x02000030 @@ -214,9 +214,9 @@ # elif(GLM_COMPILER & GLM_COMPILER_LLVM_GCC) # pragma message("GLM: LLVM GCC compiler detected") # elif(GLM_COMPILER & GLM_COMPILER_GCC) -# if(GLM_COMPILER & GLM_COMPILER_GCC_LLVM) +# if(GLM_COMPILER == GLM_COMPILER_GCC_LLVM) # pragma message("GLM: LLVM GCC compiler detected") -# elif(GLM_COMPILER & GLM_COMPILER_GCC_CLANG) +# elif(GLM_COMPILER == GLM_COMPILER_GCC_CLANG) # pragma message("GLM: CLANG compiler detected") # else # pragma message("GLM: GCC compiler detected") @@ -441,6 +441,12 @@ # define GLM_CUDA_FUNC_DECL #endif +#if GLM_COMPILER & GLM_COMPILER_GCC +#define GLM_VAR_USED __attribute__ ((unused)) +#else +#define GLM_VAR_USED +#endif + #if(defined(GLM_FORCE_INLINE)) # if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) # define GLM_INLINE __forceinline diff --git a/glm/gtx/epsilon.hpp b/glm/gtx/epsilon.hpp index 7df2cb7d..3ee7f418 100644 --- a/glm/gtx/epsilon.hpp +++ b/glm/gtx/epsilon.hpp @@ -8,7 +8,8 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // Dependency: // - GLM core -// - GLM_GTX_half +// - GLM_GTC_half_float +// - GLM_GTC_quaternion /////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef glm_gtx_epsilon @@ -17,6 +18,7 @@ // Dependency: #include "../glm.hpp" #include "../gtc/half_float.hpp" +#include "../gtc/quaternion.hpp" #if(defined(GLM_MESSAGES) && !defined(glm_ext)) # pragma message("GLM: GLM_GTX_epsilon extension included") diff --git a/glm/gtx/epsilon.inl b/glm/gtx/epsilon.inl index 1e424127..4eab9103 100644 --- a/glm/gtx/epsilon.inl +++ b/glm/gtx/epsilon.inl @@ -157,6 +157,21 @@ GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon abs(x.w - y.w) < epsilon.w); } +template +GLM_FUNC_QUALIFIER detail::tvec4 equalEpsilon +( + detail::tquat const & x, + detail::tquat const & y, + detail::tquat const & epsilon +) +{ + return detail::tvec4( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z, + abs(x.w - y.w) < epsilon.w); +} + template GLM_FUNC_QUALIFIER detail::tvec2 notEqualEpsilon ( @@ -199,6 +214,21 @@ GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon abs(x.w - y.w) >= epsilon.w); } +template +GLM_FUNC_QUALIFIER detail::tvec4 notEqualEpsilon +( + detail::tquat const & x, + detail::tquat const & y, + detail::tquat const & epsilon +) +{ + return detail::tvec4( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z, + abs(x.w - y.w) >= epsilon.w); +} + }//namespace epsilon }//namespace gtx }//namespace glm diff --git a/glm/gtx/quaternion.inl b/glm/gtx/quaternion.inl index ec713c8d..b63e6c0f 100644 --- a/glm/gtx/quaternion.inl +++ b/glm/gtx/quaternion.inl @@ -256,7 +256,7 @@ namespace quaternion if(a <= typename detail::tquat::value_type(0)) return x; if(a >= typename detail::tquat::value_type(1)) return y; - float fCos = dot(x, y); + detail::tquat::value_type fCos = dot(x, y); detail::tquat y2(y); //BUG!!! tquat y2; if(fCos < typename detail::tquat::value_type(0)) { @@ -265,7 +265,7 @@ namespace quaternion } //if(fCos > 1.0f) // problem - float k0, k1; + detail::tquat::value_type k0, k1; if(fCos > typename detail::tquat::value_type(0.9999)) { k0 = typename detail::tquat::value_type(1) - a; @@ -295,7 +295,7 @@ namespace quaternion T const & a ) { - return glm::normalize(x * (1 - a) + (y * a)); + return glm::normalize(x * (detail::tquat::value_type(1) - a) + (y * a)); } }//namespace quaternion diff --git a/glm/gtx/random.inl b/glm/gtx/random.inl index f325d61d..77edea44 100644 --- a/glm/gtx/random.inl +++ b/glm/gtx/random.inl @@ -17,7 +17,7 @@ namespace random template <> GLM_FUNC_QUALIFIER float signedRand1() { - #if(GLM_COMPILER & GLM_COMPILER_VC) + #if(GLM_COMPILER & GLM_COMPILER_VC)// && (GLM_COMPILER < GLM_COMPILER_VC2010) #define RAND_SHIFT_NUM 5 #else #define RAND_SHIFT_NUM 0 diff --git a/glm/virtrev/xstream.hpp b/glm/virtrev/xstream.hpp index 1f19dae2..cf13ffbe 100644 --- a/glm/virtrev/xstream.hpp +++ b/glm/virtrev/xstream.hpp @@ -1,6 +1,3 @@ -#ifndef GLM_EXT_VIRTREV_XSTREAM_HPP -#define GLM_EXT_VIRTREV_XSTREAM_HPP - /////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) // Virtrev SDK copyright matrem (matrem84.free.fr) @@ -15,6 +12,9 @@ // - GLM_GTX_matrix_selection /////////////////////////////////////////////////////////////////////////////////////////////////// +#ifndef GLM_EXT_VIRTREV_XSTREAM_HPP +#define GLM_EXT_VIRTREV_XSTREAM_HPP + #include "../glm.hpp" #include "../gtc/matrix_access.hpp" #include diff --git a/readme.txt b/readme.txt index 50157d1a..33f5726a 100644 --- a/readme.txt +++ b/readme.txt @@ -37,7 +37,14 @@ More informations in GLM manual: http://glm.g-truc.net/glm-0.9.2.pdf ================================================================================ -GLM 0.9.2.1: 2010-05-24 +GLM 0.9.2.2: 2011-06-XX +-------------------------------------------------------------------------------- +- Expend matrix constructors flexibility +- Improved quaternion implementation +- Fixed many warnings across platforms and compilers + +================================================================================ +GLM 0.9.2.1: 2011-05-24 -------------------------------------------------------------------------------- - Automatically detect CUDA support - Improved compiler detection @@ -46,7 +53,7 @@ GLM 0.9.2.1: 2010-05-24 - Fixed and tested GLM_GTX_rotate_vector ================================================================================ -GLM 0.9.2.0: 2010-05-09 +GLM 0.9.2.0: 2011-05-09 -------------------------------------------------------------------------------- - Added CUDA support - Added CTest test suite @@ -56,27 +63,27 @@ GLM 0.9.2.0: 2010-05-09 - Updated quaternion slerp interpolation ================================================================================ -GLM 0.9.1.3: 2010-05-07 +GLM 0.9.1.3: 2011-05-07 -------------------------------------------------------------------------------- - Fixed bugs ================================================================================ -GLM 0.9.1.2: 2010-04-15 +GLM 0.9.1.2: 2011-04-15 -------------------------------------------------------------------------------- - Fixed bugs ================================================================================ -GLM 0.9.1.1: 2010-03-17 +GLM 0.9.1.1: 2011-03-17 -------------------------------------------------------------------------------- - Fixed bugs ================================================================================ -GLM 0.9.1.0: 2010-03-03 +GLM 0.9.1.0: 2011-03-03 -------------------------------------------------------------------------------- - Fixed bugs ================================================================================ -GLM 0.9.1.B: 2010-02-13 +GLM 0.9.1.B: 2011-02-13 -------------------------------------------------------------------------------- - Updated API documentation - Improved SIMD implementation @@ -89,7 +96,7 @@ GLM 0.9.0.8: 2011-02-13 - Clarify that GLM is a header only library. ================================================================================ -GLM 0.9.1.A: 2010-01-31 +GLM 0.9.1.A: 2011-01-31 -------------------------------------------------------------------------------- - Added SIMD support - Added new swizzle functions diff --git a/test/gtc/gtc_quaternion.cpp b/test/gtc/gtc_quaternion.cpp index a84b03be..d59fb1a3 100644 --- a/test/gtc/gtc_quaternion.cpp +++ b/test/gtc/gtc_quaternion.cpp @@ -29,67 +29,12 @@ int test_quat_type() return 0; } -int test_quat_slerp() -{ - int Error = 0; - - glm::quat A(glm::vec3(0, 0, 1)); - glm::quat B(glm::vec3(0, 1, 0)); - glm::quat C = glm::mix(A, B, 0.5f); - glm::quat D(glm::normalize(glm::vec3(0, 1, 1))); - - Error += C == D ? 0 : 1; - - return Error; -} - -int test_quat_length() -{ - int Error = 0; - - float A = glm::length(glm::quat(45.0f, glm::vec3(0, 0, 1))); - Error += A == 1.0f ? 0 : 1; - float B = glm::length(glm::quat(90.0f, glm::vec3(0, 0, 2))); - Error += B == 2.0f ? 0 : 1; - - return Error; -} - -int test_quat_normalize() -{ - int Error = 0; - - { - glm::quat Q(45.0f, glm::vec3(0, 0, 1)); - glm::quat N = glm::normalize(Q); - float L = glm::length(N); - Error += L == 1.0f ? 0 : 1; - } - { - glm::quat Q(45.0f, glm::vec3(0, 0, 2)); - glm::quat N = glm::normalize(Q); - float L = glm::length(N); - Error += L == 1.0f ? 0 : 1; - } - { - glm::quat Q(45.0f, glm::vec3(1, 2, 3)); - glm::quat N = glm::normalize(Q); - float L = glm::length(N); - Error += L == 1.0f ? 0 : 1; - } - - return Error; -} - int main() { int Error = 0; Error += test_quat_precision(); Error += test_quat_type(); - Error += test_quat_slerp(); - Error += test_quat_length(); - Error += test_quat_normalize(); return Error; } diff --git a/test/gtx/CMakeLists.txt b/test/gtx/CMakeLists.txt index 48258987..38387f78 100644 --- a/test/gtx/CMakeLists.txt +++ b/test/gtx/CMakeLists.txt @@ -1,6 +1,7 @@ glmCreateTestGTC(gtx_bit) glmCreateTestGTC(gtx_noise) glmCreateTestGTC(gtx_quaternion) +glmCreateTestGTC(gtx_random) glmCreateTestGTC(gtx_rotate_vector) glmCreateTestGTC(gtx_simd_vec4) glmCreateTestGTC(gtx_simd_mat4) diff --git a/test/gtx/gtx_noise.cpp b/test/gtx/gtx_noise.cpp index 624ca022..8acaaaf4 100644 --- a/test/gtx/gtx_noise.cpp +++ b/test/gtx/gtx_noise.cpp @@ -11,17 +11,40 @@ #include #include -int main() +int test_simplex() { float ValueSNoise2D = glm::simplex(glm::vec2(0.5f)); float ValueSNoise3D = glm::simplex(glm::vec3(0.5f)); float ValueSNoise4D = glm::simplex(glm::vec4(0.5f)); + return 0; +} + +int test_perlin() +{ float ValueCNoise2D = glm::perlin(glm::vec2(0.5f)); float ValueCNoise3D = glm::perlin(glm::vec3(0.5f)); float ValueCNoise4D = glm::perlin(glm::vec4(0.5f)); + return 0; +} + +int test_perlin_pedioric() +{ float ValuePNoise2D = glm::perlin(glm::vec2(0.5f), glm::vec2(0.5f)); float ValuePNoise3D = glm::perlin(glm::vec3(0.5f), glm::vec3(0.5f)); float ValuePNoise4D = glm::perlin(glm::vec4(0.5f), glm::vec4(0.5f)); + + return 0; +} + +int main() +{ + int Error = 0; + + Error += test_simplex(); + Error += test_perlin(); + Error += test_perlin_pedioric(); + + return Error; } diff --git a/test/gtx/gtx_quaternion.cpp b/test/gtx/gtx_quaternion.cpp index 5fb5ebd2..287dc1df 100644 --- a/test/gtx/gtx_quaternion.cpp +++ b/test/gtx/gtx_quaternion.cpp @@ -11,6 +11,23 @@ #include #include +int test_quat_mix() +{ + int Error = 0; + + glm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1)); + glm::quat B = glm::angleAxis(90.0f, glm::vec3(0, 0, 1)); + glm::quat C = glm::mix(A, B, 0.5f); + glm::quat D = glm::angleAxis(45.0f, glm::vec3(0, 0, 1)); + + Error += glm::equalEpsilon(C.x, D.x, 0.01f) ? 0 : 1; + Error += glm::equalEpsilon(C.y, D.y, 0.01f) ? 0 : 1; + Error += glm::equalEpsilon(C.z, D.z, 0.01f) ? 0 : 1; + Error += glm::equalEpsilon(C.w, D.w, 0.01f) ? 0 : 1; + + return Error; +} + int test_quat_fastMix() { int Error = 0; @@ -94,14 +111,42 @@ int test_quat_angle() return Error; } +int test_quat_normalize() +{ + int Error = 0; + + { + glm::quat Q = glm::angleAxis(45.0f, glm::vec3(0, 0, 1)); + glm::quat N = glm::normalize(Q); + float L = glm::length(N); + Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1; + } + { + glm::quat Q = glm::angleAxis(45.0f, glm::vec3(0, 0, 2)); + glm::quat N = glm::normalize(Q); + float L = glm::length(N); + Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1; + } + { + glm::quat Q = glm::angleAxis(45.0f, glm::vec3(1, 2, 3)); + glm::quat N = glm::normalize(Q); + float L = glm::length(N); + Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1; + } + + return Error; +} + int main() { int Error = 0; Error += test_quat_angle(); Error += test_quat_angleAxis(); + Error += test_quat_mix(); Error += test_quat_fastMix(); Error += test_quat_shortMix(); + Error += test_quat_normalize(); return Error; } diff --git a/test/gtx/gtx_random.cpp b/test/gtx/gtx_random.cpp new file mode 100644 index 00000000..859faa52 --- /dev/null +++ b/test/gtx/gtx_random.cpp @@ -0,0 +1,98 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-05-31 +// Updated : 2011-05-31 +// Licence : This source is under MIT licence +// File : test/gtx/random.cpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +int test_signedRand1() +{ + int Error = 0; + + { + float ResultFloat = 0.0f; + double ResultDouble = 0.0f; + for(std::size_t i = 0; i < 100000; ++i) + { + ResultFloat += glm::signedRand1(); + ResultDouble += glm::signedRand1(); + } + + Error += glm::equalEpsilon(ResultFloat, 0.0f, 0.0001f); + Error += glm::equalEpsilon(ResultDouble, 0.0, 0.0001); + } + + return Error; +} + +int test_normalizedRand2() +{ + int Error = 0; + + { + std::size_t Max = 100000; + float ResultFloat = 0.0f; + double ResultDouble = 0.0f; + for(std::size_t i = 0; i < Max; ++i) + { + ResultFloat += glm::length(glm::normalizedRand2()); + ResultDouble += glm::length(glm::normalizedRand2()); + } + + Error += glm::equalEpsilon(ResultFloat, float(Max), 0.0001f); + Error += glm::equalEpsilon(ResultDouble, double(Max), 0.0001); + } + + return Error; +} + +int test_normalizedRand3() +{ + int Error = 0; + + { + std::size_t Max = 100000; + float ResultFloatA = 0.0f; + float ResultFloatB = 0.0f; + float ResultFloatC = 0.0f; + double ResultDoubleA = 0.0f; + double ResultDoubleB = 0.0f; + double ResultDoubleC = 0.0f; + for(std::size_t i = 0; i < Max; ++i) + { + ResultFloatA += glm::length(glm::normalizedRand3()); + ResultDoubleA += glm::length(glm::normalizedRand3()); + ResultFloatB += glm::length(glm::normalizedRand3(2.0f, 2.0f)); + ResultDoubleB += glm::length(glm::normalizedRand3(2.0, 2.0)); + ResultFloatC += glm::length(glm::normalizedRand3(1.0f, 3.0f)); + ResultDoubleC += glm::length(glm::normalizedRand3(1.0, 3.0)); + } + + Error += glm::equalEpsilon(ResultFloatA, float(Max), 0.0001f) ? 0 : 1; + Error += glm::equalEpsilon(ResultDoubleA, double(Max), 0.0001) ? 0 : 1; + Error += glm::equalEpsilon(ResultFloatB, float(Max * 2), 0.0001f) ? 0 : 1; + Error += glm::equalEpsilon(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1; + Error += (ResultFloatC >= float(Max) && ResultFloatC <= float(Max * 3)) ? 0 : 1; + Error += (ResultDoubleC >= double(Max) && ResultDoubleC <= double(Max * 3)) ? 0 : 1; + } + + return Error; +} + +int main() +{ + int Error = 0; + + Error += test_signedRand1(); + Error += test_normalizedRand2(); + Error += test_normalizedRand3(); + + return Error; +}