19 template <std::
floating_po
int F>
23 return (
fp <
i) ? (
i - 1) :
i;
26 constexpr inline uint8_t perm[256] = {
27 151, 160, 137, 91, 90, 15,
28 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23,
29 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33,
30 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166,
31 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244,
32 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196,
33 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123,
34 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42,
35 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,
36 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228,
37 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107,
38 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254,
39 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180
44 return perm[
static_cast<uint8_t>(
i)];
47 template <std::
floating_po
int F>
51 F grad =
F(1.0) + (
h & 7);
52 if ((
h & 8) != 0) grad = -grad;
56 template <std::
floating_po
int F>
60 const F u =
h < 4 ? x : y;
61 const F v =
h < 4 ? y : x;
62 return ((
h & 1) ? -
u :
u) + ((
h & 2) ?
F(-2.0) * v :
F(2.0) * v);
65 template <std::
floating_po
int F>
68 const int h = hash & 15;
69 const F u =
h < 8 ? x : y;
70 const F v =
h < 4 ? y :
h == 12 ||
h == 14 ? x :
z;
71 return ((
h & 1) ? -
u :
u) + ((
h & 2) ? -v : v);
75 template <std::
floating_po
int F>
76 constexpr F simplex_noise(
F x)
87 F n0 =
t0 *
t0 * detail::grad(detail::hash(
i0),
x0);
92 F n1 =
t1 *
t1 * detail::grad(detail::hash(
i1),
x1);
94 return F(0.395) * (
n0 +
n1);
97 template <std::
floating_po
int F>
98 constexpr F simplex_noise(
F x,
F y)
100 static constexpr F F2 =
F(0.366025403);
101 static constexpr F G2 =
F(0.211324865);
103 const F s = (x + y) *
F2;
109 const F t =
static_cast<F>(
i +
j) *
G2;
131 const int gi0 = hash(
i + hash(
j));
132 const int gi1 = hash(
i +
i1 + hash(
j +
j1));
133 const int gi2 = hash(
i + 1 + hash(
j + 1));
159 return F(45.23065) * (
n0 +
n1 +
n2);
162 template <std::
floating_po
int F>
177 return (output /
denom);
180 template <std::
floating_po
int F>
195 return (output /
denom);
constexpr auto bit_count
Equal to the number of bits in the type.
The below code is based on Sun's libm library code, which is licensed under the following license:
Shamelessly stolen from https://github.com/SRombauts/SimplexNoise/.