Pioneer
Loading...
Searching...
No Matches
TerrainNoise.h
Go to the documentation of this file.
1// Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef _TERRAINNOISE_H
5#define _TERRAINNOISE_H
6
7#include "perlin.h"
8#include "../libs.h"
9
10namespace TerrainNoise {
11
12 // octavenoise functions return range [0,1] if persistence = 0.5
13 inline double octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
14 {
15 //assert(persistence <= (1.0 / def.lacunarity));
16 double n = 0;
17 double amplitude = persistence;
18 double frequency = def.frequency;
19 for (int i = 0; i < def.octaves; i++) {
20 n += amplitude * noise(frequency * p);
21 amplitude *= persistence;
22 frequency *= def.lacunarity;
23 }
24 return (n + 1.0) * 0.5;
25 }
26
27 inline double river_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
28 {
29 //assert(persistence <= (1.0 / def.lacunarity));
30 double n = 0;
31 double amplitude = persistence;
32 double frequency = def.frequency;
33 for (int i = 0; i < def.octaves; i++) {
34 n += amplitude * fabs(noise(frequency * p));
35 amplitude *= persistence;
36 frequency *= def.lacunarity;
37 }
38 return fabs(n);
39 }
40
41 inline double ridged_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
42 {
43 //assert(persistence <= (1.0 / def.lacunarity));
44 double n = 0;
45 double amplitude = persistence;
46 double frequency = def.frequency;
47 for (int i = 0; i < def.octaves; i++) {
48 n += amplitude * noise(frequency * p);
49 amplitude *= persistence;
50 frequency *= def.lacunarity;
51 }
52 n = 1.0 - fabs(n);
53 n *= n;
54 return n;
55 }
56
57 inline double billow_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
58 {
59 //assert(persistence <= (1.0 / def.lacunarity));
60 double n = 0;
61 double amplitude = persistence;
62 double frequency = def.frequency;
63 for (int i = 0; i < def.octaves; i++) {
64 n += amplitude * noise(frequency * p);
65 amplitude *= persistence;
66 frequency *= def.lacunarity;
67 }
68 return (2.0 * fabs(n) - 1.0) + 1.0;
69 }
70
71 inline double voronoiscam_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
72 {
73 //assert(persistence <= (1.0 / def.lacunarity));
74 double n = 0;
75 double amplitude = persistence;
76 double frequency = def.frequency;
77 for (int i = 0; i < def.octaves; i++) {
78 n += amplitude * noise(frequency * p);
79 amplitude *= persistence;
80 frequency *= def.lacunarity;
81 }
82 return sqrt(10.0 * fabs(n));
83 }
84
85 inline double dunes_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
86 {
87 //assert(persistence <= (1.0 / def.lacunarity));
88 double n = 0;
89 double amplitude = persistence;
90 double frequency = def.frequency;
91 for (int i = 0; i < 3; i++) {
92 n += amplitude * noise(frequency * p);
93 amplitude *= persistence;
94 frequency *= def.lacunarity;
95 }
96 return 1.0 - fabs(n);
97 }
98
99 // XXX merge these with their fracdef versions
100 inline double octavenoise(int octaves, const double persistence, const double lacunarity, const vector3d &p)
101 {
102 //assert(persistence <= (1.0 / lacunarity));
103 double n = 0;
104 double amplitude = persistence;
105 double frequency = 1.0;
106 while (octaves--) {
107 n += amplitude * noise(frequency * p);
108 amplitude *= persistence;
109 frequency *= lacunarity;
110 }
111 return (n + 1.0) * 0.5;
112 }
113
114 inline double river_octavenoise(int octaves, const double persistence, const double lacunarity, const vector3d &p)
115 {
116 //assert(persistence <= (1.0 / lacunarity));
117 double n = 0;
118 double amplitude = persistence;
119 double frequency = 1.0;
120 while (octaves--) {
121 n += amplitude * fabs(noise(frequency * p));
122 amplitude *= persistence;
123 frequency *= lacunarity;
124 }
125 return n;
126 }
127
128 inline double ridged_octavenoise(int octaves, const double persistence, const double lacunarity, const vector3d &p)
129 {
130 //assert(persistence <= (1.0 / lacunarity));
131 double n = 0;
132 double amplitude = persistence;
133 double frequency = 1.0;
134 while (octaves--) {
135 n += amplitude * noise(frequency * p);
136 amplitude *= persistence;
137 frequency *= lacunarity;
138 }
139 n = 1.0 - fabs(n);
140 n *= n;
141 return n;
142 }
143
144 inline double billow_octavenoise(int octaves, const double persistence, const double lacunarity, const vector3d &p)
145 {
146 //assert(persistence <= (1.0 / lacunarity));
147 double n = 0;
148 double amplitude = persistence;
149 double frequency = 1.0;
150 while (octaves--) {
151 n += amplitude * noise(frequency * p);
152 amplitude *= persistence;
153 frequency *= lacunarity;
154 }
155 return (2.0 * fabs(n) - 1.0) + 1.0;
156 }
157
158 inline double voronoiscam_octavenoise(int octaves, const double persistence, const double lacunarity, const vector3d &p)
159 {
160 //assert(persistence <= (1.0 / lacunarity));
161 double n = 0;
162 double amplitude = persistence;
163 double frequency = 1.0;
164 while (octaves--) {
165 n += amplitude * noise(frequency * p);
166 amplitude *= persistence;
167 frequency *= lacunarity;
168 }
169 return sqrt(10.0 * fabs(n));
170 }
171
172 // not really a noise function but no better place for it
173 inline vector3d interpolate_color(const double n, const vector3d &start, const vector3d &end)
174 {
175 const double nClamped = Clamp(n, 0.0, 1.0);
176 return start * (1.0 - nClamped) + end * nClamped;
177 }
178
179} // namespace TerrainNoise
180
181// common colours for earthlike worlds
182// XXX better way to do this?
183
184#define terrain_colournoise_rock octavenoise(GetFracDef(0), 0.65, p)
185#define terrain_colournoise_rock2 octavenoise(GetFracDef(1), 0.6, p) * 0.6 * ridged_octavenoise(GetFracDef(0), 0.55, p)
186// #define terrain_colournoise_rock3 0.5*ridged_octavenoise(GetFracDef(0), 0.5, p)*voronoiscam_octavenoise(GetFracDef(0), 0.5, p)*ridged_octavenoise(GetFracDef(1), 0.5, p)
187// #define terrain_colournoise_rock4 0.5*ridged_octavenoise(GetFracDef(1), 0.5, p)*octavenoise(GetFracDef(1), 0.5, p)*octavenoise(GetFracDef(5), 0.5, p)
188#define terrain_colournoise_mud 0.1 * voronoiscam_octavenoise(GetFracDef(1), 0.5, p) * octavenoise(GetFracDef(1), 0.5, p) * GetFracDef(5).amplitude
189#define terrain_colournoise_sand ridged_octavenoise(GetFracDef(0), 0.4, p) * dunes_octavenoise(GetFracDef(2), 0.4, p) + 0.1 * dunes_octavenoise(GetFracDef(1), 0.5, p)
190#define terrain_colournoise_sand2 dunes_octavenoise(GetFracDef(0), 0.6, p) * octavenoise(GetFracDef(4), 0.6, p)
191// #define terrain_colournoise_sand3 dunes_octavenoise(GetFracDef(2), 0.6, p)*dunes_octavenoise(GetFracDef(6), 0.6, p)
192#define terrain_colournoise_grass billow_octavenoise(GetFracDef(1), 0.8, p)
193#define terrain_colournoise_grass2 billow_octavenoise(GetFracDef(3), 0.6, p) * voronoiscam_octavenoise(GetFracDef(4), 0.6, p) * river_octavenoise(GetFracDef(5), 0.6, p)
194#define terrain_colournoise_forest octavenoise(GetFracDef(1), 0.65, p) * voronoiscam_octavenoise(GetFracDef(2), 0.65, p)
195#define terrain_colournoise_water dunes_octavenoise(GetFracDef(6), 0.6, p)
196
197#endif
const T & Clamp(const T &x, const T &min, const T &max)
Definition libs.h:69
Definition TerrainNoise.h:10
vector3d interpolate_color(const double n, const vector3d &start, const vector3d &end)
Definition TerrainNoise.h:173
double voronoiscam_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:71
double river_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:27
double billow_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:57
double ridged_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:41
double octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:13
double dunes_octavenoise(const fracdef_t &def, const double persistence, const vector3d &p)
Definition TerrainNoise.h:85
double noise(const vector3d &p)
Definition perlin.cpp:114
Definition FracDef.h:4
double lacunarity
Definition FracDef.h:12
int octaves
Definition FracDef.h:13
double frequency
Definition FracDef.h:11