Plasma Engine  2.0
Loading...
Searching...
No Matches
SimdRandom_inl.h
1#pragma once
2
3// static
4PL_FORCE_INLINE plSimdVec4u plSimdRandom::UInt(const plSimdVec4i& vPosition, const plSimdVec4u& vSeed /*= plSimdVec4u::MakeZero()*/)
5{
6 // Based on Squirrel3 which was introduced by Squirrel Eiserloh at 'Math for Game Programmers: Noise-Based RNG', GDC17.
7 const plSimdVec4u BIT_NOISE1 = plSimdVec4u(0xb5297a4d);
8 const plSimdVec4u BIT_NOISE2 = plSimdVec4u(0x68e31da4);
9 const plSimdVec4u BIT_NOISE3 = plSimdVec4u(0x1b56c4e9);
10
11 plSimdVec4u mangled = plSimdVec4u(vPosition);
12 mangled = mangled.CompMul(BIT_NOISE1);
13 mangled += vSeed;
14 mangled ^= (mangled >> 8);
15 mangled += BIT_NOISE2;
16 mangled ^= (mangled << 8);
17 mangled = mangled.CompMul(BIT_NOISE3);
18 mangled ^= (mangled >> 8);
19
20 return mangled;
21}
22
23// static
24PL_ALWAYS_INLINE plSimdVec4f plSimdRandom::FloatZeroToOne(const plSimdVec4i& vPosition, const plSimdVec4u& vSeed /*= plSimdVec4u::MakeZero()*/)
25{
26 return UInt(vPosition, vSeed).ToFloat() * (1.0f / 4294967296.0f);
27}
28
29// static
30PL_ALWAYS_INLINE plSimdVec4f plSimdRandom::FloatMinMax(const plSimdVec4i& vPosition, const plSimdVec4f& vMinValue, const plSimdVec4f& vMaxValue, const plSimdVec4u& vSeed /*= plSimdVec4u::MakeZero()*/)
31{
32 return plSimdVec4f::Lerp(vMinValue, vMaxValue, FloatZeroToOne(vPosition, vSeed));
33}
A 4-component SIMD vector class.
Definition SimdVec4f.h:8
A SIMD 4-component vector class of signed 32b integers.
Definition SimdVec4i.h:9
A SIMD 4-component vector class of unsigned 32b integers.
Definition SimdVec4u.h:7
static plSimdVec4u UInt(const plSimdVec4i &vPosition, const plSimdVec4u &vSeed=plSimdVec4u::MakeZero())
Returns 4 random uint32 values at position, ie. ranging from 0 to (2 ^ 32) - 1.
Definition SimdRandom_inl.h:4
static plSimdVec4f FloatMinMax(const plSimdVec4i &vPosition, const plSimdVec4f &vMinValue, const plSimdVec4f &vMaxValue, const plSimdVec4u &vSeed=plSimdVec4u::MakeZero())
Returns 4 random float values in range [fMinValue ; fMaxValue].
Definition SimdRandom_inl.h:30
static plSimdVec4f FloatZeroToOne(const plSimdVec4i &vPosition, const plSimdVec4u &vSeed=plSimdVec4u::MakeZero())
Returns 4 random float values in range [0.0 ; 1.0], ie. including zero and one.
Definition SimdRandom_inl.h:24