X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnoise.cpp;h=8b716140e78c5b301fbd00a383778eb482e9166f;hb=35c09fc00094a3d390732fd533b2bd03413d90c7;hp=c86f833ac3c126c894a53eeb5ad6df6c9c835d02;hpb=b547bcbfaf7f47a9380c0995f7db7d3f1048acb2;p=blank.git diff --git a/src/noise.cpp b/src/noise.cpp index c86f833..8b71614 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -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 }, @@ -27,10 +45,9 @@ SimplexNoise::SimplexNoise(unsigned int seed) { 0.0f, 1.0f, -1.0f }, { 0.0f, -1.0f, -1.0f }, }) { - unsigned int val = seed; + GaloisLFSR random(seed ^ 0x0123456789ACBDEF); for (size_t i = 0; i < 256; ++i) { - val = 2346765 * val + 6446345; - perm[i] = val % 256; + random(perm[i]); perm[i + 256] = perm[i]; } }