38 lines
1.5 KiB
C++
Raw Normal View History

//-----------------------------------------------------------------------------------------------
// RawNoise.cpp
//
#include "./RawNoise.hpp"
namespace SquirrelNoise4 {
//-----------------------------------------------------------------------------------------------
// Fast hash of an int32 into a different (unrecognizable) uint32.
//
// Returns an uint32_t containing 32 reasonably-well-scrambled bits, based on the hash
// of a given (signed) integer input parameter (position/index) and [optional] seed. Kind of
// like looking up a value in an infinitely large table of previously generated random numbers.
//
// The bit-noise constants and bit-shifts were evolved by a genetic algorithm using the
// "BigCrush" test for fitness, and have so far produced excellent test results.
//
// I call this particular approach SquirrelNoise (version 4).
//
uint32_t Get1dNoiseUint32( int32_t positionX, uint32_t seed ) {
const uint32_t BIT_NOISE1 = 0xD2A80A23; // 0b1101'0010'1010'1000'0000'1010'0010'0011;
const uint32_t BIT_NOISE2 = 0xA884F197; // 0b1010'1000'1000'0100'1111'0001'1001'0111;
const uint32_t BIT_NOISE3 = 0x1B56C4E9; // 0b0001'1011'0101'0110'1100'0100'1110'1001;
uint32_t mangledBits = (uint32_t) positionX;
mangledBits *= BIT_NOISE1;
mangledBits += seed;
mangledBits ^= (mangledBits >> 7);
mangledBits += BIT_NOISE2;
mangledBits ^= (mangledBits >> 8);
mangledBits *= BIT_NOISE3;
mangledBits ^= (mangledBits >> 11);
return mangledBits;
}
} // SquirrelNoise4