Skip to content

Commit 4fbecc4

Browse files
committed
support for tiling FBMs
1 parent 6013b16 commit 4fbecc4

File tree

4 files changed

+70
-9
lines changed

4 files changed

+70
-9
lines changed

sources/noise/compounds.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,45 @@ struct FBM<Source>:Noise where Source:Noise
108108
}
109109
}
110110

111+
extension FBM where Source:TilingNoise
112+
{
113+
public
114+
init(tiling source:Source, octaves:Int, persistence:Double = 0.5)
115+
{
116+
print("tiling fbm")
117+
// calculate maximum range
118+
let range_inverse:Double
119+
if persistence == 0.5
120+
{
121+
range_inverse = Double(1 << (octaves - 1)) / Double(1 << octaves - 1)
122+
}
123+
else
124+
{
125+
var accumulation:Double = 1,
126+
contribution:Double = persistence
127+
for _ in (0 ..< octaves - 1)
128+
{
129+
accumulation += contribution
130+
contribution *= persistence
131+
}
132+
133+
range_inverse = 1 / accumulation
134+
}
135+
136+
var generators:[Source] = [source.amplitude_scaled(by: range_inverse)]
137+
generators.reserveCapacity(octaves)
138+
for i in (0 ..< octaves - 1)
139+
{
140+
generators.append( generators[i].amplitude_scaled(by: persistence)
141+
.frequency_scaled(by: 2)
142+
.transposed(octaves: 1)
143+
.reseeded())
144+
}
145+
146+
self.generators = generators
147+
}
148+
}
149+
111150
// UNDOCUMENTED
112151
public
113152
struct DistortedNoise<Source, Displacement>:Noise where Source:Noise, Displacement:Noise

sources/noise/hash.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ extension HashedNoise
3838
}
3939
}
4040

41-
protocol HashedTilingNoise:Noise
41+
public
42+
protocol TilingNoise:Noise
43+
{
44+
func transposed(octaves:Int) -> Self
45+
}
46+
47+
protocol HashedTilingNoise:TilingNoise
4248
{
4349
associatedtype IntV
4450

@@ -75,10 +81,9 @@ extension HashedTilingNoise
7581
}
7682

7783
public
78-
func transposed(octaves:Int) -> Self
84+
func transposed(octaves:Int = 1) -> Self
7985
{
80-
let frequency_factor:Double = octaves >= 0 ? Double(1 << octaves) : 1 / Double(1 << -octaves)
81-
return Self(amplitude: self.amplitude, frequency: self.frequency * frequency_factor,
86+
return Self(amplitude: self.amplitude, frequency: self.frequency,
8287
permutation_table: self.permutation_table,
8388
wavelengths: self._transpose_wavelengths(self.wavelengths, octaves: octaves))
8489
}

tests/LinuxMain.swift

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,25 @@ try png_encode(path: "tests/disk2d.png", raw_data: pixbuf, properties: png_prope
3535

3636
benchmark(noise: CellNoise2D(amplitude: 255, frequency: 0.01), name: "cell2d")
3737
benchmark(noise: CellNoise3D(amplitude: 255, frequency: 0.01), name: "cell3d")
38-
benchmark(noise: TilingCellNoise3D(amplitude: 255, frequency: 16 / Double(viewer_size), wavelengths: 16), name: "cell_tiling3d")
39-
benchmark(noise: FBM<ClassicNoise3D>(ClassicNoise3D(amplitude: 255, frequency: 0.001), octaves: 10, persistence: 0.62), name: "classic3d", offset: 127.5)
40-
benchmark(noise: TilingClassicNoise3D(amplitude: 255, frequency: 16 / Double(viewer_size), wavelengths: 16), name: "classic_tiling3d", offset: 127.5)
41-
benchmark(noise: FBM<GradientNoise2D>(GradientNoise2D(amplitude: 180, frequency: 0.001), octaves: 10, persistence: 0.62), name: "gradient2d", offset: 127.5)
42-
benchmark(noise: FBM<GradientNoise3D>(GradientNoise3D(amplitude: 180, frequency: 0.001), octaves: 10, persistence: 0.62), name: "gradient3d", offset: 127.5)
38+
benchmark( noise: TilingCellNoise3D( amplitude: 255, frequency: 16 / Double(viewer_size),
39+
wavelengths: 16),
40+
name: "cell_tiling3d")
41+
benchmark( noise: FBM<TilingClassicNoise3D>(tiling: TilingClassicNoise3D( amplitude: 255,
42+
frequency: 16 / Double(viewer_size),
43+
wavelengths: 16),
44+
octaves: 10, persistence: 0.62),
45+
name: "classic_tiling_fbm3d",
46+
offset: 127.5)
47+
benchmark( noise: FBM<ClassicNoise3D>( ClassicNoise3D(amplitude: 255, frequency: 0.001),
48+
octaves: 10, persistence: 0.62),
49+
name: "classic3d",
50+
offset: 127.5)
51+
benchmark( noise: TilingClassicNoise3D(amplitude: 255, frequency: 16 / Double(viewer_size), wavelengths: 16),
52+
name: "classic_tiling3d",
53+
offset: 127.5)
54+
benchmark(noise: FBM<GradientNoise2D>(GradientNoise2D(amplitude: 180, frequency: 0.001), octaves: 10, persistence: 0.62),
55+
name: "gradient2d",
56+
offset: 127.5)
57+
benchmark(noise: FBM<GradientNoise3D>(GradientNoise3D(amplitude: 180, frequency: 0.001), octaves: 10, persistence: 0.62),
58+
name: "gradient3d",
59+
offset: 127.5)

tests/classic_tiling_fbm3d.png

645 KB
Loading

0 commit comments

Comments
 (0)