// I/F public void Generate(Chunk chunk) { var chunkSize = chunk.Size; // バイオームを取得。 // 選択されるブロックはバイオームに従う。 var biome = Region.BiomeManager.GetBiome(chunk); for (int x = 0; x < chunkSize.X; x++) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteX = chunk.GetAbsoluteBlockPositionX(x); for (int z = 0; z < chunkSize.Z; z++) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteZ = chunk.GetAbsoluteBlockPositionZ(z); // この XZ におけるバイオーム要素を取得。 var biomeElement = biome.GetBiomeElement(absoluteX, absoluteZ); bool topBlockExists = false; for (int y = chunkSize.Y - 1; 0 <= y; y--) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteY = chunk.GetAbsoluteBlockPositionY(y); // 地形密度を取得。 var density = biome.TerrainNoise.Sample(absoluteX, absoluteY, absoluteZ); byte blockIndex = Block.EmptyIndex; if (0 < density) { // 密度 1 はブロック有り if (!topBlockExists) { // トップ ブロックを検出。 blockIndex = GetBlockIndexAtTop(biomeElement); topBlockExists = true; } else { blockIndex = GetBlockIndexBelowTop(biomeElement); } } else { // 密度 0 はブロック無し // トップ ブロックを見つけていた場合はそれを OFF とする。 topBlockExists = false; } chunk.SetBlockIndex(x, y, z, blockIndex); } } } }
// I/F public void Generate(Chunk chunk) { var chunkSize = chunk.Size; for (int x = 0; x < chunkSize.X; x++) { for (int z = 0; z < chunkSize.Z; z++) { for (int y = 0; y < chunkSize.Y; y++) { var blockIndex = Block.EmptyIndex; if (y % 2 == 0) { if (x % 2 == 0 && z % 2 == 0) { blockIndex = Region.BlockCatalog.DirtIndex; } } else { if (x % 2 == 1 && z % 2 == 1) { blockIndex = Region.BlockCatalog.DirtIndex; } } chunk.SetBlockIndex(x, y, z, blockIndex); } } } }
// I/F public void Generate(Chunk chunk) { var chunkSize = chunk.Size; for (int x = 0; x < chunkSize.X; x++) { for (int z = 0; z < chunkSize.Z; z++) { for (int y = 0; y < chunkSize.Y; y++) { var blockIndex = Block.EmptyIndex; if (y % 2 == 0) { if (x % 2 == 0 && z % 2 == 0) blockIndex = Region.BlockCatalog.DirtIndex; } else { if (x % 2 == 1 && z % 2 == 1) blockIndex = Region.BlockCatalog.DirtIndex; } chunk.SetBlockIndex(x, y, z, blockIndex); } } } }
// I/F public void Generate(Chunk chunk) { var chunkSize = chunk.Size; // バイオームを取得。 // 選択されるブロックはバイオームに従う。 var biome = Region.BiomeManager.GetBiome(chunk); for (int x = 0; x < chunkSize.X; x++) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteX = chunk.GetAbsoluteBlockPositionX(x); for (int z = 0; z < chunkSize.Z; z++) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteZ = chunk.GetAbsoluteBlockPositionZ(z); // この XZ におけるバイオーム要素を取得。 var biomeElement = biome.GetBiomeElement(absoluteX, absoluteZ); bool topBlockExists = false; for (int y = chunkSize.Y - 1; 0 <= y; y--) { // チャンク空間における相対ブロック位置をブロック空間の位置へ変換。 var absoluteY = chunk.GetAbsoluteBlockPositionY(y); // 地形密度を取得。 var density = biome.TerrainNoise.Sample(absoluteX, absoluteY, absoluteZ); byte blockIndex = Block.EmptyIndex; if (0 < density) { // 密度 1 はブロック有り if (!topBlockExists) { // トップ ブロックを検出。 blockIndex = GetBlockIndexAtTop(biomeElement); topBlockExists = true; } else { blockIndex = GetBlockIndexBelowTop(biomeElement); } } else { // 密度 0 はブロック無し // トップ ブロックを見つけていた場合はそれを OFF とする。 topBlockExists = false; } chunk.SetBlockIndex(x, y, z, blockIndex); } } } }
void Generate(Chunk chunk, ref IntVector3 chunkSize, ref IntVector3 chunkPosition, int x, int y, int z, BiomeElement biomeElement) { var h = chunkPosition.Y * chunkSize.Y + y; byte index = Block.EmptyIndex; if (Height == h) { // Horizon. switch (biomeElement) { case BiomeElement.Desert: index = Region.BlockCatalog.SandIndex; break; case BiomeElement.Forest: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Mountains: index = Region.BlockCatalog.StoneIndex; break; case BiomeElement.Plains: index = Region.BlockCatalog.GrassIndex; break; case BiomeElement.Snow: index = Region.BlockCatalog.SnowIndex; break; } } else if (h < Height) { // Below the horizon. switch (biomeElement) { case BiomeElement.Desert: index = Region.BlockCatalog.SandIndex; break; case BiomeElement.Forest: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Mountains: index = Region.BlockCatalog.StoneIndex; break; case BiomeElement.Plains: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Snow: index = Region.BlockCatalog.SnowIndex; break; } } chunk.SetBlockIndex(x, y, z, index); }
void Generate(Chunk chunk, ref IntVector3 chunkSize, ref IntVector3 chunkPosition, int x, int y, int z, BiomeElement biomeElement) { var h = chunkPosition.Y * chunkSize.Y + y; byte index = Block.EmptyIndex; if (Height == h) { // Horizon. switch (biomeElement) { case BiomeElement.Desert: index = Region.BlockCatalog.SandIndex; break; case BiomeElement.Forest: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Mountains: index = Region.BlockCatalog.StoneIndex; break; case BiomeElement.Plains: index = Region.BlockCatalog.GrassIndex; break; case BiomeElement.Snow: index = Region.BlockCatalog.SnowIndex; break; } } else if (h < Height) { // Below the horizon. switch (biomeElement) { case BiomeElement.Desert: index = Region.BlockCatalog.SandIndex; break; case BiomeElement.Forest: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Mountains: index = Region.BlockCatalog.StoneIndex; break; case BiomeElement.Plains: index = Region.BlockCatalog.DirtIndex; break; case BiomeElement.Snow: index = Region.BlockCatalog.SnowIndex; break; } } chunk.SetBlockIndex(x, y, z, index); }