Merge branch '0.9.3' of ssh://ogl-math.git.sourceforge.net/gitroot/ogl-math/ogl-math into 0.9.3

This commit is contained in:
Christophe Riccio 2011-09-25 17:09:09 +01:00
commit 8ab9477e7f
7 changed files with 365 additions and 80 deletions

View File

@ -92,56 +92,56 @@ GLM_FUNC_QUALIFIER genType gaussRand
do do
{ {
x1 = compRand1(genType(-1), genType(1)); x1 = linearRand(genType(-1), genType(1));
x2 = compRand1(genType(-1), genType(1)); x2 = linearRand(genType(-1), genType(1));
w = x1 * x1 + x2 * x2; w = x1 * x1 + x2 * x2;
} while(w > genType(1)); } while(w > genType(1));
return x2 * std_deviation * std_deviation * sqrt((genType(-2) * log(w)) / w) + mean; return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean;
} }
template <typename T> template <typename T>
GLM_FUNC_QUALIFIER detail::tvec2<T> gaussRand GLM_FUNC_QUALIFIER detail::tvec2<T> gaussRand
( (
detail::tvec2<T> const & Min, detail::tvec2<T> const & Mean,
detail::tvec2<T> const & Max detail::tvec2<T> const & Deviation
) )
{ {
return detail::tvec2<T>( return detail::tvec2<T>(
gaussRand(Min.x, Max.x), gaussRand(Mean.x, Deviation.x),
gaussRand(Min.y, Max.y)); gaussRand(Mean.y, Deviation.y));
} }
template <typename T> template <typename T>
GLM_FUNC_QUALIFIER detail::tvec3<T> gaussRand GLM_FUNC_QUALIFIER detail::tvec3<T> gaussRand
( (
detail::tvec3<T> const & Min, detail::tvec3<T> const & Mean,
detail::tvec3<T> const & Max detail::tvec3<T> const & Deviation
) )
{ {
return detail::tvec3<T>( return detail::tvec3<T>(
gaussRand(Min.x, Max.x), gaussRand(Mean.x, Deviation.x),
gaussRand(Min.y, Max.y), gaussRand(Mean.y, Deviation.y),
gaussRand(Min.z, Max.z)); gaussRand(Mean.z, Deviation.z));
} }
template <typename T> template <typename T>
GLM_FUNC_QUALIFIER detail::tvec4<T> gaussRand GLM_FUNC_QUALIFIER detail::tvec4<T> gaussRand
( (
detail::tvec4<T> const & Min, detail::tvec4<T> const & Mean,
detail::tvec4<T> const & Max detail::tvec4<T> const & Deviation
) )
{ {
return detail::tvec4<T>( return detail::tvec4<T>(
gaussRand(Min.x, Max.x), gaussRand(Mean.x, Deviation.x),
gaussRand(Min.y, Max.y), gaussRand(Mean.y, Deviation.y),
gaussRand(Min.z, Max.z), gaussRand(Mean.z, Deviation.z),
gaussRand(Min.w, Max.w)); gaussRand(Mean.w, Deviation.w));
} }
template <typename T> template <typename T>
GLM_FUNC_QUALIFIER detail::tvec3<T> diskRand GLM_FUNC_QUALIFIER detail::tvec2<T> diskRand
( (
T const & Radius T const & Radius
) )
@ -151,7 +151,7 @@ GLM_FUNC_QUALIFIER detail::tvec3<T> diskRand
do do
{ {
Result = compRand2(-Radius, Radius); Result = linearRand(detail::tvec2<T>(-Radius), detail::tvec2<T>(Radius));
LenRadius = length(Result); LenRadius = length(Result);
} }
while(LenRadius > Radius); while(LenRadius > Radius);
@ -170,7 +170,7 @@ GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand
do do
{ {
Result = compRand3(-Radius, Radius); Result = linearRand(detail::tvec3<T>(-Radius), detail::tvec3<T>(Radius));
LenRadius = length(Result); LenRadius = length(Result);
} }
while(LenRadius > Radius); while(LenRadius > Radius);
@ -184,7 +184,7 @@ GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
T const & Radius T const & Radius
) )
{ {
T a = compRand1<T>(T(0), T(6.283185307179586476925286766559f)); T a = linearRand(T(0), T(6.283185307179586476925286766559f));
return detail::tvec2<T>(cos(a), sin(a)) * Radius; return detail::tvec2<T>(cos(a), sin(a)) * Radius;
} }
@ -194,8 +194,8 @@ GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
T const & Radius T const & Radius
) )
{ {
T z = compRand1(T(-1), T(1)); T z = linearRand(T(-1), T(1));
T a = compRand1(T(0), T(6.283185307179586476925286766559f)); T a = linearRand(T(0), T(6.283185307179586476925286766559f));
T r = sqrt(T(1) - z * z); T r = sqrt(T(1) - z * z);

View File

@ -695,52 +695,52 @@ GLM_FUNC_QUALIFIER T simplex(detail::tvec3<T> const & v)
detail::tvec4<T> const D(0.0, 0.5, 1.0, 2.0); detail::tvec4<T> const D(0.0, 0.5, 1.0, 2.0);
// First corner // First corner
detail::tvec3<T> i = floor(v + dot(v, detail::tvec3<T>(C.y))); detail::tvec3<T> i(floor(v + dot(v, detail::tvec3<T>(C.y))));
detail::tvec3<T> x0 = v - i + dot(i, detail::tvec3<T>(C.x)); detail::tvec3<T> x0(v - i + dot(i, detail::tvec3<T>(C.x)));
// Other corners // Other corners
detail::tvec3<T> g = step(detail::tvec3<T>(x0.y, x0.z, x0.x), x0); detail::tvec3<T> g(step(detail::tvec3<T>(x0.y, x0.z, x0.x), x0));
detail::tvec3<T> l = T(1) - g; detail::tvec3<T> l(T(1) - g);
detail::tvec3<T> i1 = min(g, detail::tvec3<T>(l.z, l.x, l.y)); detail::tvec3<T> i1(min(g, detail::tvec3<T>(l.z, l.x, l.y)));
detail::tvec3<T> i2 = max(g, detail::tvec3<T>(l.z, l.x, l.y)); detail::tvec3<T> i2(max(g, detail::tvec3<T>(l.z, l.x, l.y)));
// x0 = x0 - 0.0 + 0.0 * C.xxx; // x0 = x0 - 0.0 + 0.0 * C.xxx;
// x1 = x0 - i1 + 1.0 * C.xxx; // x1 = x0 - i1 + 1.0 * C.xxx;
// x2 = x0 - i2 + 2.0 * C.xxx; // x2 = x0 - i2 + 2.0 * C.xxx;
// x3 = x0 - 1.0 + 3.0 * C.xxx; // x3 = x0 - 1.0 + 3.0 * C.xxx;
detail::tvec3<T> x1 = x0 - i1 + C.x; detail::tvec3<T> x1(x0 - i1 + C.x);
detail::tvec3<T> x2 = x0 - i2 + C.y; // 2.0*C.x = 1/3 = C.y detail::tvec3<T> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y
detail::tvec3<T> x3 = x0 - D.y; // -1.0+3.0*C.x = -0.5 = -D.y detail::tvec3<T> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y
// Permutations // Permutations
i = mod289(i); i = mod289(i);
detail::tvec4<T> p = permute(permute(permute( detail::tvec4<T> p(permute(permute(permute(
i.z + detail::tvec4<T>(T(0), i1.z, i2.z, T(1))) + i.z + detail::tvec4<T>(T(0), i1.z, i2.z, T(1))) +
i.y + detail::tvec4<T>(T(0), i1.y, i2.y, T(1))) + i.y + detail::tvec4<T>(T(0), i1.y, i2.y, T(1))) +
i.x + detail::tvec4<T>(T(0), i1.x, i2.x, T(1))); i.x + detail::tvec4<T>(T(0), i1.x, i2.x, T(1))));
// Gradients: 7x7 points over a square, mapped onto an octahedron. // Gradients: 7x7 points over a square, mapped onto an octahedron.
// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)
T n_ = T(0.142857142857); // 1.0/7.0 T n_ = T(0.142857142857); // 1.0/7.0
detail::tvec3<T> ns = n_ * detail::tvec3<T>(D.w, D.y, D.z) - detail::tvec3<T>(D.x, D.z, D.x); detail::tvec3<T> ns(n_ * detail::tvec3<T>(D.w, D.y, D.z) - detail::tvec3<T>(D.x, D.z, D.x));
detail::tvec4<T> j = p - T(49) * floor(p * ns.z * ns.z); // mod(p,7*7) detail::tvec4<T> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7)
detail::tvec4<T> x_ = floor(j * ns.z); detail::tvec4<T> x_(floor(j * ns.z));
detail::tvec4<T> y_ = floor(j - T(7) * x_); // mod(j,N) detail::tvec4<T> y_(floor(j - T(7) * x_)); // mod(j,N)
detail::tvec4<T> x = x_ * ns.x + ns.y; detail::tvec4<T> x(x_ * ns.x + ns.y);
detail::tvec4<T> y = y_ * ns.x + ns.y; detail::tvec4<T> y(y_ * ns.x + ns.y);
detail::tvec4<T> h = T(1) - abs(x) - abs(y); detail::tvec4<T> h(T(1) - abs(x) - abs(y));
detail::tvec4<T> b0(x.x, x.y, y.x, y.y); detail::tvec4<T> b0(x.x, x.y, y.x, y.y);
detail::tvec4<T> b1(x.z, x.w, y.z, y.w); detail::tvec4<T> b1(x.z, x.w, y.z, y.w);
// vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;
// vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;
detail::tvec4<T> s0 = floor(b0) * T(2) + T(1); detail::tvec4<T> s0(floor(b0) * T(2) + T(1));
detail::tvec4<T> s1 = floor(b1) * T(2) + T(1); detail::tvec4<T> s1(floor(b1) * T(2) + T(1));
detail::tvec4<T> sh = -step(h, detail::tvec4<T>(0.0)); detail::tvec4<T> sh(-step(h, detail::tvec4<T>(0.0)));
detail::tvec4<T> a0 = detail::tvec4<T>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T>(sh.x, sh.x, sh.y, sh.y); detail::tvec4<T> a0 = detail::tvec4<T>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T>(sh.x, sh.x, sh.y, sh.y);
detail::tvec4<T> a1 = detail::tvec4<T>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T>(sh.z, sh.z, sh.w, sh.w); detail::tvec4<T> a1 = detail::tvec4<T>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T>(sh.z, sh.z, sh.w, sh.w);

View File

@ -9,14 +9,132 @@
#include <glm/glm.hpp> #include <glm/glm.hpp>
static int test_vec3_operators() int test_vec3_operators()
{
int Error = 0;
{ {
glm::vec3 A(1.0f); glm::vec3 A(1.0f);
glm::vec3 B(1.0f); glm::vec3 B(1.0f);
bool R = A != B; bool R = A != B;
bool S = A == B; bool S = A == B;
return (S && !R) ? 0 : 1; Error += (S && !R) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B(4.0f, 5.0f, 6.0f);
glm::vec3 C = A + B;
Error += C == glm::vec3(5, 7, 9) ? 0 : 1;
glm::vec3 D = B - A;
Error += D == glm::vec3(3, 3, 3) ? 0 : 1;
glm::vec3 E = A * B;
Error += E == glm::vec3(4, 10, 18) ? 0 : 1;
glm::vec3 F = B / A;
Error += F == glm::vec3(4, 2.5, 2) ? 0 : 1;
glm::vec3 G = A + 1.0f;
Error += G == glm::vec3(2, 3, 4) ? 0 : 1;
glm::vec3 H = B - 1.0f;
Error += H == glm::vec3(3, 4, 5) ? 0 : 1;
glm::vec3 I = A * 2.0f;
Error += I == glm::vec3(2, 4, 6) ? 0 : 1;
glm::vec3 J = B / 2.0f;
Error += J == glm::vec3(2, 2.5, 3) ? 0 : 1;
glm::vec3 K = 1.0f + A;
Error += K == glm::vec3(2, 3, 4) ? 0 : 1;
glm::vec3 L = 1.0f - B;
Error += L == glm::vec3(-3, -4, -5) ? 0 : 1;
glm::vec3 M = 2.0f * A;
Error += M == glm::vec3(2, 4, 6) ? 0 : 1;
glm::vec3 N = 2.0f / B;
Error += N == glm::vec3(0.5, 2.0 / 5.0, 2.0 / 6.0) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B(4.0f, 5.0f, 6.0f);
A += B;
Error += A == glm::vec3(5, 7, 9) ? 0 : 1;
A += 1.0f;
Error += A == glm::vec3(6, 8, 10) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B(4.0f, 5.0f, 6.0f);
B -= A;
Error += B == glm::vec3(3, 3, 3) ? 0 : 1;
B -= 1.0f;
Error += B == glm::vec3(2, 2, 2) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B(4.0f, 5.0f, 6.0f);
A *= B;
Error += A == glm::vec3(4, 10, 18) ? 0 : 1;
A *= 2.0f;
Error += A == glm::vec3(8, 20, 36) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B(4.0f, 5.0f, 6.0f);
B /= A;
Error += B == glm::vec3(4, 2.5, 2) ? 0 : 1;
B /= 2.0f;
Error += B == glm::vec3(2, 1.25, 1) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B = -A;
Error += B == glm::vec3(-1.0f, -2.0f, -3.0f) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B = --A;
Error += B == glm::vec3(0.0f, 1.0f, 2.0f) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B = A--;
Error += B == glm::vec3(0.0f, 1.0f, 2.0f) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B = ++A;
Error += B == glm::vec3(2.0f, 3.0f, 4.0f) ? 0 : 1;
}
{
glm::vec3 A(1.0f, 2.0f, 3.0f);
glm::vec3 B = A++;
Error += B == glm::vec3(2.0f, 3.0f, 4.0f) ? 0 : 1;
}
return Error;
} }
int test_vec3_size() int test_vec3_size()

View File

@ -42,13 +42,131 @@ int test_hvec4()
} }
int test_vec4_operators() int test_vec4_operators()
{
int Error = 0;
{ {
glm::vec4 A(1.0f); glm::vec4 A(1.0f);
glm::vec4 B(1.0f); glm::vec4 B(1.0f);
bool R = A != B; bool R = A != B;
bool S = A == B; bool S = A == B;
return (S && !R) ? 0 : 1; Error += (S && !R) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);
glm::vec4 C = A + B;
Error += C == glm::vec4(5, 7, 9, 11) ? 0 : 1;
glm::vec4 D = B - A;
Error += D == glm::vec4(3, 3, 3, 3) ? 0 : 1;
glm::vec4 E = A * B;
Error += E == glm::vec4(4, 10, 18, 28) ? 0 : 1;
glm::vec4 F = B / A;
Error += F == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;
glm::vec4 G = A + 1.0f;
Error += G == glm::vec4(2, 3, 4, 5) ? 0 : 1;
glm::vec4 H = B - 1.0f;
Error += H == glm::vec4(3, 4, 5, 6) ? 0 : 1;
glm::vec4 I = A * 2.0f;
Error += I == glm::vec4(2, 4, 6, 8) ? 0 : 1;
glm::vec4 J = B / 2.0f;
Error += J == glm::vec4(2, 2.5, 3, 3.5) ? 0 : 1;
glm::vec4 K = 1.0f + A;
Error += K == glm::vec4(2, 3, 4, 5) ? 0 : 1;
glm::vec4 L = 1.0f - B;
Error += L == glm::vec4(-3, -4, -5, -6) ? 0 : 1;
glm::vec4 M = 2.0f * A;
Error += M == glm::vec4(2, 4, 6, 8) ? 0 : 1;
glm::vec4 N = 2.0f / B;
Error += N == glm::vec4(0.5, 2.0 / 5.0, 2.0 / 6.0, 2.0 / 7.0) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);
A += B;
Error += A == glm::vec4(5, 7, 9, 11) ? 0 : 1;
A += 1.0f;
Error += A == glm::vec4(6, 8, 10, 12) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);
B -= A;
Error += B == glm::vec4(3, 3, 3, 3) ? 0 : 1;
B -= 1.0f;
Error += B == glm::vec4(2, 2, 2, 2) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);
A *= B;
Error += A == glm::vec4(4, 10, 18, 28) ? 0 : 1;
A *= 2.0f;
Error += A == glm::vec4(8, 20, 36, 56) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B(4.0f, 5.0f, 6.0f, 7.0f);
B /= A;
Error += B == glm::vec4(4, 2.5, 2, 7.0f / 4.0f) ? 0 : 1;
B /= 2.0f;
Error += B == glm::vec4(2, 1.25, 1, 7.0f / 4.0f / 2.0f) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B = -A;
Error += B == glm::vec4(-1.0f, -2.0f, -3.0f, -4.0f) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B = --A;
Error += B == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B = A--;
Error += B == glm::vec4(0.0f, 1.0f, 2.0f, 3.0f) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B = ++A;
Error += B == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;
}
{
glm::vec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::vec4 B = A++;
Error += B == glm::vec4(2.0f, 3.0f, 4.0f, 5.0f) ? 0 : 1;
}
return Error;
} }
int test_vec4_size() int test_vec4_size()

View File

@ -33,7 +33,7 @@ int test_linearRand()
return Error; return Error;
} }
int test_normalizedRand2() int test_circularRand()
{ {
int Error = 0; int Error = 0;
@ -41,21 +41,23 @@ int test_normalizedRand2()
std::size_t Max = 100000; std::size_t Max = 100000;
float ResultFloat = 0.0f; float ResultFloat = 0.0f;
double ResultDouble = 0.0f; double ResultDouble = 0.0f;
double Radius = 2.0f;
for(std::size_t i = 0; i < Max; ++i) for(std::size_t i = 0; i < Max; ++i)
{ {
ResultFloat += glm::length(glm::normalizedRand2(1.0f, 1.0f)); ResultFloat += glm::length(glm::circularRand(1.0f));
ResultDouble += glm::length(glm::normalizedRand2(1.0f, 1.0f)); ResultDouble += glm::length(glm::circularRand(Radius));
} }
Error += glm::equalEpsilon(ResultFloat, float(Max), 0.01f) ? 0 : 1; Error += glm::equalEpsilon(ResultFloat, float(Max), 0.01f) ? 0 : 1;
Error += glm::equalEpsilon(ResultDouble, double(Max), 0.01) ? 0 : 1; Error += glm::equalEpsilon(ResultDouble, double(Max) * double(Radius), 0.01) ? 0 : 1;
assert(!Error); assert(!Error);
} }
return Error; return Error;
} }
int test_normalizedRand3() int test_sphericalRand()
{ {
int Error = 0; int Error = 0;
@ -67,22 +69,67 @@ int test_normalizedRand3()
double ResultDoubleA = 0.0f; double ResultDoubleA = 0.0f;
double ResultDoubleB = 0.0f; double ResultDoubleB = 0.0f;
double ResultDoubleC = 0.0f; double ResultDoubleC = 0.0f;
for(std::size_t i = 0; i < Max; ++i) for(std::size_t i = 0; i < Max; ++i)
{ {
ResultFloatA += glm::length(glm::normalizedRand3(1.0f, 1.0f)); ResultFloatA += glm::length(glm::sphericalRand(1.0f));
ResultDoubleA += glm::length(glm::normalizedRand3(1.0f, 1.0f)); ResultDoubleA += glm::length(glm::sphericalRand(1.0));
ResultFloatB += glm::length(glm::normalizedRand3(2.0f, 2.0f)); ResultFloatB += glm::length(glm::sphericalRand(2.0f));
ResultDoubleB += glm::length(glm::normalizedRand3(2.0, 2.0)); ResultDoubleB += glm::length(glm::sphericalRand(2.0));
ResultFloatC += glm::length(glm::normalizedRand3(1.0f, 3.0f)); ResultFloatC += glm::length(glm::sphericalRand(3.0f));
ResultDoubleC += glm::length(glm::normalizedRand3(1.0, 3.0)); ResultDoubleC += glm::length(glm::sphericalRand(3.0));
} }
Error += glm::equalEpsilon(ResultFloatA, float(Max), 100.0f) ? 0 : 1; Error += glm::equalEpsilon(ResultFloatA, float(Max), 0.01f) ? 0 : 1;
Error += glm::equalEpsilon(ResultDoubleA, double(Max), 100.0) ? 0 : 1; Error += glm::equalEpsilon(ResultDoubleA, double(Max), 0.0001) ? 0 : 1;
Error += glm::equalEpsilon(ResultFloatB, float(Max * 2), 100.0001f) ? 0 : 1; Error += glm::equalEpsilon(ResultFloatB, float(Max * 2), 0.01f) ? 0 : 1;
Error += glm::equalEpsilon(ResultDoubleB, double(Max * 2), 100.0001) ? 0 : 1; Error += glm::equalEpsilon(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1;
Error += (ResultFloatC >= float(Max) && ResultFloatC <= float(Max * 3)) ? 0 : 1; Error += glm::equalEpsilon(ResultFloatC, float(Max * 3), 0.01f) ? 0 : 1;
Error += (ResultDoubleC >= double(Max) && ResultDoubleC <= double(Max * 3)) ? 0 : 1; Error += glm::equalEpsilon(ResultDoubleC, double(Max * 3), 0.01) ? 0 : 1;
assert(!Error);
}
return Error;
}
int test_diskRand()
{
int Error = 0;
{
float ResultFloat = 0.0f;
double ResultDouble = 0.0f;
for(std::size_t i = 0; i < 100000; ++i)
{
ResultFloat += glm::length(glm::diskRand(2.0f));
ResultDouble += glm::length(glm::diskRand(2.0));
}
Error += ResultFloat < 200000.f ? 0 : 1;
Error += ResultDouble < 200000.0 ? 0 : 1;
assert(!Error);
}
return Error;
}
int test_ballRand()
{
int Error = 0;
{
float ResultFloat = 0.0f;
double ResultDouble = 0.0f;
for(std::size_t i = 0; i < 100000; ++i)
{
ResultFloat += glm::length(glm::ballRand(2.0f));
ResultDouble += glm::length(glm::ballRand(2.0));
}
Error += ResultFloat < 200000.f ? 0 : 1;
Error += ResultDouble < 200000.0 ? 0 : 1;
assert(!Error); assert(!Error);
} }
@ -94,8 +141,10 @@ int main()
int Error = 0; int Error = 0;
Error += test_linearRand(); Error += test_linearRand();
Error += test_normalizedRand2(); Error += test_circularRand();
Error += test_normalizedRand3(); Error += test_sphericalRand();
Error += test_diskRand();
Error += test_ballRand();
return Error; return Error;
} }

View File

@ -23,7 +23,7 @@ int test_simplex()
for(std::size_t y = 0; y < Size; ++y) for(std::size_t y = 0; y < Size; ++y)
for(std::size_t x = 0; x < Size; ++x) for(std::size_t x = 0; x < Size; ++x)
{ {
ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec2(x / 16.f, y / 16.f)) * 128.f + 127.f); ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec2(x / 32.f, y / 32.f)) * 128.f + 127.f);
ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0];
ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0];
} }
@ -40,7 +40,7 @@ int test_simplex()
for(std::size_t y = 0; y < Size; ++y) for(std::size_t y = 0; y < Size; ++y)
for(std::size_t x = 0; x < Size; ++x) for(std::size_t x = 0; x < Size; ++x)
{ {
ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec3(x / 16.f, y / 16.f, 0.5f)) * 128.f + 127.f); ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec3(x / 32.f, y / 32.f, 0.5f)) * 128.f + 127.f);
ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0];
ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0];
} }
@ -57,7 +57,7 @@ int test_simplex()
for(std::size_t y = 0; y < Size; ++y) for(std::size_t y = 0; y < Size; ++y)
for(std::size_t x = 0; x < Size; ++x) for(std::size_t x = 0; x < Size; ++x)
{ {
ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec4(x / 16.f, y / 16.f, 0.5f, 0.5f)) * 128.f + 127.f); ImageData[(x + y * Size) * 3 + 0] = glm::byte(glm::simplex(glm::vec4(x / 32.f, y / 32.f, 0.5f, 0.5f)) * 128.f + 127.f);
ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 1] = ImageData[(x + y * Size) * 3 + 0];
ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0]; ImageData[(x + y * Size) * 3 + 2] = ImageData[(x + y * Size) * 3 + 0];
} }