-
Notifications
You must be signed in to change notification settings - Fork 106
/
Copy pathnoise.h
88 lines (69 loc) · 2.4 KB
/
noise.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#ifndef NOISE_H_
#define NOISE_H_
#include "rng.h"
#include <math.h>
STRUCT(PerlinNoise)
{
uint8_t d[256+1];
uint8_t h2;
double a, b, c;
double amplitude;
double lacunarity;
double d2;
double t2;
};
STRUCT(OctaveNoise)
{
int octcnt;
PerlinNoise *octaves;
};
STRUCT(DoublePerlinNoise)
{
double amplitude;
OctaveNoise octA;
OctaveNoise octB;
};
#ifdef __cplusplus
extern "C"
{
#endif
/// Helper
static inline ATTR(hot, const)
double maintainPrecision(double x)
{ // This is a highly performance critical function that is used to correct
// progressing errors from float-maths. However, since cubiomes uses
// doubles anyway, this seems useless in practice.
//return x - round(x / 33554432.0) * 33554432.0;
return x;
}
/// Perlin noise
void perlinInit(PerlinNoise *noise, uint64_t *seed);
void xPerlinInit(PerlinNoise *noise, Xoroshiro *xr);
double samplePerlin(const PerlinNoise *noise, double x, double y, double z,
double yamp, double ymin);
double sampleSimplex2D(const PerlinNoise *noise, double x, double y);
/// Perlin Octaves
void octaveInit(OctaveNoise *noise, uint64_t *seed, PerlinNoise *octaves,
int omin, int len);
void octaveInitBeta(OctaveNoise *noise, uint64_t *seed, PerlinNoise *octaves,
int octcnt, double lac, double lacMul, double persist, double persistMul);
int xOctaveInit(OctaveNoise *noise, Xoroshiro *xr, PerlinNoise *octaves,
const double *amplitudes, int omin, int len, int nmax);
double sampleOctave(const OctaveNoise *noise, double x, double y, double z);
double sampleOctaveAmp(const OctaveNoise *noise, double x, double y, double z,
double yamp, double ymin, int ydefault);
double sampleOctave2D(const OctaveNoise *noise, double x, double z);
double sampleOctaveBeta17Biome(const OctaveNoise *noise, double x, double z);
void sampleOctaveBeta17Terrain(const OctaveNoise *noise, double *v,
double x, double z, int yLacFlag, double lacmin);
/// Double Perlin
void doublePerlinInit(DoublePerlinNoise *noise, uint64_t *seed,
PerlinNoise *octavesA, PerlinNoise *octavesB, int omin, int len);
int xDoublePerlinInit(DoublePerlinNoise *noise, Xoroshiro *xr,
PerlinNoise *octaves, const double *amplitudes, int omin, int len, int nmax);
double sampleDoublePerlin(const DoublePerlinNoise *noise,
double x, double y, double z);
#ifdef __cplusplus
}
#endif
#endif /* NOISE_H_ */