diff --git a/Sources/Voxelotl/Chunk.swift b/Sources/Voxelotl/Chunk.swift index 87e7793..d26e18d 100644 --- a/Sources/Voxelotl/Chunk.swift +++ b/Sources/Voxelotl/Chunk.swift @@ -59,7 +59,7 @@ public struct Chunk: Hashable { let x = i & Self.mask let y = (i &>> Self.shift) & Self.mask let z = (i &>> (Self.shift + Self.shift)) & Self.mask - blocks[i].type = calculation(self.origin &+ SIMD3(x, y, z)) + blocks[i].type = calculation(SIMD3(x, y, z)) } } diff --git a/Sources/Voxelotl/Generator/StandardWorldGenerator.swift b/Sources/Voxelotl/Generator/StandardWorldGenerator.swift index ffcc03c..352cc9b 100644 --- a/Sources/Voxelotl/Generator/StandardWorldGenerator.swift +++ b/Sources/Voxelotl/Generator/StandardWorldGenerator.swift @@ -18,7 +18,7 @@ struct StandardWorldGenerator: WorldGenerator { let chunkOrigin = chunkID &<< Chunk.shift var chunk = Chunk(position: chunkOrigin) chunk.fill(allBy: { position in - let fpos = SIMD3(position) + let fpos = SIMD3(chunkOrigin &+ position) let threshold: Float = 0.6 let value = fpos.y / 16.0 + self.noise.get(fpos * 0.05) * 1.1 diff --git a/Sources/Voxelotl/Generator/TerrorTowerGenerator.swift b/Sources/Voxelotl/Generator/TerrorTowerGenerator.swift index 2d1fd16..e96e58e 100644 --- a/Sources/Voxelotl/Generator/TerrorTowerGenerator.swift +++ b/Sources/Voxelotl/Generator/TerrorTowerGenerator.swift @@ -6,15 +6,15 @@ struct TerrorTowerGenerator: WorldGenerator { public mutating func reset(seed: UInt64) { var random = Xoroshiro128PlusPlus(state: SplitMix64.createState(seed: seed)) - self.noise1 = LayeredNoise(random: &random, octaves: 4, frequency: 0.05, amplitude: 1.1) - self.noise2 = LayeredNoise(random: &random, octaves: 3, frequency: 0.1, amplitude: 0.5) + self.noise1 = LayeredNoise(random: &random, octaves: 4, frequency: 0.05, amplitude: 2.2) + self.noise2 = LayeredNoise(random: &random, octaves: 3, frequency: 0.1) } public func makeChunk(id chunkID: SIMD3) -> Chunk { let chunkOrigin = chunkID &<< Chunk.shift var chunk = Chunk(position: chunkOrigin) chunk.fill(allBy: { position in - let fpos = SIMD3(position) + let fpos = SIMD3(chunkOrigin &+ position) let threshold: Float = 0.6 let gradient = simd_length(fpos.xz) / 14.0 let value = self.noise1.get(fpos) - 0.25 diff --git a/Sources/Voxelotl/Noise/CoherentNoise.swift b/Sources/Voxelotl/Noise/CoherentNoise.swift index 7121e03..217a12c 100644 --- a/Sources/Voxelotl/Noise/CoherentNoise.swift +++ b/Sources/Voxelotl/Noise/CoherentNoise.swift @@ -1,13 +1,15 @@ public protocol CoherentNoise { associatedtype Scalar: FloatingPoint & SIMDScalar - - init() } public protocol CoherentNoiseRandomInit: CoherentNoise { init(random: inout Random) } +public protocol CoherentNoiseTableInit: CoherentNoise { + init(permutation: [Int16]) +} + public protocol CoherentNoise2D: CoherentNoise { func get(_ point: SIMD2) -> Scalar } diff --git a/Sources/Voxelotl/Noise/LayeredNoise.swift b/Sources/Voxelotl/Noise/LayeredNoise.swift index 47f56e0..d2f6ce5 100644 --- a/Sources/Voxelotl/Noise/LayeredNoise.swift +++ b/Sources/Voxelotl/Noise/LayeredNoise.swift @@ -1,4 +1,3 @@ - public struct LayeredNoise { public typealias Scalar = Generator.Scalar @@ -7,47 +6,55 @@ public struct LayeredNoise { 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: inout Random, octaves: Int, frequency: Scalar, amplitude: Scalar) { + init(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..) -> Scalar { - zip(self._generators, 0..) -> Scalar { - zip(self._generators, 0..) -> Scalar { - zip(self._generators, 0..: CoherentNoise2D, CoherentNoise3D, CoherentNoiseRandomInit { +public struct ImprovedPerlin: CoherentNoise2D, CoherentNoise3D, CoherentNoiseRandomInit, CoherentNoiseTableInit { private let p: [Int16] - public init() { - self.init(permutation: defaultPermutation) - } - public init(permutation: [Int16]) { assert(permutation.count == 0x100) self.p = permutation @@ -90,19 +86,3 @@ public struct ImprovedPerlin: Coherent return u + v } } - -internal let defaultPermutation: [Int16] = [ - 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142, - 8, 99,37,240,21,10,23,190, 6,148,247,120,234,75, 0,26,197,62,94,252,219,203, - 117,35, 11,32,57,177,33, 88,237,149,56,87,174,20,125,136,171,168, 68,175,74, - 165,71,134,139,48, 27,166,77,146,158,231,83,111,229,122, 60,211,133,230,220, - 105,92,41,55,46,245,40,244,102,143,54, 65,25,63,161, 1,216,80,73,209,76,132, - 187,208, 89, 18,169,200,196,135,130,116,188,159, 86,164,100,109,198,173,186, - 3,64,52,217,226,250,124,123, 5,202, 38,147,118,126,255,82,85,212,207,206,59, - 227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152, 2,44,154,163, 70, - 221,153,101,155,167, 43,172,9,129,22,39,253, 19, 98,108,110, 79,113,224,232, - 178,185, 112,104,218,246,97,228,251, 34,242,193,238,210,144, 12,191,179,162, - 241, 81,51,145,235,249,14,239,107,49,192,214, 31,181,199,106,157,184,84,204, - 176,115,121,50,45,127, 4,150,254,138,236,205,93,222,114,67,29,24,72,243,141, - 128,195,78,66,215,61,156,180 -] diff --git a/Sources/Voxelotl/Noise/SimplexNoise.swift b/Sources/Voxelotl/Noise/SimplexNoise.swift index 111642d..a04345a 100644 --- a/Sources/Voxelotl/Noise/SimplexNoise.swift +++ b/Sources/Voxelotl/Noise/SimplexNoise.swift @@ -1,6 +1,6 @@ import Foundation -public struct SimplexNoise: CoherentNoise2D, CoherentNoise3D, CoherentNoise4D, CoherentNoiseRandomInit { +public struct SimplexNoise: CoherentNoise2D, CoherentNoise3D, CoherentNoise4D, CoherentNoiseRandomInit, CoherentNoiseTableInit { private let p: [Int16], pMod12: [Int16] private let grad3: [SIMD3] = [ @@ -19,10 +19,6 @@ public struct SimplexNoise: CoherentNo .init(-1, 1, 1, 0), .init(-1, 1, -1, 0), .init(-1, -1, 1, 0), .init(-1, -1, -1, 0) ] - public init() { - self.init(permutation: defaultPermutation) - } - public init(permutation: [Int16]) { assert(permutation.count == 0x100) self.p = permutation diff --git a/Sources/Voxelotl/Random/RandomCollectionExtensions.swift b/Sources/Voxelotl/Random/RandomCollectionExtensions.swift index 4e9cb5a..133383e 100644 --- a/Sources/Voxelotl/Random/RandomCollectionExtensions.swift +++ b/Sources/Voxelotl/Random/RandomCollectionExtensions.swift @@ -1,9 +1,10 @@ public extension MutableCollection { mutating func shuffle(using provider: inout T) { - guard self.count > 1 else { + let count = self.count + guard count > 1 else { return } - for (first, remaining) in zip(self.indices, stride(from: 0x100, to: 1, by: -1)) { + for (first, remaining) in zip(self.indices, stride(from: count, to: 1, by: -1)) { let i = self.index(first, offsetBy: provider.next(in: remaining)) self.swapAt(first, i) } diff --git a/Sources/Voxelotl/World.swift b/Sources/Voxelotl/World.swift index cb79224..27ac492 100644 --- a/Sources/Voxelotl/World.swift +++ b/Sources/Voxelotl/World.swift @@ -9,7 +9,7 @@ public class World { private var _chunks: Dictionary private var _chunkDamage: Set - private var _generator: WorldGenerator + private var _generator: any WorldGenerator private var _chunkGeneration: ChunkGeneration public init() {