diff --git a/glm/core/func_vector_relational.hpp b/glm/core/func_vector_relational.hpp index 1b7d8094..3aee44c2 100644 --- a/glm/core/func_vector_relational.hpp +++ b/glm/core/func_vector_relational.hpp @@ -80,8 +80,8 @@ namespace glm //! /// @see - GLSL equal man page /// @see - GLSL 4.20.8 specification, section 8.7 - template class vecType> - GLM_FUNC_QUALIFIER typename vecType::bool_type equal(vecType const & x, vecType const & y); + //template class vecType> + //GLM_FUNC_QUALIFIER typename vecType::bool_type equal(vecType const & x, vecType const & y); //! Returns the component-wise comparison of result x != y. //! diff --git a/glm/gtc/random.hpp b/glm/gtc/random.hpp index a4569fcb..1896e1ed 100644 --- a/glm/gtc/random.hpp +++ b/glm/gtc/random.hpp @@ -56,49 +56,6 @@ namespace glm /// Generate a random number in the interval [-1, 1], according a linear distribution. /// From GLM_GTC_random extension. template T signedRand1(); - - template <> float signedRand1(); //!< \brief Generate a random number in the interval [-1, 1], according a linear distribution (From GLM_GTX_random extension) - template <> double signedRand1(); //!< \brief Generate a random number in the interval [-1, 1], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec2 signedRand2(); //!< \brief Generate 2 random numbers in the interval [-1, 1], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec3 signedRand3(); //!< \brief Generate 3 random numbers in the interval [-1, 1], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec4 signedRand4(); //!< \brief Generate 4 random numbers in the interval [-1, 1], according a linear distribution (From GLM_GTX_random extension) - - template detail::tvec2 normalizedRand2(); //!< \brief Generate a normalized 2D vector regulary distribute on a circle (From GLM_GTX_random extension) - template detail::tvec2 normalizedRand2(T Min, T Max); //!< \brief Generate a scaled and normalized 2D vector regulary distribute on a circle (From GLM_GTX_random extension) - template detail::tvec3 normalizedRand3(); //!< \brief Generate a normalized 3D vector regulary distribute on a sphere (From GLM_GTX_random extension) - template detail::tvec3 normalizedRand3(T Min, T Max); //!< \brief Generate a scaled and normalized 3D vector regulary distribute on a sphere (From GLM_GTX_random extension) - - template T compRand1(); //!< \brief Generate a random number in the interval [0, 1], according a linear distribution (From GLM_GTX_random extension) - template <> float compRand1(); //!< \brief Generate a random number in the interval [0, 1], according a linear distribution (From GLM_GTX_random extension) - template <> double compRand1(); //!< \brief Generate a random number in the interval [0, 1], according a linear distribution (From GLM_GTX_random extension) - template T compRand1(T Min, T Max); //!< \brief Generate a random number in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec2 compRand2(T Min, T Max); //!< \brief Generate 2 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec3 compRand3(T Min, T Max); //!< \brief Generate 3 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec4 compRand4(T Min, T Max); //!< \brief Generate 4 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec2 compRand2(const detail::tvec2& Min, const detail::tvec2& Max); //!< \brief Generate 2 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec3 compRand3(const detail::tvec3& Min, const detail::tvec3& Max); //!< \brief Generate 3 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - template detail::tvec3 compRand4(const detail::tvec4& Min, const detail::tvec4& Max); //!< \brief Generate 4 random numbers in the interval [Min, Max], according a linear distribution (From GLM_GTX_random extension) - - template detail::tvec2 vecRand2(); //!< \brief Generate a random normalized 2 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - template detail::tvec2 vecRand2(T MinRadius, T MaxRadius); //!< \brief Generate a random normalized 2 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - template detail::tvec3 vecRand3(); //!< \brief Generate a random normalized 3 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - template detail::tvec3 vecRand3(T MinRadius, T MaxRadius); //!< \brief Generate a random normalized 3 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - template detail::tvec4 vecRand4(); //!< \brief Generate a random normalized 4 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - template detail::tvec4 vecRand4(T MinRadius, T MaxRadius); //!< \brief Generate a random normalized 4 component vector. It's a spherical uniform distribution. (From GLM_GTX_random extension) - - template T gaussRand1(T mean, T std_deviation); //!< \brief Gererate a random floating number according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec2 gaussRand2(T mean, T std_deviation); //!< \brief Gererate 2 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec3 gaussRand3(T mean, T std_deviation); //!< \brief Gererate 3 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec4 gaussRand4(T mean, T std_deviation); //!< \brief Gererate 4 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec2 gaussRand2(const detail::tvec2& mean, T std_deviation); //!< \brief Gererate 2 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec3 gaussRand3(const detail::tvec3& mean, T std_deviation); //!< \brief Gererate 3 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec4 gaussRand4(const detail::tvec4& mean, T std_deviation); //!< \brief Gererate 4 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec2 gaussRand2(T mean, const detail::tvec2& std_deviation); //!< \brief Gererate 2 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec3 gaussRand3(T mean, const detail::tvec3& std_deviation); //!< \brief Gererate 3 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec4 gaussRand4(T mean, const detail::tvec4& std_deviation); //!< \brief Gererate 4 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec2 gaussRand2(const detail::tvec2& mean, const detail::tvec2& std_deviation); //!< \brief Gererate 2 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec3 gaussRand3(const detail::tvec3& mean, const detail::tvec3& std_deviation); //!< \brief Gererate 3 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) - template detail::tvec4 gaussRand4(const detail::tvec4& mean, const detail::tvec4& std_deviation); //!< \brief Gererate 4 random floating numbers according a Gauss distribution. (From GLM_GTX_random extension) /// @} }//namespace glm diff --git a/glm/gtc/random.inl b/glm/gtc/random.inl index fa29f793..68df87cc 100644 --- a/glm/gtc/random.inl +++ b/glm/gtc/random.inl @@ -12,521 +12,5 @@ namespace glm{ -template <> -GLM_FUNC_QUALIFIER float signedRand1() -{ - #if(GLM_COMPILER & GLM_COMPILER_VC)// && (GLM_COMPILER < GLM_COMPILER_VC2010) - #define RAND_SHIFT_NUM 5 - #else - #define RAND_SHIFT_NUM 0 - #endif - return float((std::rand() - (RAND_MAX >> 1) - 1) << 1) / float(RAND_MAX - RAND_SHIFT_NUM); -} - -template <> -GLM_FUNC_QUALIFIER double signedRand1() -{ - return double(signedRand1()); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 signedRand2() -{ - return detail::tvec2( - signedRand1(), - signedRand1()); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 signedRand3() -{ - return detail::tvec3( - signedRand1(), - signedRand1(), - signedRand1()); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 signedRand4() -{ - return detail::tvec4( - signedRand1(), - signedRand1(), - signedRand1(), - signedRand1()); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 normalizedRand2() -{ - T a = compRand1(T(0), T(6.283185307179586476925286766559f)); - return detail::tvec2(cos(a), sin(a)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 normalizedRand3() -{ - T z = compRand1(T(-1), T(1)); - T a = compRand1(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); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 normalizedRand3( - T Min, - T Max) -{ - return normalizedRand3() * compRand1(Min, Max); -} - -template <> -GLM_FUNC_QUALIFIER float compRand1() -{ - return float(std::rand()) / float(RAND_MAX); -} - -template <> -GLM_FUNC_QUALIFIER double compRand1() -{ - return double(std::rand()) / double(RAND_MAX); -} - -GLM_FUNC_QUALIFIER detail::thalf compRand1( - detail::thalf Min, - detail::thalf Max) -{ - return compRand1() * (Max - Min) + Min; -} - -GLM_FUNC_QUALIFIER float compRand1( - float Min, - float Max) -{ - return compRand1() * (Max - Min) + Min; -} - -GLM_FUNC_QUALIFIER double compRand1( - double Min, - double Max) -{ - return compRand1() * (Max - Min) + Min; -} - -template -GLM_FUNC_QUALIFIER T compRand1( - T Min, - T Max) -{ - return T(compRand1() * double(Max - Min) + double(Min)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 compRand2( - T Min, - T Max) -{ - return detail::tvec2( - compRand1(Min, Max), - compRand1(Min, Max)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 compRand3( - T Min, - T Max) -{ - return detail::tvec3( - compRand1(Min, Max), - compRand1(Min, Max), - compRand1(Min, Max)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 compRand4( - T Min, - T Max) -{ - return detail::tvec4( - compRand1(Min, Max), - compRand1(Min, Max), - compRand1(Min, Max), - compRand1(Min, Max)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 compRand2( - T Min, - const detail::tvec2& Max) -{ - return detail::tvec2( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 compRand3( - T Min, - const detail::tvec3& Max) -{ - return detail::tvec3( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 compRand4( - T Min, - const detail::tvec4& Max) -{ - return detail::tvec4( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z), - compRand1(Min.w, Max.w)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 compRand2( - const detail::tvec2& Min, - T Max) -{ - return detail::tvec2( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 compRand3( - const detail::tvec3& Min, - T Max) -{ - return detail::tvec3( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 compRand4( - const detail::tvec4& Min, - T Max) -{ - return detail::tvec4( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z), - compRand1(Min.w, Max.w)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 compRand2( - const detail::tvec2& Min, - const detail::tvec2& Max) -{ - return detail::tvec2( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 compRand3( - const detail::tvec3& Min, - const detail::tvec3& Max) -{ - return detail::tvec3( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 compRand4( - const detail::tvec4& Min, - const detail::tvec4& Max) -{ - return detail::tvec4( - compRand1(Min.x, Max.x), - compRand1(Min.y, Max.y), - compRand1(Min.z, Max.z), - compRand1(Min.w, Max.w)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 vecRand2() -{ - detail::tvec2 result(float(0)); - do - { - result = compRand2(float(-1), float(1)); - } while (length(result) > float(1)); - - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 vecRand2() -{ - detail::tvec2 result(double(0)); - do - { - result = compRand2(double(-1), double(1)); - } while (length(result) > double(1)); - - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 vecRand2( - T MinRadius, - T MaxRadius) -{ - assert(MinRadius <= MaxRadius); - - detail::tvec2 Result(T(0)); - T LenRadius(0); - - do - { - Result = compRand2(-MaxRadius, MaxRadius); - LenRadius = length(Result); - } - while(LenRadius > MaxRadius || LenRadius < MinRadius); - - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 vecRand3() -{ - detail::tvec3 Result(T(0)); - do - { - Result = compRand3(T(-1), T(1)); - } - while(length(Result) > T(1)); - - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 vecRand3( - T MinRadius, - T MaxRadius) -{ - assert(MinRadius <= MaxRadius); - - detail::tvec3 Result(0); - T LenRadius(0); - - do - { - Result = compRand3(-MaxRadius, MaxRadius); - LenRadius = length(Result); - } - while(LenRadius > MaxRadius || LenRadius < MinRadius); - - return Result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 vecRand4() -{ - detail::tvec4 result(float(0)); - do - { - result = compRand4(float(-1), float(1)); - } while (length(result) > float(1)); - - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 vecRand4() -{ - detail::tvec4 result(double(0)); - do - { - result = compRand4(double(-1), double(1)); - } while (length(result) > double(1)); - - return result; -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 vecRand4( - T MinRadius, - T MaxRadius) -{ - assert(MinRadius <= MaxRadius); - - detail::tvec4 Result(T(0)); - T LenRadius(T(0)); - - do - { - Result = compRand4(-MaxRadius, MaxRadius); - LenRadius = length(Result); - } - while(LenRadius > MaxRadius || LenRadius < MinRadius); - - return Result; -} - -template -GLM_FUNC_QUALIFIER T gaussRand1( - T mean, - T std_deviation) -{ - T w, x1, x2; - - do - { - x1 = compRand1(T(-1), T(1)); - x2 = compRand1(T(-1), T(1)); - - w = x1 * x1 + x2 * x2; - } while(w > T(1)); - - return x2 * std_deviation * std_deviation * sqrt((T(-2) * log(w)) / w) + mean; -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 gaussRand2( - T mean, - T std_deviation) -{ - return detail::tvec2( - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 gaussRand3( - T mean, - T std_deviation) -{ - return detail::tvec3( - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 gaussRand4( - T mean, - T std_deviation) -{ - return detail::tvec4( - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation), - gaussRand1(mean, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 gaussRand2( - T mean, - const detail::tvec2& std_deviation) -{ - return detail::tvec2( - gaussRand1(mean, std_deviation.x), - gaussRand1(mean, std_deviation.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 gaussRand3( - T mean, - const detail::tvec3& std_deviation) -{ - return detail::tvec3( - gaussRand1(mean, std_deviation.x), - gaussRand1(mean, std_deviation.y), - gaussRand1(mean, std_deviation.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 gaussRand4( - T mean, - const detail::tvec4& std_deviation) -{ - return detail::tvec4( - gaussRand1(mean, std_deviation.x), - gaussRand1(mean, std_deviation.y), - gaussRand1(mean, std_deviation.z), - gaussRand1(mean, std_deviation.w)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 gaussRand2( - const detail::tvec2& mean, - T std_deviation) -{ - return detail::tvec2( - gaussRand1(mean.x, std_deviation), - gaussRand1(mean.y, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 gaussRand3( - const detail::tvec3& mean, - T std_deviation) -{ - return detail::tvec3( - gaussRand1(mean.x, std_deviation), - gaussRand1(mean.y, std_deviation), - gaussRand1(mean.z, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 gaussRand4( - const detail::tvec4& mean, - T std_deviation) -{ - return detail::tvec4( - gaussRand1(mean.x, std_deviation), - gaussRand1(mean.y, std_deviation), - gaussRand1(mean.z, std_deviation), - gaussRand1(mean.w, std_deviation)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec2 gaussRand2( - const detail::tvec2& mean, - const detail::tvec2& std_deviation) -{ - return detail::tvec2( - gaussRand1(mean.x, std_deviation.x), - gaussRand1(mean.y, std_deviation.y)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec3 gaussRand3( - const detail::tvec3& mean, - const detail::tvec3& std_deviation) -{ - return detail::tvec3( - gaussRand1(mean.x, std_deviation.x), - gaussRand1(mean.y, std_deviation.y), - gaussRand1(mean.z, std_deviation.z)); -} - -template -GLM_FUNC_QUALIFIER detail::tvec4 gaussRand4( - const detail::tvec4& mean, - const detail::tvec4& std_deviation) -{ - return detail::tvec4( - gaussRand1(mean.x, std_deviation.x), - gaussRand1(mean.y, std_deviation.y), - gaussRand1(mean.z, std_deviation.z), - gaussRand1(mean.w, std_deviation.w)); -} }//namespace glm diff --git a/glm/gtx/random.inl b/glm/gtx/random.inl index 571fea56..5e7e005a 100644 --- a/glm/gtx/random.inl +++ b/glm/gtx/random.inl @@ -56,11 +56,34 @@ GLM_FUNC_QUALIFIER detail::tvec4 signedRand4() signedRand1()); } +template +GLM_FUNC_QUALIFIER detail::tvec2 normalizedRand2( + T Min, + T Max) +{ + return normalizedRand2() * compRand1(Min, Max); +} + template GLM_FUNC_QUALIFIER detail::tvec2 normalizedRand2() { - T a = compRand1(T(0), T(6.283185307179586476925286766559f)); - return detail::tvec2(cos(a), sin(a)); + T z = compRand1(T(-1), T(1)); + T a = compRand1(T(0), T(6.283185307179586476925286766559f)); + + T r = sqrt(T(1) - z * z); + + T x = r * cos(a); + T y = r * sin(a); + + return detail::tvec2(x, y); +} + +template +GLM_FUNC_QUALIFIER detail::tvec3 normalizedRand3( + T Min, + T Max) +{ + return normalizedRand3() * compRand1(Min, Max); } template diff --git a/test/gtc/gtc_random.cpp b/test/gtc/gtc_random.cpp index d656b18d..9d9b33b4 100644 --- a/test/gtc/gtc_random.cpp +++ b/test/gtc/gtc_random.cpp @@ -8,7 +8,7 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// #include -#include +#include #include #include @@ -21,8 +21,8 @@ int test_signedRand1() double ResultDouble = 0.0f; for(std::size_t i = 0; i < 100000; ++i) { - ResultFloat += glm::signedRand1(-1.0f, 1.0f); - ResultDouble += glm::signedRand1(-1.0, 1.0); + ResultFloat += glm::signedRand1(/*-1.0f, 1.0f*/); + ResultDouble += glm::signedRand1(/*-1.0, 1.0*/); } Error += glm::equalEpsilon(ResultFloat, 0.0f, 0.0001f);