Skip to content

Commit 5cffe69

Browse files
committed
fix compile breakage, move FBM and DistortedNoise into their own file, and got rid of the BaseNoise protocol, and marked legacy FBM intializer as unavailable
1 parent 7a4b07a commit 5cffe69

File tree

4 files changed

+184
-207
lines changed

4 files changed

+184
-207
lines changed

sources/noise/cell.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
public
2-
struct CellNoise2D:HashedNoise, BaseNoise
2+
struct CellNoise2D:HashedNoise
33
{
44
let permutation_table:PermutationTable,
55
amplitude:Double,
@@ -195,7 +195,7 @@ struct CellNoise2D:HashedNoise, BaseNoise
195195
}
196196

197197
public
198-
struct CellNoise3D:HashedNoise, BaseNoise
198+
struct CellNoise3D:HashedNoise
199199
{
200200
let permutation_table:PermutationTable,
201201
amplitude:Double,

sources/noise/compounds.swift

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
public
2+
struct FBM<Source>:Noise where Source:Noise
3+
{
4+
private
5+
let generators:[Source]
6+
7+
// UNDOCUMENTED
8+
public
9+
func amplitude_scaled(by factor:Double) -> FBM
10+
{
11+
return FBM<Source>(generators: self.generators.map{ $0.amplitude_scaled(by: factor) })
12+
}
13+
public
14+
func frequency_scaled(by factor:Double) -> FBM
15+
{
16+
return FBM<Source>(generators: self.generators.map{ $0.frequency_scaled(by: factor) })
17+
}
18+
public
19+
func reseeded() -> FBM
20+
{
21+
return FBM<Source>(generators: self.generators.map{ $0.reseeded() })
22+
}
23+
24+
private
25+
init(generators:[Source])
26+
{
27+
self.generators = generators
28+
}
29+
30+
@available(*, unavailable, message: "init(amplitude:frequency:seed:) defaults to octaves = 1, which does not make sense for FBM modules")
31+
public
32+
init(amplitude:Double, frequency:Double, seed:Int)
33+
{
34+
self.generators = []
35+
}
36+
37+
@available(*, unavailable, message: "use init(source:octaves:persistence:lacunarity:) instead")
38+
public
39+
init(amplitude:Double, frequency:Double, octaves:Int, persistence:Double = 0.75, lacunarity:Double = 2, seed:Int = 0)
40+
{
41+
self.generators = []
42+
}
43+
44+
// UNDOCUMENTED, default was changed from 0.75 to 0.5
45+
public
46+
init(source:Source, octaves:Int, persistence:Double = 0.5, lacunarity:Double = 2)
47+
{
48+
// calculate maximum range
49+
let range_inverse:Double
50+
if persistence == 0.5
51+
{
52+
range_inverse = Double(1 << (octaves - 1)) / Double(1 << octaves - 1)
53+
}
54+
else
55+
{
56+
var accumulation:Double = 1,
57+
contribution:Double = persistence
58+
for _ in (0 ..< octaves - 1)
59+
{
60+
accumulation += contribution
61+
contribution *= persistence
62+
}
63+
64+
range_inverse = 1 / accumulation
65+
}
66+
67+
var generators:[Source] = [source.amplitude_scaled(by: range_inverse)]
68+
generators.reserveCapacity(octaves)
69+
for i in (0 ..< octaves - 1)
70+
{
71+
generators.append(generators[i].amplitude_scaled(by: persistence).frequency_scaled(by: lacunarity).reseeded())
72+
}
73+
74+
self.generators = generators
75+
}
76+
77+
public
78+
func evaluate(_ x:Double, _ y:Double) -> Double
79+
{
80+
var z:Double = 0
81+
for generator in self.generators
82+
{
83+
z += generator.evaluate(x, y) // a .reduce(:{}) is much slower than a simple loop
84+
}
85+
return z
86+
}
87+
88+
public
89+
func evaluate(_ x:Double, _ y:Double, _ z:Double) -> Double
90+
{
91+
var w:Double = 0
92+
for generator in self.generators
93+
{
94+
w += generator.evaluate(x, y, z)
95+
}
96+
return w
97+
}
98+
99+
public
100+
func evaluate(_ x:Double, _ y:Double, _ z:Double, _ w:Double) -> Double
101+
{
102+
var u:Double = 0
103+
for generator in self.generators
104+
{
105+
u += generator.evaluate(x, y, z, w)
106+
}
107+
return u
108+
}
109+
}
110+
111+
// UNDOCUMENTED
112+
struct DistortedNoise<Source, Displacement>:Noise where Source:Noise, Displacement:Noise
113+
{
114+
private
115+
let source:Source,
116+
displacement:Displacement
117+
118+
public
119+
func amplitude_scaled(by factor:Double) -> DistortedNoise<Source, Displacement>
120+
{
121+
return DistortedNoise<Source, Displacement>(displacing: self.source.amplitude_scaled(by: factor),
122+
with: self.displacement)
123+
}
124+
public
125+
func frequency_scaled(by factor:Double) -> DistortedNoise<Source, Displacement>
126+
{
127+
return DistortedNoise<Source, Displacement>(displacing: self.source.frequency_scaled(by: factor),
128+
with: self.displacement.frequency_scaled(by: factor)
129+
.amplitude_scaled(by: factor))
130+
}
131+
public
132+
func reseeded() -> DistortedNoise<Source, Displacement>
133+
{
134+
return DistortedNoise<Source, Displacement>(displacing: self.source.reseeded(),
135+
with: self.displacement.reseeded())
136+
}
137+
138+
init(displacing source:Source, with displacement:Displacement)
139+
{
140+
self.source = source
141+
self.displacement = displacement
142+
}
143+
144+
/*
145+
init(source:Source, strength:Double)
146+
{
147+
self.source = source
148+
self.displacement = source.amplitude_scaled(by: strength)
149+
}
150+
*/
151+
152+
public
153+
func evaluate(_ x: Double, _ y: Double) -> Double
154+
{
155+
let dx:Double = self.displacement.evaluate(x, y),
156+
dy:Double = self.displacement.evaluate(y, x)
157+
return self.source.evaluate(x + dx, y + dy)
158+
}
159+
160+
public
161+
func evaluate(_ x: Double, _ y: Double, _ z: Double) -> Double
162+
{
163+
let dx:Double = 1.0 + self.displacement.evaluate(x, y, z),
164+
dy:Double = 1.0 + self.displacement.evaluate(y, z, x),
165+
dz:Double = 1.0 + self.displacement.evaluate(z, x, y)
166+
return self.source.evaluate(x + dx, y + dy, z + dz)
167+
}
168+
169+
public
170+
func evaluate(_ x: Double, _ y: Double, _ z: Double, _ w:Double) -> Double
171+
{
172+
let dx:Double = self.displacement.evaluate(x, y, z, w),
173+
dy:Double = self.displacement.evaluate(y, z, w, x),
174+
dz:Double = self.displacement.evaluate(z, w, x, y),
175+
dw:Double = self.displacement.evaluate(w, x, y, z)
176+
return self.source.evaluate(x + dx, y + dy, z + dz, w + dw)
177+
}
178+
}

sources/noise/gradient.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ enum Const
88

99
// UNDOCUMENTED
1010
public
11-
struct ClassicNoise3D:HashedNoise, BaseNoise
11+
struct ClassicNoise3D:HashedNoise
1212
{
1313
let permutation_table:PermutationTable,
1414
amplitude:Double,
@@ -85,7 +85,7 @@ struct ClassicNoise3D:HashedNoise, BaseNoise
8585

8686
@available(*, deprecated, message: "simplex noise nearly identical to and is an inferior implementation of super simplex noise")
8787
public
88-
struct SimplexNoise2D:HashedNoise, BaseNoise
88+
struct SimplexNoise2D:HashedNoise
8989
{
9090
private static
9191
let gradient_table32:[Math.DoubleV2] =
@@ -261,7 +261,7 @@ struct SimplexNoise2D:HashedNoise, BaseNoise
261261
public
262262
typealias SuperSimplexNoise2D = GradientNoise2D
263263
public
264-
struct GradientNoise2D:HashedNoise, BaseNoise
264+
struct GradientNoise2D:HashedNoise
265265
{
266266
private static
267267
let points:[(Math.IntV2, Math.DoubleV2)] =
@@ -486,7 +486,7 @@ struct GradientNoise2D:HashedNoise, BaseNoise
486486
public
487487
typealias SuperSimplexNoise3D = GradientNoise3D
488488
public
489-
struct GradientNoise3D:HashedNoise, BaseNoise
489+
struct GradientNoise3D:HashedNoise
490490
{
491491
private static
492492
let points:[(Math.IntV3, Math.DoubleV3)] =

0 commit comments

Comments
 (0)