Gamedev Framework (gf)  0.2.0
A C++11 framework for 2D games
Noises.h
1 /*
2  * Gamedev Framework (gf)
3  * Copyright (C) 2016 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 "Math.h"
31 #include "Noise.h"
32 #include "Portability.h"
33 #include "Vector.h"
34 
35 
36 namespace gf {
37 #ifndef DOXYGEN_SHOULD_SKIP_THIS
38 inline namespace v1 {
39 #endif
40 
41  class Random;
42 
43 
44  /**
45  * @ingroup core
46  * @brief Gradient 2D noise
47  *
48  * [Gradient noise](https://en.wikipedia.org/wiki/Gradient_noise) is a
49  * lattice-based noise based on gradients.
50  */
51  class GF_API GradientNoise2D : public Noise2D {
52  public:
53  /**
54  * @brief Constructor
55  *
56  * @param random A random engine
57  * @param step A step
58  *
59  * @sa gf::Step
60  */
61  GradientNoise2D(Random& random, Step<double> step);
62 
63  virtual double getValue(double x, double y) override;
64 
65  private:
66  Step<double> m_step;
67  std::array<uint8_t, 256> m_perm;
68  std::array<Vector2d, 256> m_gradients2D;
69 
70  const Vector2d& at(uint8_t i, uint8_t j) const;
71  };
72 
73  /**
74  * @ingroup core
75  * @brief Gradient 3D noise
76  *
77  * [Gradient noise](https://en.wikipedia.org/wiki/Gradient_noise) is a
78  * lattice-based noise based on gradients.
79  */
80  class GF_API GradientNoise3D : public Noise3D {
81  public:
82  /**
83  * @brief Constructor
84  *
85  * @param random A random engine
86  * @param step A step
87  *
88  * @sa gf::Step
89  */
90  GradientNoise3D(Random& random, Step<double> step);
91 
92  virtual double getValue(double x, double y, double z) override;
93 
94  private:
95  Step<double> m_step;
96  std::array<uint8_t, 256> m_perm;
97  std::array<Vector3d, 256> m_gradients3D;
98 
99  const Vector3d& at(uint8_t i, uint8_t j, uint8_t k) const;
100  };
101 
102  /**
103  * @ingroup core
104  * @brief Fractal 2D noise
105  *
106  * Fractal noise is based of fractional Brownian motion (fBm). It consists
107  * in adding several octaves of a basic noise at different amplitudes.
108  *
109  */
110  class GF_API FractalNoise2D : public Noise2D {
111  public:
112  /**
113  * @brief Constructor
114  *
115  * @param noise The basic noise function
116  * @param scale The scale factor
117  * @param octaves The number of octaves
118  * @param lacunarity The factor applied to frequency
119  * @param persistence The factor applied to amplitude
120  * @param dimension The contrast between the layers
121  */
122  FractalNoise2D(Noise2D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double
123  dimension = 1.0);
124 
125  virtual double getValue(double x, double y) override;
126 
127  private:
128  Noise2D& m_noise;
129  double m_scale;
130  std::size_t m_octaves;
131  double m_lacunarity;
132  double m_persistence;
133  double m_dimension;
134  };
135 
136 
137  /**
138  * @ingroup core
139  * @brief Fractal 3D noise
140  *
141  * Fractal noise is based of fractional Brownian motion (fBm). It consists
142  * in adding several octaves of a basic noise at different amplitudes.
143  *
144  */
145  class GF_API FractalNoise3D : public Noise3D {
146  public:
147  /**
148  * @brief Constructor
149  *
150  * @param noise The basic noise function
151  * @param scale The scale factor
152  * @param octaves The number of octaves
153  * @param lacunarity The factor applied to frequency
154  * @param persistence The factor applied to amplitude
155  * @param dimension The contrast between the layers
156  */
157  FractalNoise3D(Noise3D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double
158  dimension = 1.0);
159 
160  virtual double getValue(double x, double y, double z) override;
161 
162  private:
163  Noise3D& m_noise;
164  double m_scale;
165  std::size_t m_octaves;
166  double m_lacunarity;
167  double m_persistence;
168  double m_dimension;
169  };
170 
171 
172  /**
173  * @ingroup core
174  * @brief Perlin 2D noise
175  *
176  * [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) is the
177  * combination of a fractal noise and a gradient noise.
178  *
179  * @sa gf::GradientNoise2D, gf::FractalNoise2D
180  */
181  class GF_API PerlinNoise2D : public Noise2D {
182  public:
183  /**
184  * @brief Constructor
185  *
186  * @param random A random engine
187  * @param scale The scale factor
188  * @param octaves The number of octaves
189  */
190  PerlinNoise2D(Random& random, double scale, std::size_t octaves = 8);
191 
192  virtual double getValue(double x, double y) override;
193 
194  private:
195  GradientNoise2D m_gradient;
196  FractalNoise2D m_fractal;
197  };
198 
199  /**
200  * @ingroup core
201  * @brief Perlin 3D noise
202  *
203  * [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) is the
204  * combination of a fractal noise and a gradient noise.
205  *
206  * @sa gf::GradientNoise3D, gf::FractalNoise3D
207  */
208  class GF_API PerlinNoise3D : public Noise3D {
209  public:
210  /**
211  * @brief Constructor
212  *
213  * @param random A random engine
214  * @param scale The scale factor
215  * @param octaves The number of octaves
216  */
217  PerlinNoise3D(Random& random, double scale, std::size_t octaves = 8);
218 
219  virtual double getValue(double x, double y, double z) override;
220 
221  private:
222  GradientNoise3D m_gradient;
223  FractalNoise3D m_fractal;
224  };
225 
226 
227  /**
228  * @ingroup core
229  * @brief Simplex 2D noise
230  *
231  * [Simplex noise](https://en.wikipedia.org/wiki/Simplex_noise) is a lattice
232  * noise based on gradients put on a simplex.
233  *
234  * This implementation is limited to 2D noise and is *not* submitted to the
235  * patent that covers simplex noise.
236  *
237  * @sa gf::GradientNoise2D
238  */
239  class GF_API SimplexNoise2D : public Noise2D {
240  public:
241  /**
242  * @brief Constructor
243  *
244  * @param random A random engine
245  */
246  SimplexNoise2D(Random& random);
247 
248  virtual double getValue(double x, double y) override;
249 
250  private:
251  std::array<uint8_t, 256> m_perm;
252 
253  const Vector2d& at(uint8_t i, uint8_t j) const;
254  };
255 
256 
257  /**
258  * @ingroup core
259  * @brief OpenSimplex 2D noise
260  *
261  * [OpenSimplex noise](https://en.wikipedia.org/wiki/OpenSimplex_noise) is a lattice
262  * noise very similar to simplex noise.
263  *
264  * @sa gf::SimplexNoise2D
265  */
267  public:
268  /**
269  * @brief Constructor
270  *
271  * @param random A random engine
272  */
273  OpenSimplexNoise2D(Random& random);
274 
275  virtual double getValue(double x, double y) override;
276 
277  private:
278  std::array<uint8_t, 256> m_perm;
279 
280  const Vector2d& at(uint8_t i, uint8_t j) const;
281  };
282 
283  /**
284  * @ingroup core
285  * @brief OpenSimplex3D noise
286  *
287  * [OpenSimplex noise](https://en.wikipedia.org/wiki/OpenSimplex_noise) is a lattice
288  * noise very similar to simplex noise.
289  *
290  * @sa gf::SimplexNoise
291  */
293  public:
294  /**
295  * @brief Constructor
296  *
297  * @param random A random engine
298  */
299  OpenSimplexNoise3D(Random& random);
300 
301  virtual double getValue(double x, double y, double z) override;
302 
303  private:
304  std::array<uint8_t, 256> m_perm;
305 
306  const Vector3d& at(uint8_t i, uint8_t j, uint8_t k) const;
307  };
308 
309 
310  /**
311  * @ingroup core
312  * @brief Worley 2D noise
313  *
314  * [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) is a point
315  * based noise. It is also known as Voronoi noise or cellular noise or
316  * simply cell noise.
317  */
318  class GF_API WorleyNoise2D : public Noise2D {
319  public:
320  /**
321  * @brief Constructor
322  *
323  * @param random A random engine
324  * @param count The number of points
325  * @param distance A distance function
326  * @param coeffs The coefficients for the noise
327  */
328  WorleyNoise2D(Random& random, std::size_t count, Distance2<double> distance, std::vector<double> coeffs);
329 
330  virtual double getValue(double x, double y) override;
331 
332  private:
333  std::size_t m_count;
334  Distance2<double> m_distance;
335  std::vector<double> m_coeffs;
336  std::vector<Vector2d> m_cells;
337  };
338 
339 #ifndef DOXYGEN_SHOULD_SKIP_THIS
340 }
341 #endif
342 }
343 
344 #endif // GF_NOISES_H
A random engine.
Definition: Random.h:43
WorleyNoise2D(Random &random, std::size_t count, Distance2< double > distance, std::vector< double > coeffs)
Constructor.
virtual double getValue(double x, double y) override
Take a 2D noise value.
Gradient 3D noise.
Definition: Noises.h:80
Gradient 2D noise.
Definition: Noises.h:51
FractalNoise3D(Noise3D &noise, double scale, std::size_t octaves=8, double lacunarity=2.0, double persistence=0.5, double dimension=1.0)
Constructor.
virtual double getValue(double x, double y) override
Take a 2D noise value.
2D A noise function
Definition: Noise.h:34
3D A noise function
Definition: Noise.h:69
virtual double getValue(double x, double y, double z) override
Take a 3D noise value.
OpenSimplex3D noise.
Definition: Noises.h:292
GradientNoise2D(Random &random, Step< double > step)
Constructor.
OpenSimplex 2D noise.
Definition: Noises.h:266
virtual double getValue(double x, double y) override
Take a 2D noise value.
Worley 2D noise.
Definition: Noises.h:318
GradientNoise3D(Random &random, Step< double > step)
Constructor.
OpenSimplexNoise3D(Random &random)
Constructor.
PerlinNoise3D(Random &random, double scale, std::size_t octaves=8)
Constructor.
Definition: Action.h:34
PerlinNoise2D(Random &random, double scale, std::size_t octaves=8)
Constructor.
Perlin 2D noise.
Definition: Noises.h:181
Perlin 3D noise.
Definition: Noises.h:208
virtual double getValue(double x, double y, double z) override
Take a 3D noise value.
virtual double getValue(double x, double y, double z) override
Take a 3D 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.
virtual double getValue(double x, double y, double z) override
Take a 3D noise value.
Fractal 3D noise.
Definition: Noises.h:145
virtual double getValue(double x, double y) override
Take a 2D noise value.
Fractal 2D noise.
Definition: Noises.h:110
OpenSimplexNoise2D(Random &random)
Constructor.
virtual double getValue(double x, double y) override
Take a 2D noise value.
SimplexNoise2D(Random &random)
Constructor.
Simplex 2D noise.
Definition: Noises.h:239
#define GF_API
Definition: Portability.h:35
virtual double getValue(double x, double y) override
Take a 2D noise value.