|
@@ -12,5 +12,197 @@
|
|
|
|
|
|
|
|
namespace glm{
|
|
namespace glm{
|
|
|
|
|
|
|
|
|
|
+template <>
|
|
|
|
|
+GLM_FUNC_QUALIFIER glm::half linearRand
|
|
|
|
|
+(
|
|
|
|
|
+ glm::half const & Min,
|
|
|
|
|
+ glm::half const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ 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 <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec2<T> linearRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec2<T> const & Min,
|
|
|
|
|
+ detail::tvec2<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec2<T>(
|
|
|
|
|
+ linearRand(Min.x, Max.x),
|
|
|
|
|
+ linearRand(Min.y, Max.y));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> linearRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec3<T> const & Min,
|
|
|
|
|
+ detail::tvec3<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec3<T>(
|
|
|
|
|
+ linearRand(Min.x, Max.x),
|
|
|
|
|
+ linearRand(Min.y, Max.y),
|
|
|
|
|
+ linearRand(Min.z, Max.z));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec4<T> linearRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec4<T> const & Min,
|
|
|
|
|
+ detail::tvec4<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec4<T>(
|
|
|
|
|
+ linearRand(Min.x, Max.x),
|
|
|
|
|
+ linearRand(Min.y, Max.y),
|
|
|
|
|
+ linearRand(Min.z, Max.z),
|
|
|
|
|
+ linearRand(Min.w, Max.w));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename genType>
|
|
|
|
|
+GLM_FUNC_QUALIFIER genType gaussRand
|
|
|
|
|
+(
|
|
|
|
|
+ genType const & Mean,
|
|
|
|
|
+ genType const & Deviation
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ genType w, x1, x2;
|
|
|
|
|
+
|
|
|
|
|
+ do
|
|
|
|
|
+ {
|
|
|
|
|
+ x1 = compRand1(genType(-1), genType(1));
|
|
|
|
|
+ x2 = compRand1(genType(-1), genType(1));
|
|
|
|
|
+
|
|
|
|
|
+ w = x1 * x1 + x2 * x2;
|
|
|
|
|
+ } while(w > genType(1));
|
|
|
|
|
+
|
|
|
|
|
+ return x2 * std_deviation * std_deviation * sqrt((genType(-2) * log(w)) / w) + mean;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec2<T> gaussRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec2<T> const & Min,
|
|
|
|
|
+ detail::tvec2<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec2<T>(
|
|
|
|
|
+ gaussRand(Min.x, Max.x),
|
|
|
|
|
+ gaussRand(Min.y, Max.y));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> gaussRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec3<T> const & Min,
|
|
|
|
|
+ detail::tvec3<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec3<T>(
|
|
|
|
|
+ gaussRand(Min.x, Max.x),
|
|
|
|
|
+ gaussRand(Min.y, Max.y),
|
|
|
|
|
+ gaussRand(Min.z, Max.z));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec4<T> gaussRand
|
|
|
|
|
+(
|
|
|
|
|
+ detail::tvec4<T> const & Min,
|
|
|
|
|
+ detail::tvec4<T> const & Max
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ return detail::tvec4<T>(
|
|
|
|
|
+ gaussRand(Min.x, Max.x),
|
|
|
|
|
+ gaussRand(Min.y, Max.y),
|
|
|
|
|
+ gaussRand(Min.z, Max.z),
|
|
|
|
|
+ gaussRand(Min.w, Max.w));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> diskRand
|
|
|
|
|
+(
|
|
|
|
|
+ T const & Radius
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ detail::tvec2<T> Result(T(0));
|
|
|
|
|
+ T LenRadius(T(0));
|
|
|
|
|
+
|
|
|
|
|
+ do
|
|
|
|
|
+ {
|
|
|
|
|
+ Result = compRand2(-Radius, Radius);
|
|
|
|
|
+ LenRadius = length(Result);
|
|
|
|
|
+ }
|
|
|
|
|
+ while(LenRadius > Radius);
|
|
|
|
|
+
|
|
|
|
|
+ return Result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand
|
|
|
|
|
+(
|
|
|
|
|
+ T const & Radius
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ detail::tvec3<T> Result(T(0));
|
|
|
|
|
+ T LenRadius(T(0));
|
|
|
|
|
+
|
|
|
|
|
+ do
|
|
|
|
|
+ {
|
|
|
|
|
+ Result = compRand3(-Radius, Radius);
|
|
|
|
|
+ LenRadius = length(Result);
|
|
|
|
|
+ }
|
|
|
|
|
+ while(LenRadius > Radius);
|
|
|
|
|
+
|
|
|
|
|
+ return Result;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
|
|
|
|
|
+(
|
|
|
|
|
+ T const & Radius
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ T a = compRand1<T>(T(0), T(6.283185307179586476925286766559f));
|
|
|
|
|
+ return detail::tvec2<T>(cos(a), sin(a)) * Radius;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+template <typename T>
|
|
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
|
|
|
|
|
+(
|
|
|
|
|
+ T const & Radius
|
|
|
|
|
+)
|
|
|
|
|
+{
|
|
|
|
|
+ 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<T>(x, y, z) * Radius;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
}//namespace glm
|
|
}//namespace glm
|