From 76b61c49aebe2b91fc29f8f2a5436fb3c4928e99 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Sat, 7 Sep 2024 13:50:40 +1000 Subject: [PATCH] ravine gaming --- .../Generator/StandardWorldGenerator.swift | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/Sources/Voxelotl/Generator/StandardWorldGenerator.swift b/Sources/Voxelotl/Generator/StandardWorldGenerator.swift index b9d72f4..9702cef 100644 --- a/Sources/Voxelotl/Generator/StandardWorldGenerator.swift +++ b/Sources/Voxelotl/Generator/StandardWorldGenerator.swift @@ -1,35 +1,52 @@ struct StandardWorldGenerator: WorldGenerator { private var heightNoise: LayeredNoiseAlt>! private var terrainNoise: LayeredNoise>! + private var ravineNoise: LayeredNoise>! + private var ravineMask: LayeredNoise>! private var colorNoise: LayeredNoiseAlt>! public mutating func reset(seed: UInt64) { var random = PCG32Random(seed: SplitMix64.createState(seed: seed)) - self.heightNoise = .init(random: &random, octaves: 200, frequency: 0.0002, amplitude: 2.000) - self.terrainNoise = .init(random: &random, octaves: 10, frequency: 0.01, amplitude: 0.437) - self.colorNoise = .init(random: &random, octaves: 150, frequency: 0.0006667, amplitude: 17.000) + self.heightNoise = .init(random: &random, octaves: 28, frequency: 0.0008, amplitude: 1.4) + self.terrainNoise = .init(random: &random, octaves: 10, frequency: 0.01, amplitude: 0.437) + self.ravineNoise = .init(random: &random, octaves: 12, frequency: 0.01) + self.ravineMask = .init(random: &random, octaves: 2, frequency: 0.00241, amplitude: 2) + self.colorNoise = .init(random: &random, octaves: 15, frequency: 0.006667, amplitude: 3) } public func makeChunk(id chunkID: SIMD3) -> Chunk { + let blockFunc = { (height: Float, position: SIMD3) -> BlockType in +#if true + let value = height + self.terrainNoise.get(position * SIMD3(1, 2, 1)) + if value >= 0 { + return .air + } +#else + if height >= 0 { + return .air + } +#endif +#if true + // Carve out ravines + if self.ravineMask.get(position * SIMD3(1, 0.441, 1)) >= 0.8 && + abs(self.ravineNoise.get(position * SIMD3(1, 0.6, 1))) <= 0.1 { return .air } +#endif + return .solid(.init( + hue: Float(180 + self.colorNoise.get(position) * 180), + saturation: 0.47, value: 0.9).linear) + } + let chunkOrigin = chunkID &<< Chunk.shift var chunk = Chunk(position: chunkOrigin) for z in 0..(chunkOrigin.xz &+ SIMD2(x, z))) + let fpos2D = SIMD2(chunkOrigin.xz &+ SIMD2(x, z)) + let height = self.heightNoise.get(fpos2D) for y in 0..(chunkOrigin &+ ipos) - let height = fpos.y / 64.0 + height - let value = height + self.terrainNoise.get(fpos * SIMD3(1, 2, 1)) - let block: BlockType = if value < 0 { - .solid(.init( - hue: Float(180 + self.colorNoise.get(fpos) * 180), - saturation: 0.47, value: 0.9).linear) - } else { - .air - } - chunk.setBlock(internal: ipos, type: block) + chunk.setBlock(internal: ipos, type: blockFunc(fpos.y / 64.0 + height, fpos)) } } }