Gamedev Framework (gf) 1.2.0
A C++17 framework for 2D games
Noises.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2022 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 enum class OpenSimplexType {
313 Super,
314 Fast,
315 };
316
318 Classic,
319 XBeforeY,
320 };
321
323 Classic,
324 XYBeforeZ,
325 XZBeforeY,
326 };
327
337 class GF_CORE_API OpenSimplexNoise2D : public Noise2D {
338 public:
345
347 m_type = type;
348 }
349
351 return m_type;
352 }
353
355 m_variant = variant;
356 }
357
359 return m_variant;
360 }
361
362 double getValue(double x, double y) override;
363
364 private:
365 double getValueBase(double xs, double ys) const;
366
367 private:
368 OpenSimplexType m_type;
369 OpenSimplex2DVariant m_variant;
370 std::array<uint16_t, 2048> m_perm;
371 std::array<Vector2d, 2048> m_gradients2D;
372 };
373
383 class GF_CORE_API OpenSimplexNoise3D : public Noise3D {
384 public:
391
392 double getValue(double x, double y, double z) override;
393
394 private:
395 double getValueBase(double xr, double yr, double zr) const;
396
397 private:
398 OpenSimplexType m_type;
399 OpenSimplex3DVariant m_variant;
400 std::array<uint16_t, 2048> m_perm;
401 std::array<Vector3d, 2048> m_gradients3D;
402 };
403
410 class GF_CORE_API WaveletNoise3D : public Noise3D {
411 public:
418 WaveletNoise3D(Random& random, std::ptrdiff_t n = 32);
419
420 double getValue(double x, double y, double z) override;
421
422 private:
423 std::ptrdiff_t m_n;
424 std::vector<double> m_data;
425 };
426
435 class GF_CORE_API WorleyNoise2D : public Noise2D {
436 public:
445 WorleyNoise2D(Random& random, std::size_t count, Distance2<double> distance, std::vector<double> coeffs);
446
447 double getValue(double x, double y) override;
448
449 private:
450 std::size_t m_count;
451 Distance2<double> m_distance;
452 std::vector<double> m_coeffs;
453 std::vector<Vector2d> m_cells;
454 };
455
456
462 class GF_CORE_API Multifractal2D : public Noise2D {
463 public:
474 Multifractal2D(Noise2D& noise, double scale, std::size_t octaves = 8, double lacunarity = 2.0, double persistence = 0.5, double dimension = 1.0);
475
476 double getValue(double x, double y) override;
477
478 private:
479 Noise2D& m_noise;
480 double m_scale;
481 std::size_t m_octaves;
482 double m_lacunarity;
483 double m_persistence;
484 double m_dimension;
485 };
486
487
493 class GF_CORE_API HeteroTerrain2D : public Noise2D {
494 public:
506 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);
507
508 double getValue(double x, double y) override;
509
510 private:
511 Noise2D& m_noise;
512 double m_scale;
513 double m_offset;
514 std::size_t m_octaves;
515 double m_lacunarity;
516 double m_persistence;
517 double m_dimension;
518 };
519
525 class GF_CORE_API HybridMultifractal2D : public Noise2D {
526 public:
538 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);
539
540 double getValue(double x, double y) override;
541
542 private:
543 Noise2D& m_noise;
544 double m_scale;
545 double m_offset;
546 std::size_t m_octaves;
547 double m_lacunarity;
548 double m_persistence;
549 double m_dimension;
550 };
551
557 class GF_CORE_API RidgedMultifractal2D : public Noise2D {
558 public:
571 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);
572
573 double getValue(double x, double y) override;
574
575 private:
576 Noise2D& m_noise;
577 double m_scale;
578 double m_offset;
579 double m_gain;
580 std::size_t m_octaves;
581 double m_lacunarity;
582 double m_persistence;
583 double m_dimension;
584 };
585
596 class GF_CORE_API Noise3DTo2DAdapter : public Noise2D {
597 public:
605 Noise3DTo2DAdapter(Noise3D& noise, Vector3d normal = Vector3d(0.0, 0.0, 1.0), Vector3d point = Vector3d(0.0, 0.0, 0.0));
606
607 double getValue(double x, double y) override;
608
609 private:
610 Noise3D& m_noise;
611 Vector3d m_normal;
612 Vector3d m_point;
613 };
614
615#ifndef DOXYGEN_SHOULD_SKIP_THIS
616}
617#endif
618}
619
620#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:493
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:525
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:462
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:596
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:337
double getValue(double x, double y) override
Take a 2D noise value.
void setVariant(OpenSimplex2DVariant variant)
Definition: Noises.h:354
OpenSimplexType getType() const
Definition: Noises.h:350
void setType(OpenSimplexType type)
Definition: Noises.h:346
OpenSimplexNoise2D(Random &random, OpenSimplexType type=OpenSimplexType::Super, OpenSimplex2DVariant variant=OpenSimplex2DVariant::Classic)
Constructor.
OpenSimplex2DVariant getVariant() const
Definition: Noises.h:358
OpenSimplex3D noise.
Definition: Noises.h:383
double getValue(double x, double y, double z) override
Take a 3D noise value.
OpenSimplexNoise3D(Random &random, OpenSimplexType type=OpenSimplexType::Super, OpenSimplex3DVariant variant=OpenSimplex3DVariant::Classic)
Constructor.
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 set of random utilities.
Definition: Random.h:83
Ridged Multifractal 2D noise.
Definition: Noises.h:557
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:410
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:435
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
@ Super
Is the Super key pressed?
The namespace for gf classes.
OpenSimplexType
Definition: Noises.h:312
OpenSimplex3DVariant
Definition: Noises.h:322
OpenSimplex2DVariant
Definition: Noises.h:317
General purpose math vector.
Definition: Vector.h:61