private float GetBlockNoise(int blockX, int blockZ) { float mediumDetail = PerlinSimplexNoise.noise(blockX / 300.0f, blockZ / 300.0f, 20); float fineDetail = PerlinSimplexNoise.noise(blockX / 80.0f, blockZ / 80.0f, 30); float bigDetails = PerlinSimplexNoise.noise(blockX / 800.0f, blockZ / 800.0f); float noise = bigDetails * 64.0f + mediumDetail * 32.0f + fineDetail * 16.0f; // *(bigDetails // * // 64.0f); return(noise + 16); }
protected virtual void generateTerrain(Region chunk, int blockXInChunk, int blockZInChunk, int worldX, int worldY, int worldDepthInBlocks) { // The lower ground level is at least this high. int minimumGroundheight = worldDepthInBlocks / 4; int minimumGroundDepth = (int)(worldDepthInBlocks * 0.75f); float octave1 = PerlinSimplexNoise.noise(worldX * 0.0001f, worldY * 0.0001f) * 0.5f; float octave2 = PerlinSimplexNoise.noise(worldX * 0.0005f, worldY * 0.0005f) * 0.25f; float octave3 = PerlinSimplexNoise.noise(worldX * 0.005f, worldY * 0.005f) * 0.12f; float octave4 = PerlinSimplexNoise.noise(worldX * 0.01f, worldY * 0.01f) * 0.12f; float octave5 = PerlinSimplexNoise.noise(worldX * 0.03f, worldY * 0.03f) * octave4; float lowerGroundHeight = octave1 + octave2 + octave3 + octave4 + octave5; lowerGroundHeight = lowerGroundHeight * minimumGroundDepth + minimumGroundheight; bool sunlit = true; BlockType blockType = BlockType.None; for (int y = worldDepthInBlocks - 1; y >= 0; y--) { if (y <= lowerGroundHeight) { if (sunlit) { blockType = BlockType.Grass; sunlit = false; } else { blockType = BlockType.Rock; } } chunk.AddBlock(blockXInChunk, y, blockZInChunk, blockType); // Debug.WriteLine(string.Format("chunk {0} : ({1},{2},{3})={4}", chunk.Position, blockXInChunk, y, blockZInChunk, blockType)); } }
protected override void generateTerrain(Region chunk, int x, int z, int blockX, int blockZ, int worldDepthInBlocks) { int groundHeight = (int)GetBlockNoise(blockX, blockZ); if (groundHeight < 1) { groundHeight = 1; } else if (groundHeight > 128) { groundHeight = 96; } // Default to sunlit.. for caves bool sunlit = true; BlockType BlockType = BlockType.None; chunk.Blocks[x, groundHeight, z] = BlockType.Grass; chunk.Blocks[x, 0, z] = BlockType.Dirt; for (int y = worldDepthInBlocks - 1; y > 0; y--) { if (y > groundHeight) { BlockType = BlockType.None; } // Or we at or below ground height? else if (y < groundHeight) { // Since we are at or below ground height, let's see if we need // to make // a cave int noiseX = (blockX + WorldSettings.SEED); float octave1 = PerlinSimplexNoise.noise(noiseX * 0.009f, blockZ * 0.009f, y * 0.009f) * 0.25f; float initialNoise = octave1 + PerlinSimplexNoise.noise(noiseX * 0.04f, blockZ * 0.04f, y * 0.04f) * 0.15f; initialNoise += PerlinSimplexNoise.noise(noiseX * 0.08f, blockZ * 0.08f, y * 0.08f) * 0.05f; if (initialNoise > 0.2f) { BlockType = BlockType.None; } else { // We've placed a block of dirt instead...nothing below us // will be sunlit if (sunlit) { sunlit = false; BlockType = BlockType.Grass; //chunk.addGrassBlock(x,y,z); } else { BlockType = BlockType.Dirt; if (octave1 < 0.2f) { BlockType = BlockType.Rock; } } } } chunk.AddBlock(x, y, z, BlockType); } }