From 6eba3a9db905493aa1844e676830f346f2ac42d8 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Fri, 14 Oct 2011 12:41:45 +0100 Subject: [PATCH] Added more vectorize functions --- glm/core/_vectorize.hpp | 51 ++- glm/core/func_exponential.inl | 2 + glm/core/func_geometric.inl | 2 + glm/core/func_integer.inl | 1 + glm/core/func_matrix.inl | 2 + glm/core/func_trigonometric.inl | 548 ++------------------------------ glm/gtc/random.inl | 318 ++++++++---------- 7 files changed, 189 insertions(+), 735 deletions(-) diff --git a/glm/core/_vectorize.hpp b/glm/core/_vectorize.hpp index 31cf3341..24140dd3 100644 --- a/glm/core/_vectorize.hpp +++ b/glm/core/_vectorize.hpp @@ -26,7 +26,7 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// -#define VECTORIZE_VEC(func) \ +#define VECTORIZE2_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec2 func( \ detail::tvec2 const & v) \ @@ -34,8 +34,9 @@ return detail::tvec2( \ func(v.x), \ func(v.y)); \ - } \ - \ + } + +#define VECTORIZE3_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec3 func( \ detail::tvec3 const & v) \ @@ -44,8 +45,9 @@ func(v.x), \ func(v.y), \ func(v.z)); \ - } \ - \ + } + +#define VECTORIZE4_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec4 func( \ detail::tvec4 const & v) \ @@ -57,7 +59,12 @@ func(v.w)); \ } -#define VECTORIZE_VEC_SCA(func) \ +#define VECTORIZE_VEC(func) \ + VECTORIZE2_VEC(func) \ + VECTORIZE3_VEC(func) \ + VECTORIZE4_VEC(func) + +#define VECTORIZE2_VEC_SCA(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec2 func \ ( \ @@ -68,8 +75,9 @@ return detail::tvec2( \ func(x.x, y), \ func(x.y, y)); \ - } \ - \ + } + +#define VECTORIZE3_VEC_SCA(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec3 func \ ( \ @@ -81,8 +89,9 @@ func(x.x, y), \ func(x.y, y), \ func(x.z, y)); \ - } \ - \ + } + +#define VECTORIZE4_VEC_SCA(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec4 func \ ( \ @@ -97,7 +106,12 @@ func(x.w, y)); \ } -#define VECTORIZE_VEC_VEC(func) \ +#define VECTORIZE_VEC_SCA(func) \ + VECTORIZE2_VEC_SCA(func) \ + VECTORIZE3_VEC_SCA(func) \ + VECTORIZE4_VEC_SCA(func) + +#define VECTORIZE2_VEC_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec2 func \ ( \ @@ -108,8 +122,9 @@ return detail::tvec2( \ func(x.x, y.x), \ func(x.y, y.y)); \ - } \ - \ + } + +#define VECTORIZE3_VEC_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec3 func \ ( \ @@ -121,8 +136,9 @@ func(x.x, y.x), \ func(x.y, y.y), \ func(x.z, y.z)); \ - } \ - \ + } + +#define VECTORIZE4_VEC_VEC(func) \ template \ GLM_FUNC_QUALIFIER detail::tvec4 func \ ( \ @@ -136,3 +152,8 @@ func(x.z, y.z), \ func(x.w, y.w)); \ } + +#define VECTORIZE_VEC_VEC(func) \ + VECTORIZE2_VEC_VEC(func) \ + VECTORIZE3_VEC_VEC(func) \ + VECTORIZE4_VEC_VEC(func) diff --git a/glm/core/func_exponential.inl b/glm/core/func_exponential.inl index b214ecef..c57852c1 100644 --- a/glm/core/func_exponential.inl +++ b/glm/core/func_exponential.inl @@ -26,6 +26,8 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#include "_vectorize.hpp" + namespace glm { // pow diff --git a/glm/core/func_geometric.inl b/glm/core/func_geometric.inl index f83b590c..410de1e8 100644 --- a/glm/core/func_geometric.inl +++ b/glm/core/func_geometric.inl @@ -26,6 +26,8 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#include "_vectorize.hpp" + namespace glm { // length diff --git a/glm/core/func_integer.inl b/glm/core/func_integer.inl index 681bbabf..cbbad8f3 100644 --- a/glm/core/func_integer.inl +++ b/glm/core/func_integer.inl @@ -26,6 +26,7 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#include "_vectorize.hpp" #if(GLM_COMPILER & GLM_COMPILER_VC) #include #pragma intrinsic(_BitScanReverse) diff --git a/glm/core/func_matrix.inl b/glm/core/func_matrix.inl index 07bf8e2b..3b6d0418 100644 --- a/glm/core/func_matrix.inl +++ b/glm/core/func_matrix.inl @@ -26,6 +26,8 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#include "_vectorize.hpp" + namespace glm { // matrixCompMult diff --git a/glm/core/func_trigonometric.inl b/glm/core/func_trigonometric.inl index 76809916..b77ceb95 100644 --- a/glm/core/func_trigonometric.inl +++ b/glm/core/func_trigonometric.inl @@ -26,6 +26,8 @@ /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// +#include "_vectorize.hpp" + namespace glm { // radians @@ -37,46 +39,12 @@ namespace glm { GLM_STATIC_ASSERT(detail::type::is_float, "'radians' only accept floating-point input"); - const genType pi = genType(3.1415926535897932384626433832795); + genType const pi = genType(3.1415926535897932384626433832795); return degrees * (pi / genType(180)); } - template - GLM_FUNC_QUALIFIER detail::tvec2 radians - ( - detail::tvec2 const & degrees - ) - { - return detail::tvec2( - radians(degrees.x), - radians(degrees.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 radians - ( - detail::tvec3 const & degrees - ) - { - return detail::tvec3( - radians(degrees.x), - radians(degrees.y), - radians(degrees.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 radians - ( - detail::tvec4 const & degrees - ) - { - return detail::tvec4( - radians(degrees.x), - radians(degrees.y), - radians(degrees.z), - radians(degrees.w)); - } - + VECTORIZE_VEC(radians) + // degrees template GLM_FUNC_QUALIFIER genType degrees @@ -90,41 +58,7 @@ namespace glm return radians * (genType(180) / pi); } - template - GLM_FUNC_QUALIFIER detail::tvec2 degrees - ( - detail::tvec2 const & radians - ) - { - return detail::tvec2( - degrees(radians.x), - degrees(radians.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 degrees - ( - detail::tvec3 const & radians - ) - { - return detail::tvec3( - degrees(radians.x), - degrees(radians.y), - degrees(radians.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 degrees - ( - detail::tvec4 const & radians - ) - { - return detail::tvec4( - degrees(radians.x), - degrees(radians.y), - degrees(radians.z), - degrees(radians.w)); - } + VECTORIZE_VEC(degrees) // sin template @@ -138,41 +72,7 @@ namespace glm return ::std::sin(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 sin - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - sin(angle.x), - sin(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 sin - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - sin(angle.x), - sin(angle.y), - sin(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 sin - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - sin(angle.x), - sin(angle.y), - sin(angle.z), - sin(angle.w)); - } + VECTORIZE_VEC(sin) // cos template @@ -183,41 +83,7 @@ namespace glm return ::std::cos(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 cos - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - cos(angle.x), - cos(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 cos - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - cos(angle.x), - cos(angle.y), - cos(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 cos - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - cos(angle.x), - cos(angle.y), - cos(angle.z), - cos(angle.w)); - } + VECTORIZE_VEC(cos) // tan template @@ -231,41 +97,7 @@ namespace glm return ::std::tan(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 tan - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - tan(angle.x), - tan(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 tan - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - tan(angle.x), - tan(angle.y), - tan(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 tan - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - tan(angle.x), - tan(angle.y), - tan(angle.z), - tan(angle.w)); - } + VECTORIZE_VEC(tan) // asin template @@ -279,41 +111,7 @@ namespace glm return ::std::asin(x); } - template - GLM_FUNC_QUALIFIER detail::tvec2 asin - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - asin(x.x), - asin(x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 asin - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - asin(x.x), - asin(x.y), - asin(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 asin - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - asin(x.x), - asin(x.y), - asin(x.z), - asin(x.w)); - } + VECTORIZE_VEC(asin) // acos template @@ -327,41 +125,7 @@ namespace glm return ::std::acos(x); } - template - GLM_FUNC_QUALIFIER detail::tvec2 acos - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - acos(x.x), - acos(x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 acos - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - acos(x.x), - acos(x.y), - acos(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 acos - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - acos(x.x), - acos(x.y), - acos(x.z), - acos(x.w)); - } + VECTORIZE_VEC(acos) // atan template @@ -376,44 +140,7 @@ namespace glm return ::std::atan2(y, x); } - template - GLM_FUNC_QUALIFIER detail::tvec2 atan - ( - detail::tvec2 const & y, - detail::tvec2 const & x - ) - { - return detail::tvec2( - atan(y.x, x.x), - atan(y.y, x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 atan - ( - detail::tvec3 const & y, - detail::tvec3 const & x - ) - { - return detail::tvec3( - atan(y.x, x.x), - atan(y.y, x.y), - atan(y.z, x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 atan - ( - detail::tvec4 const & y, - detail::tvec4 const & x - ) - { - return detail::tvec4( - atan(y.x, x.x), - atan(y.y, x.y), - atan(y.z, x.z), - atan(y.w, x.w)); - } + VECTORIZE_VEC_VEC(atan) template GLM_FUNC_QUALIFIER genType atan @@ -426,41 +153,7 @@ namespace glm return ::std::atan(x); } - template - GLM_FUNC_QUALIFIER detail::tvec2 atan - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - atan(x.x), - atan(x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 atan - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - atan(x.x), - atan(x.y), - atan(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 atan - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - atan(x.x), - atan(x.y), - atan(x.z), - atan(x.w)); - } + VECTORIZE_VEC(atan) // sinh template @@ -474,41 +167,7 @@ namespace glm return std::sinh(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 sinh - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - sinh(angle.x), - sinh(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 sinh - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - sinh(angle.x), - sinh(angle.y), - sinh(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 sinh - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - sinh(angle.x), - sinh(angle.y), - sinh(angle.z), - sinh(angle.w)); - } + VECTORIZE_VEC(sinh) // cosh template @@ -522,41 +181,7 @@ namespace glm return std::cosh(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 cosh - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - cosh(angle.x), - cosh(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 cosh - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - cosh(angle.x), - cosh(angle.y), - cosh(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 cosh - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - cosh(angle.x), - cosh(angle.y), - cosh(angle.z), - cosh(angle.w)); - } + VECTORIZE_VEC(cosh) // tanh template @@ -570,41 +195,7 @@ namespace glm return std::tanh(angle); } - template - GLM_FUNC_QUALIFIER detail::tvec2 tanh - ( - detail::tvec2 const & angle - ) - { - return detail::tvec2( - tanh(angle.x), - tanh(angle.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 tanh - ( - detail::tvec3 const & angle - ) - { - return detail::tvec3( - tanh(angle.x), - tanh(angle.y), - tanh(angle.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 tanh - ( - detail::tvec4 const & angle - ) - { - return detail::tvec4( - tanh(angle.x), - tanh(angle.y), - tanh(angle.z), - tanh(angle.w)); - } + VECTORIZE_VEC(tanh) // asinh template @@ -618,41 +209,7 @@ namespace glm return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x)); } - template - GLM_FUNC_QUALIFIER detail::tvec2 asinh - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - asinh(x.x), - asinh(x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 asinh - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - asinh(x.x), - asinh(x.y), - asinh(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 asinh - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - asinh(x.x), - asinh(x.y), - asinh(x.z), - asinh(x.w)); - } + VECTORIZE_VEC(asinh) // acosh template @@ -668,41 +225,7 @@ namespace glm return log(x + sqrt(x * x - genType(1))); } - template - GLM_FUNC_QUALIFIER detail::tvec2 acosh - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - acosh(x.x), - acosh(x.y)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec3 acosh - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - acosh(x.x), - acosh(x.y), - acosh(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 acosh - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - acosh(x.x), - acosh(x.y), - acosh(x.z), - acosh(x.w)); - } + VECTORIZE_VEC(acosh) // atanh template @@ -718,39 +241,6 @@ namespace glm return genType(0.5) * log((genType(1) + x) / (genType(1) - x)); } - template - GLM_FUNC_QUALIFIER detail::tvec2 atanh - ( - detail::tvec2 const & x - ) - { - return detail::tvec2( - atanh(x.x), - atanh(x.y)); - } + VECTORIZE_VEC(atanh) - template - GLM_FUNC_QUALIFIER detail::tvec3 atanh - ( - detail::tvec3 const & x - ) - { - return detail::tvec3( - atanh(x.x), - atanh(x.y), - atanh(x.z)); - } - - template - GLM_FUNC_QUALIFIER detail::tvec4 atanh - ( - detail::tvec4 const & x - ) - { - return detail::tvec4( - atanh(x.x), - atanh(x.y), - atanh(x.z), - atanh(x.w)); - } }//namespace glm diff --git a/glm/gtc/random.inl b/glm/gtc/random.inl index 0d9f4e60..98176043 100644 --- a/glm/gtc/random.inl +++ b/glm/gtc/random.inl @@ -9,200 +9,136 @@ #include #include +#include "../core/_vectorize.hpp" namespace glm{ - -template <> -GLM_FUNC_QUALIFIER glm::half linearRand -( - glm::half const & Min, - glm::half const & Max -) +namespace detail { - return glm::half(float(std::rand()) / float(RAND_MAX) * (float(Max) - float(Min)) + float(Min)); -} - -template <> -GLM_FUNC_QUALIFIER float linearRand -( - float const & Min, - float const & Max -) -{ - return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min; -} - -template <> -GLM_FUNC_QUALIFIER double linearRand -( - double const & Min, - double const & Max -) -{ - return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 linearRand -( - detail::tvec2 const & Min, - detail::tvec2 const & Max -) -{ - return detail::tvec2( - linearRand(Min.x, Max.x), - linearRand(Min.y, Max.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 linearRand -( - detail::tvec3 const & Min, - detail::tvec3 const & Max -) -{ - return detail::tvec3( - linearRand(Min.x, Max.x), - linearRand(Min.y, Max.y), - linearRand(Min.z, Max.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 linearRand -( - detail::tvec4 const & Min, - detail::tvec4 const & Max -) -{ - return detail::tvec4( - linearRand(Min.x, Max.x), - linearRand(Min.y, Max.y), - linearRand(Min.z, Max.z), - linearRand(Min.w, Max.w)); -} - -template -GLM_FUNC_QUALIFIER genType gaussRand -( - genType const & Mean, - genType const & Deviation -) -{ - genType w, x1, x2; - - do - { - x1 = linearRand(genType(-1), genType(1)); - x2 = linearRand(genType(-1), genType(1)); - - w = x1 * x1 + x2 * x2; - } while(w > genType(1)); - - return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 gaussRand -( - detail::tvec2 const & Mean, - detail::tvec2 const & Deviation -) -{ - return detail::tvec2( - gaussRand(Mean.x, Deviation.x), - gaussRand(Mean.y, Deviation.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 gaussRand -( - detail::tvec3 const & Mean, - detail::tvec3 const & Deviation -) -{ - return detail::tvec3( - gaussRand(Mean.x, Deviation.x), - gaussRand(Mean.y, Deviation.y), - gaussRand(Mean.z, Deviation.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 gaussRand -( - detail::tvec4 const & Mean, - detail::tvec4 const & Deviation -) -{ - return detail::tvec4( - gaussRand(Mean.x, Deviation.x), - gaussRand(Mean.y, Deviation.y), - gaussRand(Mean.z, Deviation.z), - gaussRand(Mean.w, Deviation.w)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 diskRand -( - T const & Radius -) -{ - detail::tvec2 Result(T(0)); - T LenRadius(T(0)); - - do + struct compute_linearRand { - Result = linearRand(detail::tvec2(-Radius), detail::tvec2(Radius)); - LenRadius = length(Result); - } - while(LenRadius > Radius); - - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 ballRand -( - T const & Radius -) -{ - detail::tvec3 Result(T(0)); - T LenRadius(T(0)); - - do - { - Result = linearRand(detail::tvec3(-Radius), detail::tvec3(Radius)); - LenRadius = length(Result); - } - while(LenRadius > Radius); - - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 circularRand -( - T const & Radius -) -{ - T a = linearRand(T(0), T(6.283185307179586476925286766559f)); - return detail::tvec2(cos(a), sin(a)) * Radius; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 sphericalRand -( - T const & Radius -) -{ - T z = linearRand(T(-1), T(1)); - T a = linearRand(T(0), T(6.283185307179586476925286766559f)); - - T r = sqrt(T(1) - z * z); - - T x = r * cos(a); - T y = r * sin(a); - - return detail::tvec3(x, y, z) * Radius; -} + template + GLM_FUNC_QUALIFIER T operator() (T const & Min, T const & Max) const + { + GLM_STATIC_ASSERT(0, "'linearRand' invalid template parameter type. GLM_GTC_random only supports floating-point template types."); + return Min; + } + }; + template <> + GLM_FUNC_QUALIFIER half compute_linearRand::operator() (half const & Min, half const & Max) const + { + return half(float(std::rand()) / float(RAND_MAX) * (float(Max) - float(Min)) + float(Min)); + } + + template <> + GLM_FUNC_QUALIFIER float compute_linearRand::operator() (float const & Min, float const & Max) const + { + return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min; + } + + template <> + GLM_FUNC_QUALIFIER double compute_linearRand::operator() (double const & Min, double const & Max) const + { + return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min; + } +}//namespace detail + + template + GLM_FUNC_QUALIFIER genType linearRand + ( + genType const & Min, + genType const & Max + ) + { + return detail::compute_linearRand()(Min, Max); + } + + VECTORIZE_VEC_VEC(linearRand) + + template + GLM_FUNC_QUALIFIER genType gaussRand + ( + genType const & Mean, + genType const & Deviation + ) + { + genType w, x1, x2; + + do + { + x1 = linearRand(genType(-1), genType(1)); + x2 = linearRand(genType(-1), genType(1)); + + w = x1 * x1 + x2 * x2; + } while(w > genType(1)); + + return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean; + } + + VECTORIZE_VEC_VEC(gaussRand) + + template + GLM_FUNC_QUALIFIER detail::tvec2 diskRand + ( + T const & Radius + ) + { + detail::tvec2 Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand(detail::tvec2(-Radius), detail::tvec2(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 ballRand + ( + T const & Radius + ) + { + detail::tvec3 Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand(detail::tvec3(-Radius), detail::tvec3(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template + GLM_FUNC_QUALIFIER detail::tvec2 circularRand + ( + T const & Radius + ) + { + T a = linearRand(T(0), T(6.283185307179586476925286766559f)); + return detail::tvec2(cos(a), sin(a)) * Radius; + } + + template + GLM_FUNC_QUALIFIER detail::tvec3 sphericalRand + ( + T const & Radius + ) + { + T z = linearRand(T(-1), T(1)); + T a = linearRand(T(0), T(6.283185307179586476925286766559f)); + + T r = sqrt(T(1) - z * z); + + T x = r * cos(a); + T y = r * sin(a); + + return detail::tvec3(x, y, z) * Radius; + } }//namespace glm