|
|
@@ -81,16 +81,105 @@ GLM_FUNC_QUALIFIER detail::tvec4<T> linearRand
|
|
|
linearRand(Min.w, Max.w));
|
|
|
}
|
|
|
|
|
|
-template <>
|
|
|
-half gaussRand
|
|
|
+template <typename genType>
|
|
|
+GLM_FUNC_QUALIFIER genType gaussRand
|
|
|
(
|
|
|
- half const & Mean,
|
|
|
- half const & Deviation
|
|
|
+ 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>
|
|
|
-detail::tvec2<T> circularRand
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
|
|
|
(
|
|
|
T const & Radius
|
|
|
)
|
|
|
@@ -100,7 +189,7 @@ detail::tvec2<T> circularRand
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
-detail::tvec3<T> sphericalRand
|
|
|
+GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
|
|
|
(
|
|
|
T const & Radius
|
|
|
)
|