]> git.localhorst.tv Git - blank.git/blobdiff - tst/rand/StabilityTest.cpp
test stability of worley noise generator
[blank.git] / tst / rand / StabilityTest.cpp
index 9ed047d211e931de1cd32adeeb897026e07cf509..4aab3eba000b55ccd2a5c89bfefc8773c8ce2d19 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "rand/GaloisLFSR.hpp"
 #include "rand/SimplexNoise.hpp"
+#include "rand/WorleyNoise.hpp"
 
 #include <cstdint>
 #include <string>
@@ -68,6 +69,7 @@ void StabilityTest::testRNG() {
                "unexpected value #8 from RNG",
                uint16_t(0x0000), value
        );
+       random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #9 from RNG",
                uint16_t(0x0000), value
@@ -80,12 +82,12 @@ void StabilityTest::testRNG() {
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #11 from RNG",
-               uint16_t(0x0000), value
+               uint16_t(0x2E70), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #12 from RNG",
-               uint16_t(0x2E70), value
+               uint16_t(0x0000), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
@@ -100,12 +102,12 @@ void StabilityTest::testRNG() {
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #15 from RNG",
-               uint16_t(0x0000), value
+               uint16_t(0x1011), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #16 from RNG",
-               uint16_t(0x1011), value
+               uint16_t(0x0000), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
@@ -115,17 +117,17 @@ void StabilityTest::testRNG() {
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #18 from RNG",
-               uint16_t(0x0000), value
+               uint16_t(0xB000), value
        );
-       random(value);
+       value = random.Next<uint16_t>();
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
-               "unexpected value #19 from RNG",
-               uint16_t(0xB000), value
+               "unexpected value #19 from RNG (using Next())",
+               uint16_t(0x0B0B), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #20 from RNG",
-               uint16_t(0x0B0B), value
+               uint16_t(0x0000), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
@@ -135,37 +137,37 @@ void StabilityTest::testRNG() {
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #22 from RNG",
-               uint16_t(0x0000), value
+               uint16_t(0x1500), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #23 from RNG",
-               uint16_t(0x1500), value
+               uint16_t(0x0454), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #24 from RNG",
-               uint16_t(0x0454), value
+               uint16_t(0x0000), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #25 from RNG",
                uint16_t(0x0000), value
        );
-       random(value);
+       value = random.Next<uint16_t>();
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
-               "unexpected value #26 from RNG",
-               uint16_t(0x0000), value
+               "unexpected value #26 from RNG (using Next())",
+               uint16_t(0xC970), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #27 from RNG",
-               uint16_t(0xC970), value
+               uint16_t(0x02E5), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #28 from RNG",
-               uint16_t(0x02E5), value
+               uint16_t(0x0000), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
@@ -175,17 +177,57 @@ void StabilityTest::testRNG() {
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #30 from RNG",
-               uint16_t(0x0000), value
+               uint16_t(0x0101), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #31 from RNG",
-               uint16_t(0x0101), value
+               uint16_t(0x0100), value
        );
        random(value);
        CPPUNIT_ASSERT_EQUAL_MESSAGE(
                "unexpected value #32 from RNG",
-               uint16_t(0x0100), value
+               uint16_t(0x0000), value
+       );
+
+       GaloisLFSR random1(1);
+       uint16_t value1;
+       for (int i = 0; i < 32; ++i) {
+               random1(value1);
+       }
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "RNG with seeds 0 and 1 differ",
+               value, value1
+       );
+
+       GaloisLFSR random_bool(0);
+       bool value_bool;
+       for (int i = 0; i < (16 * 32); ++i) {
+               random_bool(value_bool);
+       }
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "unexpected result for bool",
+               false, value_bool
+       );
+
+       GaloisLFSR random8(0);
+       uint8_t value8;
+       for (int i = 0; i < 31; ++i) {
+               random8(value8);
+       }
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "unexpected result for uint8",
+               uint8_t(0x10), value8
+       );
+
+       GaloisLFSR random32(0);
+       uint32_t value32;
+       for (int i = 0; i < 16; ++i) {
+               random32(value32);
+       }
+       CPPUNIT_ASSERT_EQUAL_MESSAGE(
+               "unexpected result for uint32",
+               uint32_t(0xB0000000), value32
        );
 }
 
@@ -210,6 +252,27 @@ void StabilityTest::testSimplex() {
        Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f),  0.0f);
 }
 
+void StabilityTest::testWorley() {
+       WorleyNoise noise(0);
+
+       Assert(noise, glm::vec3(0.0f, 0.0f, 0.0f), -0.117765009403229f);
+       Assert(noise, glm::vec3(0.0f, 0.0f, 1.0f), -0.209876894950867f);
+       Assert(noise, glm::vec3(0.0f, 1.0f, 0.0f), -0.290086328983307f);
+       Assert(noise, glm::vec3(0.0f, 1.0f, 1.0f), -0.332393705844879f);
+       Assert(noise, glm::vec3(1.0f, 0.0f, 0.0f), -0.621925830841064f);
+       Assert(noise, glm::vec3(1.0f, 0.0f, 1.0f), -0.338455379009247f);
+       Assert(noise, glm::vec3(1.0f, 1.0f, 0.0f), -0.386664032936096f);
+       Assert(noise, glm::vec3(1.0f, 1.0f, 1.0f), -0.533940434455872f);
+
+       Assert(noise, glm::vec3( 0.0f,  0.0f, -1.0f), -0.425480604171753f);
+       Assert(noise, glm::vec3( 0.0f, -1.0f,  0.0f), -0.189745843410492f);
+       Assert(noise, glm::vec3( 0.0f, -1.0f, -1.0f), -0.30408102273941f);
+       Assert(noise, glm::vec3(-1.0f,  0.0f,  0.0f), -0.618566155433655f);
+       Assert(noise, glm::vec3(-1.0f,  0.0f, -1.0f), -0.060045599937439f);
+       Assert(noise, glm::vec3(-1.0f, -1.0f,  0.0f), -0.366827547550201f);
+       Assert(noise, glm::vec3(-1.0f, -1.0f, -1.0f), -0.575981974601746f);
+}
+
 void StabilityTest::Assert(
        const SimplexNoise &noise,
        const glm::vec3 &position,
@@ -223,5 +286,18 @@ void StabilityTest::Assert(
        );
 }
 
+void StabilityTest::Assert(
+       const WorleyNoise &noise,
+       const glm::vec3 &position,
+       float expected
+) {
+       stringstream msg;
+       msg << "unexpected worley noise value at " << position;
+       CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
+               msg.str(),
+               expected, noise(position), numeric_limits<float>::epsilon()
+       );
+}
+
 }
 }