Gamedev Framework (gf) 0.21.0
A C++17 framework for 2D games
Noises.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2021 Julien Bernard
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21#ifndef GF_NOISES_H
22#define GF_NOISES_H
23
24#include <cstddef>
25#include <cstdint>
26#include <array>
27#include <functional>
28#include <vector>
29
30#include "CoreApi.h"
31#include "Math.h"
32#include "Noise.h"
33#include "Vector.h"
34
35namespace gf {
36#ifndef DOXYGEN_SHOULD_SKIP_THIS
37inline namespace v1 {
38#endif
39
40 class Random;
41
49 class GF_CORE_API ValueNoise2D : public Noise2D {
50 public:
60
61 double getValue(double x, double y) override;
62
63 private:
64 Step<double> m_step;
65 std::array<uint8_t, 256> m_perm;
66 std::array<double, 256> m_values;
67
68 double at(uint8_t i, uint8_t j) const;
69 };
70
71
79 class GF_CORE_API GradientNoise2D : public Noise2D {
80 public:
90
91 double getValue(double x, double y) override;
92
93 private:
94 Step<double> m_step;
95 std::array<uint8_t, 256> m_perm;
96 std::array<Vector2d, 256> m_gradients2D;
97
98 const Vector2d& at(uint8_t i, uint8_t j) const;
99 };
100
108 class GF_CORE_API GradientNoise3D : public Noise3D {
109 public:
119
120 double getValue(double x, double y, double z) override;
121
122 private:
123 Step<double> m_step;
124 std::array<uint8_t, 256> m_perm;
125 std::array<Vector3d, 256> m_gradients3D;
126
127 const Vector3d& at(uint8_t i, uint8_t j, uint8_t k) const;
128 };
129
140 class GF_CORE_API BetterGradientNoise2D : public Noise2D {
141 public:
148
149 double getValue(double x, double y) override;
150
151 private:
152 std::array<uint8_t, 256> m_permX;
153 std::array<uint8_t, 256> m_permY;
154 std::array<Vector2d, 256> m_gradients2D;
155
156 const Vector2d& at(uint8_t i, uint8_t j) const;
157 };
158
167 class GF_CORE_API FractalNoise2D : public Noise2D {
168 public:
179 FractalNoise2D(Noise2D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double
180 dimension = 1.0);
181
182 double getValue(double x, double y) override;
183
184 private:
185 Noise2D& m_noise;
186 double m_scale;
187 std::size_t m_octaves;
188 double m_lacunarity;
189 double m_persistence;
190 double m_dimension;
191 };
192
193
202 class GF_CORE_API FractalNoise3D : public Noise3D {
203 public:
214 FractalNoise3D(Noise3D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
215
216 double getValue(double x, double y, double z) override;
217
218 private:
219 Noise3D& m_noise;
220 double m_scale;
221 std::size_t m_octaves;
222 double m_lacunarity;
223 double m_persistence;
224 double m_dimension;
225 };
226
227
237 class GF_CORE_API PerlinNoise2D : public Noise2D {
238 public:
246 PerlinNoise2D(Random& random, double scale, std::size_t octaves = 8);
247
248 double getValue(double x, double y) override;
249
250 private:
251 GradientNoise2D m_gradient;
252 FractalNoise2D m_fractal;
253 };
254
264 class GF_CORE_API PerlinNoise3D : public Noise3D {
265 public:
273 PerlinNoise3D(Random& random, double scale, std::size_t octaves = 8);
274
275 double getValue(double x, double y, double z) override;
276
277 private:
278 GradientNoise3D m_gradient;
279 FractalNoise3D m_fractal;
280 };
281
282
295 class GF_CORE_API SimplexNoise2D : public Noise2D {
296 public:
303
304 double getValue(double x, double y) override;
305
306 private:
307 std::array<uint8_t, 256> m_perm;
308
309 const Vector2d& at(uint8_t i, uint8_t j) const;
310 };
311
312
322 class GF_CORE_API OpenSimplexNoise2D : public Noise2D {
323 public:
330
331 double getValue(double x, double y) override;
332
333 private:
334 std::array<uint8_t, 256> m_perm;
335
336 const Vector2d& at(uint8_t i, uint8_t j) const;
337 };
338
348 class GF_CORE_API OpenSimplexNoise3D : public Noise3D {
349 public:
356
357 double getValue(double x, double y, double z) override;
358
359 private:
360 std::array<uint8_t, 256> m_perm;
361
362 const Vector3d& at(uint8_t i, uint8_t j, uint8_t k) const;
363 };
364
371 class GF_CORE_API WaveletNoise3D : public Noise3D {
372 public:
379 WaveletNoise3D(Random& random, std::ptrdiff_t n = 32);
380
381 double getValue(double x, double y, double z) override;
382
383 private:
384 std::ptrdiff_t m_n;
385 std::vector<double> m_data;
386 };
387
396 class GF_CORE_API WorleyNoise2D : public Noise2D {
397 public:
406 WorleyNoise2D(Random& random, std::size_t count, Distance2<double> distance, std::vector<double> coeffs);
407
408 double getValue(double x, double y) override;
409
410 private:
411 std::size_t m_count;
412 Distance2<double> m_distance;
413 std::vector<double> m_coeffs;
414 std::vector<Vector2d> m_cells;
415 };
416
417
423 class GF_CORE_API Multifractal2D : public Noise2D {
424 public:
435 Multifractal2D(Noise2D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
436
437 double getValue(double x, double y) override;
438
439 private:
440 Noise2D& m_noise;
441 double m_scale;
442 std::size_t m_octaves;
443 double m_lacunarity;
444 double m_persistence;
445 double m_dimension;
446 };
447
448
454 class GF_CORE_API HeteroTerrain2D : public Noise2D {
455 public:
467 HeteroTerrain2D(Noise2D& noise, double scale, double offset = 0.0, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
468
469 double getValue(double x, double y) override;
470
471 private:
472 Noise2D& m_noise;
473 double m_scale;
474 double m_offset;
475 std::size_t m_octaves;
476 double m_lacunarity;
477 double m_persistence;
478 double m_dimension;
479 };
480
486 class GF_CORE_API HybridMultifractal2D : public Noise2D {
487 public:
499 HybridMultifractal2D(Noise2D& noise, double scale, double offset = 0.0, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
500
501 double getValue(double x, double y) override;
502
503 private:
504 Noise2D& m_noise;
505 double m_scale;
506 double m_offset;
507 std::size_t m_octaves;
508 double m_lacunarity;
509 double m_persistence;
510 double m_dimension;
511 };
512
518 class GF_CORE_API RidgedMultifractal2D : public Noise2D {
519 public:
532 RidgedMultifractal2D(Noise2D& noise, double scale, double offset = 1.0, double gain = 1.0, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
533
534 double getValue(double x, double y) override;
535
536 private:
537 Noise2D& m_noise;
538 double m_scale;
539 double m_offset;
540 double m_gain;
541 std::size_t m_octaves;
542 double m_lacunarity;
543 double m_persistence;
544 double m_dimension;
545 };
546
557 class GF_CORE_API Noise3DTo2DAdapter : public Noise2D {
558 public:
566 Noise3DTo2DAdapter(Noise3D& noise, Vector3d normal = Vector3d(0.0, 0.0, 1.0), Vector3d point = Vector3d(0.0, 0.0, 0.0));
567
568 double getValue(double x, double y) override;
569
570 private:
571 Noise3D& m_noise;
572 Vector3d m_normal;
573 Vector3d m_point;
574 };
575
576#ifndef DOXYGEN_SHOULD_SKIP_THIS
577}
578#endif
579}
580
581#endif // GF_NOISES_H
Better gradient 2D noise.
Definition: Noises.h:140
double getValue(double x, double y) override
Take a 2D noise value.
BetterGradientNoise2D(Random &random)
Constructor.
Fractal 2D noise.
Definition: Noises.h:167
double getValue(double x, double y) override
Take a 2D noise value.
FractalNoise2D(Noise2D &noise, double scale, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
Fractal 3D noise.
Definition: Noises.h:202
FractalNoise3D(Noise3D &noise, double scale, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
double getValue(double x, double y, double z) override
Take a 3D noise value.
Gradient 2D noise.
Definition: Noises.h:79
double getValue(double x, double y) override
Take a 2D noise value.
GradientNoise2D(Random &random, Step< double > step)
Constructor.
Gradient 3D noise.
Definition: Noises.h:108
GradientNoise3D(Random &random, Step< double > step)
Constructor.
double getValue(double x, double y, double z) override
Take a 3D noise value.
Hetero Terrain 2D noise.
Definition: Noises.h:454
double getValue(double x, double y) override
Take a 2D noise value.
HeteroTerrain2D(Noise2D &noise, double scale, double offset=0.0, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
Hybrid Multifractal 2D noise.
Definition: Noises.h:486
double getValue(double x, double y) override
Take a 2D noise value.
HybridMultifractal2D(Noise2D &noise, double scale, double offset=0.0, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
Multi Fractal 2D noise.
Definition: Noises.h:423
double getValue(double x, double y) override
Take a 2D noise value.
Multifractal2D(Noise2D &noise, double scale, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
2D A noise function
Definition: Noise.h:35
3D A noise function
Definition: Noise.h:71
An adapter that make a 2D noise from a 3D noise.
Definition: Noises.h:557
Noise3DTo2DAdapter(Noise3D &noise, Vector3d normal=Vector3d(0.0, 0.0, 1.0), Vector3d point=Vector3d(0.0, 0.0, 0.0))
Constructor.
double getValue(double x, double y) override
Take a 2D noise value.
OpenSimplex 2D noise.
Definition: Noises.h:322
double getValue(double x, double y) override
Take a 2D noise value.
OpenSimplexNoise2D(Random &random)
Constructor.
OpenSimplex3D noise.
Definition: Noises.h:348
OpenSimplexNoise3D(Random &random)
Constructor.
double getValue(double x, double y, double z) override
Take a 3D noise value.
Perlin 2D noise.
Definition: Noises.h:237
PerlinNoise2D(Random &random, double scale, std::size_t octaves=8)
Constructor.
double getValue(double x, double y) override
Take a 2D noise value.
Perlin 3D noise.
Definition: Noises.h:264
double getValue(double x, double y, double z) override
Take a 3D noise value.
PerlinNoise3D(Random &random, double scale, std::size_t octaves=8)
Constructor.
A random engine.
Definition: Random.h:47
Ridged Multifractal 2D noise.
Definition: Noises.h:518
RidgedMultifractal2D(Noise2D &noise, double scale, double offset=1.0, double gain=1.0, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
double getValue(double x, double y) override
Take a 2D noise value.
Simplex 2D noise.
Definition: Noises.h:295
double getValue(double x, double y) override
Take a 2D noise value.
SimplexNoise2D(Random &random)
Constructor.
Value 2D noise.
Definition: Noises.h:49
ValueNoise2D(Random &random, Step< double > step)
Constructor.
double getValue(double x, double y) override
Take a 2D noise value.
Wavelet 3D noise.
Definition: Noises.h:371
double getValue(double x, double y, double z) override
Take a 3D noise value.
WaveletNoise3D(Random &random, std::ptrdiff_t n=32)
Constructor.
Worley 2D noise.
Definition: Noises.h:396
WorleyNoise2D(Random &random, std::size_t count, Distance2< double > distance, std::vector< double > coeffs)
Constructor.
double getValue(double x, double y) override
Take a 2D noise value.
GF_CORE_API void scale(Matrix3f &mat, Vector2f factor)
Combine the current transform with a scaling.
Distance< T, 2 > Distance2
A distance function for 2D vectors.
Definition: Vector.h:1376
T(*)(T) Step
A step is a function with special features.
Definition: Math.h:177
Vector< double, 3 > Vector3d
A double vector with 3 components.
Definition: Vector.h:1149
The namespace for gf classes.
Definition: Action.h:35
General purpose math vector.
Definition: Vector.h:61