1 /** 2 Copyright: Copyright (c) 2013-2017 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 module voxelman.world.gen.utils; 7 8 import voxelman.log; 9 import voxelman.math : ivec3, SimplexNoise; 10 11 import voxelman.world.block; 12 import voxelman.core.config; 13 import voxelman.utils.worker; 14 import voxelman.world.storage.chunk; 15 import voxelman.world.storage.coordinates; 16 17 enum AIR = 1; 18 enum GRASS = 2; 19 enum DIRT = 3; 20 enum STONE = 4; 21 enum SAND = 5; 22 enum WATER = 6; 23 enum LAVA = 7; 24 enum SNOW = 8; 25 26 struct ChunkGeneratorResult 27 { 28 bool uniform; 29 BlockId uniformBlockId; 30 } 31 32 double noise2d(int x, int z) 33 { 34 enum NUM_OCTAVES = 8; 35 enum DIVIDER = 50; // bigger - smoother 36 enum HEIGHT_MODIFIER = 4; // bigger - higher 37 38 double noise = 0.0; 39 foreach(i; 1..NUM_OCTAVES+1) 40 { 41 // [-1; 1] 42 noise += SimplexNoise.noise(cast(double)x/(DIVIDER*i), cast(double)z/(DIVIDER*i))*i*HEIGHT_MODIFIER; 43 } 44 45 return noise; 46 } 47 48 struct HeightmapChunkData 49 { 50 int[CHUNK_SIZE_SQR] heightMap = void; 51 int minHeight = int.max; 52 int maxHeight = int.min; 53 54 void generate(ivec3 chunkOffset) 55 { 56 foreach(i, ref elem; heightMap) 57 { 58 int cx = i & CHUNK_SIZE_BITS; 59 int cz = (i / CHUNK_SIZE) & CHUNK_SIZE_BITS; 60 elem = cast(int)noise2d(chunkOffset.x + cx, chunkOffset.z + cz); 61 if (elem > maxHeight) 62 maxHeight = elem; 63 if (elem < minHeight) 64 minHeight = elem; 65 } 66 } 67 }