Skip to content

Commit 63735be

Browse files
committed
made permutation lookups more efficient and memory compact
1 parent 189fbbf commit 63735be

File tree

3 files changed

+17
-16
lines changed

3 files changed

+17
-16
lines changed

sources/noise/noise.swift

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,9 @@ extension Noise
5555
struct PermutationTable
5656
{
5757
private
58-
let permut:[UInt8], // keep these small to minimize cache misses
59-
hashes:[UInt8]
58+
let permut:[UInt8] // keep these small to minimize cache misses
6059

61-
init(range:Int, seed:Int)
60+
init(seed:Int)
6261
{
6362
var permutations:[UInt8] = [UInt8](0 ... 255),
6463
state128:(UInt32, UInt32, UInt32, UInt32) = (1, 0, UInt32(extendingOrTruncating: seed >> 32), UInt32(extendingOrTruncating: seed))
@@ -77,25 +76,24 @@ struct PermutationTable
7776
}
7877

7978
self.permut = permutations
80-
self.hashes = permutations.map{ $0 % UInt8(range) }
8179
}
8280

8381
func hash(_ n1:Int, _ n2:Int) -> Int
8482
{
85-
return Int(self.hashes[Int(self.permut[n1 & 255]) ^ (n2 & 255)])
83+
return Int(self.permut[Int(self.permut[n1 & 255]) ^ (n2 & 255)])
8684
}
8785

8886
func hash(_ n1:Int, _ n2:Int, _ n3:Int) -> Int
8987
{
90-
return Int(self.hashes[Int(self.permut[Int(self.permut[n1 & 255]) ^ (n2 & 255)]) ^ (n3 & 255)])
88+
return Int(self.permut[self.hash(n1, n2) ^ (n3 & 255)])
9189
}
9290
}
9391

9492
protocol GradientNoise2D:Noise
9593
{
9694
var permutation_table:PermutationTable { get }
9795

98-
static var gradient_table:[(Double, Double)] { get }
96+
static var gradient_table16:[(Double, Double)] { get }
9997
static var radius:Double { get }
10098
}
10199

@@ -106,7 +104,7 @@ extension GradientNoise2D
106104
let dr:Double = Self.radius - dx*dx - dy*dy
107105
if dr > 0
108106
{
109-
let gradient:(Double, Double) = Self.gradient_table[self.permutation_table.hash(u, v)],
107+
let gradient:(Double, Double) = Self.gradient_table16[self.permutation_table.hash(u, v) & 15],
110108
drdr:Double = dr * dr
111109
return drdr * drdr * (gradient.0 * dx + gradient.1 * dy)
112110
}
@@ -121,7 +119,7 @@ protocol GradientNoise3D:Noise
121119
{
122120
var permutation_table:PermutationTable { get }
123121

124-
static var gradient_table:[(Double, Double, Double)] { get }
122+
static var gradient_table16:[(Double, Double, Double)] { get }
125123
}
126124

127125
extension GradientNoise3D
@@ -131,7 +129,7 @@ extension GradientNoise3D
131129
let dr:Double = 0.75 - dx*dx - dy*dy - dz*dz
132130
if dr > 0
133131
{
134-
let gradient:(Double, Double, Double) = Self.gradient_table[self.permutation_table.hash(u, v, w)],
132+
let gradient:(Double, Double, Double) = Self.gradient_table16[self.permutation_table.hash(u, v, w) & 15],
135133
drdr:Double = dr * dr
136134
return drdr * drdr * (gradient.0 * dx + gradient.1 * dy + gradient.2 * dz)
137135
}

sources/noise/opensimplex.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ public
22
struct Simplex2D:GradientNoise2D
33
{
44
static
5-
let gradient_table:[(Double, Double)] =
5+
let gradient_table16:[(Double, Double)] =
66
[
7+
(-1, -1), (1, 0), (-1, 0), (1, 1),
8+
(-1, 1), (0, -1), (0, 1), (1, -1),
9+
710
(-1, -1), (1, 0), (-1, 0), (1, 1),
811
(-1, 1), (0, -1), (0, 1), (1, -1)
912
]
@@ -22,7 +25,7 @@ struct Simplex2D:GradientNoise2D
2225
{
2326
self.amplitude = 0.096 * amplitude
2427
self.frequency = frequency
25-
self.permutation_table = PermutationTable(range: Simplex2D.gradient_table.count, seed: seed)
28+
self.permutation_table = PermutationTable(seed: seed)
2629
}
2730

2831
public

sources/noise/supersimplex.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ struct SuperSimplex2D:GradientNoise2D
8484
}()
8585

8686
static
87-
let gradient_table:[(Double, Double)] =
87+
let gradient_table16:[(Double, Double)] =
8888
{
8989
var gradients:[(Double, Double)] = []
9090
gradients.reserveCapacity(16)
@@ -113,7 +113,7 @@ struct SuperSimplex2D:GradientNoise2D
113113
{
114114
self.amplitude = 18 * amplitude
115115
self.frequency = frequency
116-
self.permutation_table = PermutationTable(range: SuperSimplex2D.gradient_table.count, seed: seed)
116+
self.permutation_table = PermutationTable(seed: seed)
117117
}
118118

119119
public
@@ -347,7 +347,7 @@ struct SuperSimplex3D:GradientNoise3D
347347
}()
348348

349349
static
350-
let gradient_table:[(Double, Double, Double)] =
350+
let gradient_table16:[(Double, Double, Double)] =
351351
[
352352
(1, 1, 0), (-1, 1, 0), (1, -1, 0), (-1, -1, 0),
353353
(1, 0, 1), (-1, 0, 1), (1, 0, -1), (-1, 0, -1),
@@ -366,7 +366,7 @@ struct SuperSimplex3D:GradientNoise3D
366366
{
367367
self.amplitude = 9 * amplitude
368368
self.frequency = frequency
369-
self.permutation_table = PermutationTable(range: SuperSimplex3D.gradient_table.count, seed: seed)
369+
self.permutation_table = PermutationTable(seed: seed)
370370
}
371371

372372
public

0 commit comments

Comments
 (0)