@@ -13,10 +13,10 @@ namespace gf {
13
13
14
14
namespace {
15
15
16
- void generate_permutation (Random& random, std::array<uint8_t , 256 >& permutation)
16
+ void generate_permutation (Random* random, std::array<uint8_t , 256 >& permutation)
17
17
{
18
18
std::iota (permutation.begin (), permutation.end (), 0 );
19
- std::shuffle (permutation.begin (), permutation.end (), random. engine ());
19
+ std::shuffle (permutation.begin (), permutation.end (), random-> engine ());
20
20
}
21
21
22
22
}
@@ -25,7 +25,7 @@ namespace gf {
25
25
* ValueNoise2D
26
26
*/
27
27
28
- ValueNoise2D::ValueNoise2D (Random& random, Step<double > step)
28
+ ValueNoise2D::ValueNoise2D (Random* random, Step<double > step)
29
29
: m_step(step)
30
30
{
31
31
// initialize permutation
@@ -34,21 +34,21 @@ namespace gf {
34
34
35
35
// generate values
36
36
37
- std::uniform_real_distribution<double > distribution_value (0.0 , 1.0 );
38
-
39
37
for (auto & value : m_values) {
40
- value = distribution_value ( random. engine () );
38
+ value = random-> compute_uniform_float < double >( );
41
39
}
42
40
}
43
41
44
42
double ValueNoise2D::value (double x, double y)
45
43
{
46
- auto qx = static_cast <uint8_t >(std::fmod (x, 256 ));
47
- const double rx = std::fmod (x, 1 );
44
+ double dummy = 0.0 ;
45
+
46
+ auto qx = static_cast <uint8_t >(x);
47
+ const double rx = std::modf (x, &dummy);
48
48
assert (rx >= 0.0 && rx <= 1.0 );
49
49
50
- auto qy = static_cast <uint8_t >(std::fmod (y, 256 ) );
51
- const double ry = std::fmod (y, 1 );
50
+ auto qy = static_cast <uint8_t >(y );
51
+ const double ry = std::modf (y, &dummy );
52
52
assert (ry >= 0.0 && ry <= 1.0 );
53
53
54
54
// clang-format off
@@ -75,7 +75,7 @@ namespace gf {
75
75
* GradientNoise2D
76
76
*/
77
77
78
- GradientNoise2D::GradientNoise2D (Random& random, Step<double > step)
78
+ GradientNoise2D::GradientNoise2D (Random* random, Step<double > step)
79
79
: m_step(step)
80
80
{
81
81
// initialize permutation
@@ -84,22 +84,22 @@ namespace gf {
84
84
85
85
// generate 2D gradients
86
86
87
- std::uniform_real_distribution<double > distribution_angle (0.0 , 2.0 * constants::Pi<double >);
88
-
89
87
for (auto & gradient : m_gradients) {
90
- const double angle = distribution_angle ( random. engine () );
88
+ const double angle = random-> compute_uniform_float ( 2.0 * constants::Pi< double > );
91
89
gradient = gf::unit (angle);
92
90
}
93
91
}
94
92
95
93
double GradientNoise2D::value (double x, double y)
96
94
{
97
- auto qx = static_cast <uint8_t >(std::fmod (x, 256 ));
98
- const double rx = std::fmod (x, 1 );
95
+ double dummy = 0.0 ;
96
+
97
+ auto qx = static_cast <uint8_t >(x);
98
+ const double rx = std::modf (x, &dummy);
99
99
assert (rx >= 0.0 && rx <= 1.0 );
100
100
101
- auto qy = static_cast <uint8_t >(std::fmod (y, 256 ) );
102
- const double ry = std::fmod (y, 1 );
101
+ auto qy = static_cast <uint8_t >(y );
102
+ const double ry = std::modf (y, &dummy );
103
103
assert (ry >= 0.0 && ry <= 1.0 );
104
104
105
105
// clang-format off
@@ -130,7 +130,7 @@ namespace gf {
130
130
* GradientNoise3D
131
131
*/
132
132
133
- GradientNoise3D::GradientNoise3D (Random& random, Step<double > step)
133
+ GradientNoise3D::GradientNoise3D (Random* random, Step<double > step)
134
134
: m_step(step)
135
135
{
136
136
// initialize permutation
@@ -139,28 +139,27 @@ namespace gf {
139
139
140
140
// generate 3D gradients
141
141
142
- std::uniform_real_distribution<double > distribution_phi (0.0 , 2.0 * constants::Pi<double >);
143
- std::uniform_real_distribution<double > distribution_theta (0.0 , 2.0 * constants::Pi<double >);
144
-
145
142
for (auto & gradient : m_gradients) {
146
- const double phi = distribution_phi ( random. engine () );
147
- const double theta = distribution_theta ( random. engine () );
143
+ const double phi = random-> compute_uniform_float ( 2.0 * constants::Pi< double > );
144
+ const double theta = random-> compute_uniform_float ( 2.0 * constants::Pi< double > );
148
145
gradient = { std::cos (phi) * std::sin (theta), std::sin (phi) * std::sin (theta), std::cos (theta) };
149
146
}
150
147
}
151
148
152
149
double GradientNoise3D::value (double x, double y, double z)
153
150
{
154
- auto qx = static_cast <uint8_t >(std::fmod (x, 256 ));
155
- const double rx = std::fmod (x, 1 );
151
+ double dummy = 0.0 ;
152
+
153
+ auto qx = static_cast <uint8_t >(x);
154
+ const double rx = std::modf (x, &dummy);
156
155
assert (rx >= 0.0 && rx <= 1.0 );
157
156
158
- auto qy = static_cast <uint8_t >(std::fmod (y, 256 ) );
159
- const double ry = std::fmod (y, 1 );
157
+ auto qy = static_cast <uint8_t >(y );
158
+ const double ry = std::modf (y, &dummy );
160
159
assert (ry >= 0.0 && ry <= 1.0 );
161
160
162
- auto qz = static_cast <uint8_t >(std::fmod (z, 256 ) );
163
- const double rz = std::fmod (z, 1 );
161
+ auto qz = static_cast <uint8_t >(z );
162
+ const double rz = std::modf (z, &dummy );
164
163
assert (rz >= 0.0 && rz <= 1.0 );
165
164
166
165
// clang-format off
@@ -203,7 +202,7 @@ namespace gf {
203
202
* BetterGradientNoise2D
204
203
*/
205
204
206
- BetterGradientNoise2D::BetterGradientNoise2D (Random& random)
205
+ BetterGradientNoise2D::BetterGradientNoise2D (Random* random)
207
206
{
208
207
// initialize permutation
209
208
@@ -212,22 +211,22 @@ namespace gf {
212
211
213
212
// generate 2D gradients
214
213
215
- std::uniform_real_distribution<double > distribution_angle (0.0 , 2.0 * constants::Pi<double >);
216
-
217
214
for (auto & gradient : m_gradients) {
218
- const double angle = distribution_angle ( random. engine () );
215
+ const double angle = random-> compute_uniform_float ( 2.0 * constants::Pi< double > );
219
216
gradient = gf::unit (angle);
220
217
}
221
218
}
222
219
223
220
double BetterGradientNoise2D::value (double x, double y)
224
221
{
225
- auto qx = static_cast <uint8_t >(std::fmod (x, 256 ));
226
- const double rx = std::fmod (x, 1 );
222
+ double dummy = 0.0 ;
223
+
224
+ auto qx = static_cast <uint8_t >(x);
225
+ const double rx = std::modf (x, &dummy);
227
226
assert (rx >= 0.0 && rx <= 1.0 );
228
227
229
- auto qy = static_cast <uint8_t >(std::fmod (y, 256 ) );
230
- const double ry = std::fmod (y, 1 );
228
+ auto qy = static_cast <uint8_t >(y );
229
+ const double ry = std::modf (y, &dummy );
231
230
assert (ry >= 0.0 && ry <= 1.0 );
232
231
233
232
double value = 0 .0f ;
@@ -332,7 +331,7 @@ namespace gf {
332
331
* PerlinNoise2D
333
332
*/
334
333
335
- PerlinNoise2D::PerlinNoise2D (Random& random, double scale, int octaves)
334
+ PerlinNoise2D::PerlinNoise2D (Random* random, double scale, int octaves)
336
335
: m_gradient_noise(random, gf::quintic_step)
337
336
, m_fractal_noise(&m_gradient_noise, scale, octaves)
338
337
{
@@ -347,7 +346,7 @@ namespace gf {
347
346
* PerlinNoise3D
348
347
*/
349
348
350
- PerlinNoise3D::PerlinNoise3D (Random& random, double scale, int octaves)
349
+ PerlinNoise3D::PerlinNoise3D (Random* random, double scale, int octaves)
351
350
: m_gradient_noise(random, gf::quintic_step)
352
351
, m_fractal_noise(&m_gradient_noise, scale, octaves)
353
352
{
@@ -362,7 +361,7 @@ namespace gf {
362
361
* SimplexNoise2D
363
362
*/
364
363
365
- SimplexNoise2D::SimplexNoise2D (Random& random)
364
+ SimplexNoise2D::SimplexNoise2D (Random* random)
366
365
{
367
366
generate_permutation (random, m_permutation);
368
367
}
@@ -529,7 +528,7 @@ namespace gf {
529
528
530
529
}
531
530
532
- WaveletNoise3D::WaveletNoise3D (Random& random, std::ptrdiff_t wavelet_tile_size)
531
+ WaveletNoise3D::WaveletNoise3D (Random* random, std::ptrdiff_t wavelet_tile_size)
533
532
: m_wavelet_tile_size(wavelet_tile_size + (wavelet_tile_size % 2 ))
534
533
{
535
534
const std::size_t data_size = m_wavelet_tile_size * m_wavelet_tile_size * m_wavelet_tile_size;
@@ -540,10 +539,8 @@ namespace gf {
540
539
541
540
// step 1: fill the tile with numbers in the range -1 to 1
542
541
543
- std::uniform_real_distribution<double > distribution_value (-1.0 , 1.0 );
544
-
545
542
for (auto & value : m_data) {
546
- value = distribution_value ( random. engine () );
543
+ value = random-> compute_uniform_float (- 1.0 , + 1.0 );
547
544
}
548
545
549
546
// step 2 and 3: downsample and upsample the tile
@@ -659,7 +656,7 @@ namespace gf {
659
656
* WorleyNoise2D
660
657
*/
661
658
662
- WorleyNoise2D::WorleyNoise2D (Random& random, std::size_t points_count, Distance2<double > distance, std::vector<double > coefficients)
659
+ WorleyNoise2D::WorleyNoise2D (Random* random, std::size_t points_count, Distance2<double > distance, std::vector<double > coefficients)
663
660
: m_points_count(points_count)
664
661
, m_distance(distance)
665
662
, m_coefficients(std::move(coefficients))
@@ -668,11 +665,9 @@ namespace gf {
668
665
669
666
m_cells.reserve (m_points_count * 4 );
670
667
671
- std::uniform_real_distribution<double > distribution_coordinate (0.0 , 1.0 );
672
-
673
668
for (std::size_t i = 0 ; i < m_points_count; ++i) {
674
- auto x = distribution_coordinate ( random. engine () );
675
- auto y = distribution_coordinate ( random. engine () );
669
+ auto x = random-> compute_uniform_float < double >( );
670
+ auto y = random-> compute_uniform_float < double >( );
676
671
677
672
m_cells.emplace_back (x, y);
678
673
0 commit comments