2
2
struct FBM < Source> : Noise where Source: Noise
3
3
{
4
4
private
5
- let generators : [ Source ] ,
6
- octaves : Int ,
7
- persistence : Double ,
8
- lacunarity : Double ,
9
- amplitude : Double
5
+ let generators : [ Source ]
10
6
11
7
// UNDOCUMENTED
12
8
public
@@ -29,45 +25,31 @@ struct FBM<Source>:Noise where Source:Noise
29
25
init ( generators: [ Source ] )
30
26
{
31
27
self . generators = generators
32
-
33
- self . octaves = 1
34
- self . persistence = 0.5
35
- self . lacunarity = 2
36
- self . amplitude = 1
37
28
}
38
29
39
30
@available ( * , unavailable, message: " init(amplitude:frequency:seed:) defaults to octaves = 1, which does not make sense for FBM modules " )
40
31
public
41
32
init ( amplitude: Double , frequency: Double , seed: Int )
42
33
{
43
34
self . generators = [ ]
44
-
45
- self . octaves = 1
46
- self . persistence = 0.5
47
- self . lacunarity = 2
48
- self . amplitude = 1
49
35
}
50
36
51
37
@available ( * , unavailable, message: " use init(_:octaves:persistence:lacunarity:) instead " )
52
38
public
53
39
init ( amplitude: Double , frequency: Double , octaves: Int , persistence: Double = 0.75 , lacunarity: Double = 2 , seed: Int = 0 )
54
40
{
55
41
self . generators = [ ]
56
-
57
- self . octaves = 1
58
- self . persistence = 0.5
59
- self . lacunarity = 2
60
- self . amplitude = 1
61
42
}
62
43
63
44
// UNDOCUMENTED, default was changed from 0.75 to 0.5
64
45
public
65
46
init ( _ source: Source , octaves: Int , persistence: Double = 0.5 , lacunarity: Double = 2 )
66
47
{
67
48
// calculate maximum range
49
+ let range_inverse : Double
68
50
if persistence == 0.5
69
51
{
70
- self . amplitude = Double ( 1 << ( octaves - 1 ) ) / Double( 1 << octaves - 1 )
52
+ range_inverse = Double ( 1 << ( octaves - 1 ) ) / Double( 1 << octaves - 1 )
71
53
}
72
54
else
73
55
{
@@ -79,63 +61,48 @@ struct FBM<Source>:Noise where Source:Noise
79
61
contribution *= persistence
80
62
}
81
63
82
- self . amplitude = 1 / accumulation
64
+ range_inverse = 1 / accumulation
83
65
}
84
66
85
- var generators : [ Source ] = [ source]
67
+ var generators : [ Source ] = [ source. amplitude_scaled ( by : range_inverse ) ]
86
68
generators. reserveCapacity ( octaves)
87
69
for i in ( 0 ..< octaves - 1 )
88
70
{
89
- generators. append ( generators [ i] . reseeded ( ) )
71
+ generators. append ( generators [ i] . amplitude_scaled ( by : persistence ) . frequency_scaled ( by : lacunarity ) . reseeded ( ) )
90
72
}
91
73
92
74
self . generators = generators
93
- self . octaves = octaves
94
- self . persistence = persistence
95
- self . lacunarity = lacunarity
96
75
}
97
76
98
77
public
99
78
func evaluate( _ x: Double , _ y: Double ) -> Double
100
79
{
101
- var Σ : Double = 0 ,
102
- a : Double = self . amplitude,
103
- f : Double = 1
80
+ var Σ : Double = 0
104
81
for generator in self . generators
105
82
{
106
- Σ += a * generator. evaluate ( f * x, f * y)
107
- a *= self . persistence
108
- f *= self . lacunarity
83
+ Σ += generator. evaluate ( x, y) // a .reduce(:{}) is much slower than a simple loop
109
84
}
110
85
return Σ
111
86
}
112
87
113
88
public
114
89
func evaluate( _ x: Double , _ y: Double , _ z: Double ) -> Double
115
90
{
116
- var Σ : Double = 0 ,
117
- a : Double = self . amplitude,
118
- f : Double = 1
91
+ var Σ : Double = 0
119
92
for generator in self . generators
120
93
{
121
- Σ += a * generator. evaluate ( f * x, f * y, f * z)
122
- a *= self . persistence
123
- f *= self . lacunarity
94
+ Σ += generator. evaluate ( x, y, z)
124
95
}
125
96
return Σ
126
97
}
127
98
128
99
public
129
100
func evaluate( _ x: Double , _ y: Double , _ z: Double , _ w: Double ) -> Double
130
101
{
131
- var Σ : Double = 0 ,
132
- a : Double = self . amplitude,
133
- f : Double = 1
102
+ var Σ : Double = 0
134
103
for generator in self . generators
135
104
{
136
- Σ += a * generator. evaluate ( f * x, f * y, f * z, f * w)
137
- a *= self . persistence
138
- f *= self . lacunarity
105
+ Σ += generator. evaluate ( x, y, z, w)
139
106
}
140
107
return Σ
141
108
}
@@ -147,8 +114,7 @@ struct DistortedNoise<Source, Displacement>:Noise where Source:Noise, Displaceme
147
114
{
148
115
private
149
116
let source : Source ,
150
- displacement : Displacement ,
151
- strength : Double
117
+ displacement : Displacement
152
118
153
119
public
154
120
func amplitude_scaled( by factor: Double ) -> DistortedNoise < Source , Displacement >
@@ -171,48 +137,46 @@ struct DistortedNoise<Source, Displacement>:Noise where Source:Noise, Displaceme
171
137
}
172
138
173
139
public
174
- init ( displacing source: Source , with displacement: Displacement , strength : Double = 1 )
140
+ init ( displacing source: Source , with displacement: Displacement )
175
141
{
176
142
self . source = source
177
143
self . displacement = displacement
178
- self . strength = strength
179
144
}
180
145
181
146
public
182
147
func evaluate( _ x: Double , _ y: Double ) -> Double
183
148
{
184
- let dx : Double = self . strength * self . displacement. evaluate ( x, y) ,
185
- dy : Double = self . strength * self . displacement. evaluate ( y, x)
149
+ let dx : Double = self . displacement. evaluate ( x, y) ,
150
+ dy : Double = self . displacement. evaluate ( y, x)
186
151
return self . source. evaluate ( x + dx, y + dy)
187
152
}
188
153
189
154
public
190
155
func evaluate( _ x: Double , _ y: Double , _ z: Double ) -> Double
191
156
{
192
- let dx : Double = self . strength * self . displacement. evaluate ( x, y, z) ,
193
- dy : Double = self . strength * self . displacement. evaluate ( y, z, x) ,
194
- dz : Double = self . strength * self . displacement. evaluate ( z, x, y)
157
+ let dx : Double = self . displacement. evaluate ( x, y, z) ,
158
+ dy : Double = self . displacement. evaluate ( y, z, x) ,
159
+ dz : Double = self . displacement. evaluate ( z, x, y)
195
160
return self . source. evaluate ( x + dx, y + dy, z + dz)
196
161
}
197
162
198
163
public
199
164
func evaluate( _ x: Double , _ y: Double , _ z: Double , _ w: Double ) -> Double
200
165
{
201
- let dx : Double = self . strength * self . displacement. evaluate ( x, y, z, w) ,
202
- dy : Double = self . strength * self . displacement. evaluate ( y, z, w, x) ,
203
- dz : Double = self . strength * self . displacement. evaluate ( z, w, x, y) ,
204
- dw : Double = self . strength * self . displacement. evaluate ( w, x, y, z)
166
+ let dx : Double = self . displacement. evaluate ( x, y, z, w) ,
167
+ dy : Double = self . displacement. evaluate ( y, z, w, x) ,
168
+ dz : Double = self . displacement. evaluate ( z, w, x, y) ,
169
+ dw : Double = self . displacement. evaluate ( w, x, y, z)
205
170
return self . source. evaluate ( x + dx, y + dy, z + dz, w + dw)
206
171
}
207
172
}
208
173
209
174
extension DistortedNoise where Source == Displacement
210
175
{
211
176
public
212
- init ( _ source: Source , strength: Double = 1 )
177
+ init ( _ source: Source , strength: Double )
213
178
{
214
179
self . source = source
215
- self . displacement = source
216
- self . strength = strength
180
+ self . displacement = source. amplitude_scaled ( by: strength)
217
181
}
218
182
}
0 commit comments