Gamedev Framework (gf)  0.19.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 
35 namespace gf {
36 #ifndef DOXYGEN_SHOULD_SKIP_THIS
37 inline namespace v1 {
38 #endif
39 
40  class Random;
41 
49  class GF_CORE_API ValueNoise2D : public Noise2D {
50  public:
59  ValueNoise2D(Random& random, Step<double> step);
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:
89  GradientNoise2D(Random& random, Step<double> step);
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:
118  GradientNoise3D(Random& random, Step<double> step);
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:
147  BetterGradientNoise2D(Random& random);
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:
302  SimplexNoise2D(Random& random);
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:
329  OpenSimplexNoise2D(Random& random);
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:
355  OpenSimplexNoise3D(Random& random);
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
A random engine.
Definition: Random.h:47
GF_CORE_API void scale(Matrix3f &mat, Vector2f factor)
Combine the current transform with a scaling.
Gradient 3D noise.
Definition: Noises.h:108
Gradient 2D noise.
Definition: Noises.h:79
2D A noise function
Definition: Noise.h:35
3D A noise function
Definition: Noise.h:71
Ridged Multifractal 2D noise.
Definition: Noises.h:518
OpenSimplex3D noise.
Definition: Noises.h:348
OpenSimplex 2D noise.
Definition: Noises.h:322
Worley 2D noise.
Definition: Noises.h:396
The namespace for gf classes.
Definition: Action.h:35
Perlin 2D noise.
Definition: Noises.h:237
Perlin 3D noise.
Definition: Noises.h:264
Fractal 3D noise.
Definition: Noises.h:202
Fractal 2D noise.
Definition: Noises.h:167
Wavelet 3D noise.
Definition: Noises.h:371
T(*)(T) Step
A step is a function with special features.
Definition: Math.h:177
An adapter that make a 2D noise from a 3D noise.
Definition: Noises.h:557
Value 2D noise.
Definition: Noises.h:49
Hybrid Multifractal 2D noise.
Definition: Noises.h:486
Simplex 2D noise.
Definition: Noises.h:295
Vector< double, 3 > Vector3d
A double vector with 3 components.
Definition: Vector.h:1149
General purpose math vector.
Definition: Vector.h:61
Better gradient 2D noise.
Definition: Noises.h:140
Multi Fractal 2D noise.
Definition: Noises.h:423
Distance< T, 2 > Distance2
A distance function for 2D vectors.
Definition: Vector.h:1376
Hetero Terrain 2D noise.
Definition: Noises.h:454