fix significant oversights in noise & random

This commit is contained in:
2024-09-05 21:46:49 +10:00
parent 2a4eb2283a
commit 301aa28c4d
9 changed files with 41 additions and 55 deletions

View File

@ -1,4 +1,3 @@
public struct LayeredNoise<Generator: CoherentNoise> {
public typealias Scalar = Generator.Scalar
@ -7,47 +6,55 @@ public struct LayeredNoise<Generator: CoherentNoise> {
public let amplitude: Scalar
private let _generators: [Generator]
init(octaves: Int, frequency: Scalar, amplitude: Scalar) {
self.octaves = octaves
self.frequency = frequency
self.amplitude = amplitude
self._generators = Array(repeating: .init(), count: octaves)
}
private let _amplitudeAdjusted: Scalar
}
public extension LayeredNoise where Generator: CoherentNoiseRandomInit {
init<Random: RandomProvider>(random: inout Random, octaves: Int, frequency: Scalar, amplitude: Scalar) {
init<Random: RandomProvider>(random: inout Random, octaves: Int, frequency: Scalar, amplitude: Scalar = 1) {
self.octaves = octaves
self.frequency = frequency
self.amplitude = amplitude
self._generators = Array(repeating: Generator(random: &random), count: octaves)
self._generators = (0..<octaves).map { _ in Generator(random: &random) }
self._amplitudeAdjusted = amplitude / 2
}
}
public extension LayeredNoise where Generator: CoherentNoiseTableInit {
init(permutation table: [Int16], octaves: Int, frequency: Scalar, amplitude: Scalar = 1) {
self.octaves = octaves
self.frequency = frequency
self.amplitude = amplitude
self._generators = Array(repeating: Generator(permutation: table), count: octaves)
self._amplitudeAdjusted = amplitude / 2
}
}
public extension LayeredNoise where Generator: CoherentNoise2D {
func get(_ point: SIMD2<Scalar>) -> Scalar {
zip(self._generators, 0..<self.octaves).map { layer, term in
zip(self._generators[1...], 1..<self.octaves).map { layer, term in
let mul = Scalar(1 + term)
return layer.get(point * frequency * mul) / mul
}.reduce(0) { $0 + $1 } * amplitude
return layer.get(point * self.frequency * mul) / mul
}.reduce(self._generators[0].get(point * self.frequency)) {
$0 + $1 } * self._amplitudeAdjusted
}
}
public extension LayeredNoise where Generator: CoherentNoise3D {
func get(_ point: SIMD3<Scalar>) -> Scalar {
zip(self._generators, 0..<self.octaves).map { layer, term in
zip(self._generators[1...], 1..<self.octaves).map { layer, term in
let mul = Scalar(1 + term)
return layer.get(point * frequency * mul) / mul
}.reduce(0) { $0 + $1 } * amplitude
return layer.get(point * self.frequency * mul) / mul
}.reduce(self._generators[0].get(point * self.frequency)) {
$0 + $1 } * self._amplitudeAdjusted
}
}
public extension LayeredNoise where Generator: CoherentNoise4D {
func get(_ point: SIMD4<Scalar>) -> Scalar {
zip(self._generators, 0..<self.octaves).map { layer, term in
zip(self._generators[1...], 1..<self.octaves).map { layer, term in
let mul = Scalar(1 + term)
return layer.get(point * frequency * mul) / mul
}.reduce(0) { $0 + $1 } * amplitude
return layer.get(point * self.frequency * mul) / mul
}.reduce(self._generators[0].get(point * self.frequency)) {
$0 + $1 } * self._amplitudeAdjusted
}
}