Blender V4.3
Noise.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#include <cmath>
11#include <cstdio>
12#include <cstdlib>
13#include <ctime>
14
15#include "BLI_compiler_attrs.h"
16#include "BLI_rand.h"
17#include "BLI_sys_types.h"
18
19#include "Noise.h"
20
21namespace Freestyle {
22
23#define SCURVE(a) ((a) * (a) * (3.0 - 2.0 * (a)))
24
25#if 0 // XXX Unused
26# define REALSCALE (2.0 / 65536.0)
27# define NREALSCALE (2.0 / 4096.0)
28
29# define HASH3D(a, b, c) \
30 hashTable[hashTable[hashTable[(a) & 0xfff] ^ ((b) & 0xfff)] ^ ((c) & 0xfff)]
31# define HASH(a, b, c) (xtab[(xtab[(xtab[(a) & 0xff] ^ (b)) & 0xff] ^ (c)) & 0xff] & 0xff)
32# define INCRSUM(m, s, x, y, z) \
33 ((s) * (RTable[m] * 0.5 + RTable[m + 1] * (x) + RTable[m + 2] * (y) + RTable[m + 3] * (z)))
34
35# define MAXSIZE 500
36#endif
37
38#define BM 0xff
39#define N 0x1000
40#if 0 // XXX Unused
41# define NP 12 /* 2^N */
42# define NM 0xfff
43#endif
44
45#define LERP(t, a, b) ((a) + (t) * ((b) - (a)))
46
47#define SETUP(i, b0, b1, r0, r1) \
48 { \
49 (t) = (i) + (N); \
50 (r0) = modff((t), &(u)); \
51 (r1) = (r0)-1.0; \
52 (b0) = int(u) & BM; \
53 (b1) = ((b0) + 1) & BM; \
54 } \
55 (void)0
56
57static void normalize2(float v[2])
58{
59 float s;
60
61 s = sqrt(v[0] * v[0] + v[1] * v[1]);
62 v[0] = v[0] / s;
63 v[1] = v[1] / s;
64}
65
66static void normalize3(float v[3])
67{
68 float s;
69
70 s = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
71 v[0] = v[0] / s;
72 v[1] = v[1] / s;
73 v[2] = v[2] / s;
74}
75
76float Noise::turbulence1(float arg, float freq, float amp, uint oct)
77{
78 float t;
79 float vec;
80
81 for (t = 0; oct > 0 && freq > 0; freq *= 2, amp /= 2, --oct) {
82 vec = freq * arg;
83 t += smoothNoise1(vec) * amp;
84 }
85 return t;
86}
87
88float Noise::turbulence2(Vec2f &v, float freq, float amp, uint oct)
89{
90 float t;
91 Vec2f vec;
92
93 for (t = 0; oct > 0 && freq > 0; freq *= 2, amp /= 2, --oct) {
94 vec.x() = freq * v.x();
95 vec.y() = freq * v.y();
96 t += smoothNoise2(vec) * amp;
97 }
98 return t;
99}
100
101float Noise::turbulence3(Vec3f &v, float freq, float amp, uint oct)
102{
103 float t;
104 Vec3f vec;
105
106 for (t = 0; oct > 0 && freq > 0; freq *= 2, amp /= 2, --oct) {
107 vec.x() = freq * v.x();
108 vec.y() = freq * v.y();
109 vec.z() = freq * v.z();
110 t += smoothNoise3(vec) * amp;
111 }
112 return t;
113}
114
115// Noise functions over 1, 2, and 3 dimensions
116float Noise::smoothNoise1(float arg)
117{
118 int bx0, bx1;
119 float rx0, rx1, sx, t, u, v, vec;
120
121 vec = arg;
122 SETUP(vec, bx0, bx1, rx0, rx1);
123
124 sx = SCURVE(rx0);
125
126 u = rx0 * g1[p[bx0]];
127 v = rx1 * g1[p[bx1]];
128
129 return LERP(sx, u, v);
130}
131
133{
134 int bx0, bx1, by0, by1, b00, b10, b01, b11;
135 float rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v;
136 int i, j;
137
138 SETUP(vec.x(), bx0, bx1, rx0, rx1);
139 SETUP(vec.y(), by0, by1, ry0, ry1);
140
141 i = p[bx0];
142 j = p[bx1];
143
144 b00 = p[i + by0];
145 b10 = p[j + by0];
146 b01 = p[i + by1];
147 b11 = p[j + by1];
148
149 sx = SCURVE(rx0);
150 sy = SCURVE(ry0);
151
152#define AT2(rx, ry) ((rx) * q[0] + (ry) * q[1])
153
154 q = g2[b00];
155 u = AT2(rx0, ry0);
156 q = g2[b10];
157 v = AT2(rx1, ry0);
158 a = LERP(sx, u, v);
159
160 q = g2[b01];
161 u = AT2(rx0, ry1);
162 q = g2[b11];
163 v = AT2(rx1, ry1);
164 b = LERP(sx, u, v);
165
166#undef AT2
167
168 return LERP(sy, a, b);
169}
170
172{
173 int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
174 float rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v;
175 int i, j;
176
177 SETUP(vec.x(), bx0, bx1, rx0, rx1);
178 SETUP(vec.y(), by0, by1, ry0, ry1);
179 SETUP(vec.z(), bz0, bz1, rz0, rz1);
180
181 i = p[bx0];
182 j = p[bx1];
183
184 b00 = p[i + by0];
185 b10 = p[j + by0];
186 b01 = p[i + by1];
187 b11 = p[j + by1];
188
189 t = SCURVE(rx0);
190 sy = SCURVE(ry0);
191 sz = SCURVE(rz0);
192
193#define AT3(rx, ry, rz) ((rx) * q[0] + (ry) * q[1] + (rz) * q[2])
194
195 q = g3[b00 + bz0];
196 u = AT3(rx0, ry0, rz0);
197 q = g3[b10 + bz0];
198 v = AT3(rx1, ry0, rz0);
199 a = LERP(t, u, v);
200
201 q = g3[b01 + bz0];
202 u = AT3(rx0, ry1, rz0);
203 q = g3[b11 + bz0];
204 v = AT3(rx1, ry1, rz0);
205 b = LERP(t, u, v);
206
207 c = LERP(sy, a, b);
208
209 q = g3[b00 + bz1];
210 u = AT3(rx0, ry0, rz1);
211 q = g3[b10 + bz1];
212 v = AT3(rx1, ry0, rz1);
213 a = LERP(t, u, v);
214
215 q = g3[b01 + bz1];
216 u = AT3(rx0, ry1, rz1);
217 q = g3[b11 + bz1];
218 v = AT3(rx1, ry1, rz1);
219 b = LERP(t, u, v);
220
221 d = LERP(sy, a, b);
222
223#undef AT3
224
225 return LERP(sz, c, d);
226}
227
229{
230 /* Use Blender RNG for repeatable results across platforms. */
231 RNG *rng = BLI_rng_new(seed);
232 int i, j, k;
233
234 for (i = 0; i < _NOISE_B; i++) {
235 p[i] = i;
236 g1[i] = float((BLI_rng_get_int(rng) % (_NOISE_B + _NOISE_B)) - _NOISE_B) / _NOISE_B;
237
238 for (j = 0; j < 2; j++) {
239 g2[i][j] = float((BLI_rng_get_int(rng) % (_NOISE_B + _NOISE_B)) - _NOISE_B) / _NOISE_B;
240 }
241 normalize2(g2[i]);
242
243 for (j = 0; j < 3; j++) {
244 g3[i][j] = float((BLI_rng_get_int(rng) % (_NOISE_B + _NOISE_B)) - _NOISE_B) / _NOISE_B;
245 }
246 normalize3(g3[i]);
247 }
248
249 while (--i) {
250 k = p[i];
251 p[i] = p[j = BLI_rng_get_int(rng) % _NOISE_B];
252 p[j] = k;
253 }
254
255 for (i = 0; i < _NOISE_B + 2; i++) {
256 p[_NOISE_B + i] = p[i];
257 g1[_NOISE_B + i] = g1[i];
258
259 for (j = 0; j < 2; j++) {
260 g2[_NOISE_B + i][j] = g2[i][j];
261 }
262
263 for (j = 0; j < 3; j++) {
264 g3[_NOISE_B + i][j] = g3[i][j];
265 }
266 }
267
268 BLI_rng_free(rng);
269}
270
271} /* namespace Freestyle */
sqrt(x)+1/max(0
Random number functions.
void int BLI_rng_get_int(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition rand.cc:78
struct RNG * BLI_rng_new(unsigned int seed)
Definition rand.cc:39
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
Definition rand.cc:58
unsigned int uint
#define SCURVE(a)
Definition Noise.cpp:23
#define AT2(rx, ry)
#define LERP(t, a, b)
Definition Noise.cpp:45
#define AT3(rx, ry, rz)
Class to define Perlin noise.
#define _NOISE_B
Definition Noise.h:24
ATTR_WARN_UNUSED_RESULT const BMVert * v
static unsigned long seed
Definition btSoftBody.h:39
float turbulence3(Vec3f &v, float freq, float amp, uint oct=4)
Definition Noise.cpp:101
float turbulence1(float arg, float freq, float amp, uint oct=4)
Definition Noise.cpp:76
float turbulence2(Vec2f &v, float freq, float amp, uint oct=4)
Definition Noise.cpp:88
float smoothNoise3(Vec3f &vec)
Definition Noise.cpp:171
float smoothNoise1(float arg)
Definition Noise.cpp:116
Noise(long seed=-1)
Definition Noise.cpp:228
float smoothNoise2(Vec2f &vec)
Definition Noise.cpp:132
value_type x() const
Definition VecMat.h:296
value_type y() const
Definition VecMat.h:306
value_type x() const
Definition VecMat.h:493
value_type z() const
Definition VecMat.h:513
value_type y() const
Definition VecMat.h:503
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
inherits from class Rep
Definition AppCanvas.cpp:20
static uint c
Definition RandGen.cpp:87
static void normalize3(float v[3])
Definition Noise.cpp:66
static void normalize2(float v[2])
Definition Noise.cpp:57
static uint a[3]
Definition RandGen.cpp:82
#define SETUP(val, b0, b1, r0, r1)
Definition noise.c:752
Definition rand.cc:33