9 SimplexNoise::SimplexNoise(unsigned int seed)
12 { -1.0f, 1.0f, 0.0f },
13 { 1.0f, -1.0f, 0.0f },
14 { -1.0f, -1.0f, 0.0f },
16 { -1.0f, 0.0f, 1.0f },
17 { 1.0f, 0.0f, -1.0f },
18 { -1.0f, 0.0f, -1.0f },
20 { 0.0f, -1.0f, 1.0f },
21 { 0.0f, 1.0f, -1.0f },
22 { 0.0f, -1.0f, -1.0f },
24 unsigned int val = seed;
25 for (size_t i = 0; i < 256; ++i) {
26 val = 2346765 * val + 6446345;
32 float SimplexNoise::operator ()(const glm::vec3 &in) const {
33 float skew = (in.x + in.y + in.z) / 3.0f;
35 glm::vec3 skewed(std::floor(in.x + skew), std::floor(in.y + skew), std::floor(in.z + skew));
36 float tr = (skewed.x + skewed.y + skewed.z) / 6.0f;
38 glm::vec3 unskewed(skewed.x - tr, skewed.y - tr, skewed.z - tr);
40 offset[0] = in - unskewed;
42 glm::vec3 second, third;
44 if (offset[0].x >= offset[0].y) {
45 if (offset[0].y >= offset[0].z) {
46 second = { 1.0f, 0.0f, 0.0f };
47 third = { 1.0f, 1.0f, 0.0f };
48 } else if (offset[0].x >= offset[0].z) {
49 second = { 1.0f, 0.0f, 0.0f };
50 third = { 1.0f, 0.0f, 1.0f };
52 second = { 0.0f, 0.0f, 1.0f };
53 third = { 1.0f, 0.0f, 1.0f };
55 } else if (offset[0].y < offset[0].z) {
56 second = { 0.0f, 0.0f, 1.0f };
57 third = { 0.0f, 1.0f, 1.0f };
58 } else if (offset[0].x < offset[0].z) {
59 second = { 0.0f, 1.0f, 0.0f };
60 third = { 0.0f, 1.0f, 1.0f };
62 second = { 0.0f, 1.0f, 0.0f };
63 third = { 1.0f, 1.0f, 0.0f };
66 offset[1] = offset[0] - second + glm::vec3(1.0f/6.0f);
67 offset[2] = offset[0] - third + glm::vec3(1.0f/3.0f);
68 offset[3] = offset[0] - glm::vec3(0.5f);
71 unsigned(skewed.x) % 256,
72 unsigned(skewed.y) % 256,
73 unsigned(skewed.z) % 256,
76 Perm(index[0] + Perm(index[1] + Perm(index[2]))),
77 Perm(index[0] + second.x + Perm(index[1] + second.y + Perm(index[2] + second.z))),
78 Perm(index[0] + third.x + Perm(index[1] + third.y + Perm(index[2] + third.z))),
79 Perm(index[0] + 1 + Perm(index[1] + 1 + Perm(index[2] + 1))),
83 for (size_t i = 0; i < 4; ++i) {
84 t[i] = 0.6f - dot(offset[i], offset[i]);
89 n[i] = t[i] * t[i] * dot(Grad(corner[i]), offset[i]);
93 return 32.0f * (n[0] + n[1] + n[2] + n[3]);
97 unsigned char SimplexNoise::Perm(size_t idx) const {
98 return perm[idx % 256];
101 const glm::vec3 &SimplexNoise::Grad(size_t idx) const {
102 return grad[idx % 12];