]> git.localhorst.tv Git - blank.git/commitdiff
added Galois LFSR PRNG
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 23 Mar 2015 16:33:02 +0000 (17:33 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Mon, 23 Mar 2015 16:33:02 +0000 (17:33 +0100)
not in use yet
beware of seed with many zeros
especially 0, which will only ever produce zeroes

TODO
src/noise.cpp
src/noise.hpp

diff --git a/TODO b/TODO
index dfe8332640b9f49a5162c4982b427ebef4e62690..244e938c259c8283cafa73b09be54cbeba6fb3db 100644 (file)
--- a/TODO
+++ b/TODO
@@ -75,3 +75,9 @@ world generator that is not boring
 entity/world collision
 
        entities should be stopped from entering solid parts of the world
+
+better noise
+
+       current simplex noise implementation repeats itself pretty quickly
+       also there seems to be a (imo) better implementation here:
+       http://flafla2.github.io/2014/08/09/perlinnoise.html
index c86f833ac3c126c894a53eeb5ad6df6c9c835d02..6d59224c2f41f4de89ae982627387fcacd7235a2 100644 (file)
@@ -12,6 +12,24 @@ constexpr float one_sixth = 1.0f/6.0f;
 
 namespace blank {
 
+GaloisLFSR::GaloisLFSR(std::uint64_t seed)
+: state(seed) {
+
+}
+
+bool GaloisLFSR::operator ()() {
+       bool result = state & 1;
+       state >>= 1;
+       if (result) {
+               state |= 0x8000000000000000;
+               state ^= mask;
+       } else {
+               state &= 0x7FFFFFFFFFFFFFFF;
+       }
+       return result;
+}
+
+
 SimplexNoise::SimplexNoise(unsigned int seed)
 : grad({
        {  1.0f,  1.0f,  0.0f },
index 4c26de92eadf0ae3bacd679cc069e0337bf27861..166a60a71058b998d60df732f752259b993beea4 100644 (file)
@@ -1,11 +1,40 @@
 #ifndef BLANK_NOISE_HPP_
 #define BLANK_NOISE_HPP_
 
+#include <cstdint>
+#include <limits>
 #include <glm/glm.hpp>
 
 
 namespace blank {
 
+class GaloisLFSR {
+
+public:
+       // seed should be non-zero
+       explicit GaloisLFSR(std::uint64_t seed);
+
+       // get the next bit
+       bool operator ()();
+
+       template<class T>
+       void operator ()(T &out) {
+               constexpr int num_bits =
+                       std::numeric_limits<T>::digits +
+                       std::numeric_limits<T>::is_signed;
+               for (int i = 0; i < num_bits; ++i) {
+                       operator ()();
+               }
+               out = static_cast<T>(state);
+       }
+
+private:
+       std::uint64_t state;
+       // bits 64, 63, 61, and 60 set to 1 (counting from 1 lo to hi)
+       static constexpr std::uint64_t mask = 0xD800000000000000;
+
+};
+
 /// (3D only) adaptation of Stefan Gustavson's SimplexNoise java class
 class SimplexNoise {