private void GenerateBlocks() { this.biome = Biome.GetBiome(this.Pos); this.blocks = new Block[ChunkSize, ChunkSize, ChunkSize]; System.Random random = new System.Random(); int cutoffMargin; for (int x = 0; x < ChunkSize; x++) { for (int y = 0; y < ChunkSize; y++) { for (int z = 0; z < ChunkSize; z++) { Int3 pos = new Int3(x, y, z); pos.ChunkInternalCoordsToWorldCoords(this.Pos); float perlin = this.GetNoise(pos); float perlinCave = this.GetNoiseCave(pos); // Above Ground Generation // Air Layer if (perlin > this.biome.AirAndLandIntersectionCutoff) { this.blocks[x, y, z] = Block.Air; } // Top layer else if (perlin < this.biome.AirAndLandIntersectionCutoff && perlin > this.biome.LandTopLayerCutoff) { cutoffMargin = random.Next(-4, 4); if (cutoffMargin + pos.y > 110) { this.blocks[x, y, z] = Block.Snow; } else if (cutoffMargin + pos.y < 110 && cutoffMargin + pos.y > 100) { this.blocks[x, y, z] = Block.Stone; } else if (cutoffMargin + pos.y < 100 && cutoffMargin + pos.y > 90) { this.blocks[x, y, z] = Block.Dirt; } else if (cutoffMargin + pos.y < 90 && cutoffMargin + pos.y > 62) { this.blocks[x, y, z] = Block.Grass; } else if (cutoffMargin + pos.y < 62 && cutoffMargin + pos.y > 30) { this.blocks[x, y, z] = Block.Sand; } else { this.blocks[x, y, z] = Block.Stone; } } // Secondary Layer else if (perlin < this.biome.LandTopLayerCutoff && perlin > this.biome.Land2NDLayerCutoff) { cutoffMargin = random.Next(-4, 4); if (cutoffMargin + pos.y > 100) { this.blocks[x, y, z] = Block.Stone; } else if (cutoffMargin + pos.y < 100 && cutoffMargin + pos.y > 62) { this.blocks[x, y, z] = Block.Dirt; } else if (cutoffMargin + pos.y < 62 && cutoffMargin + pos.y > 30) { this.blocks[x, y, z] = Block.Dirt; } else { this.blocks[x, y, z] = Block.Stone; } } // Inner Layer else { this.blocks[x, y, z] = Block.Stone; } // Cave Generation if (perlinCave > this.biome.CaveCutoff) { this.blocks[x, y, z] = Block.Air; } } } } this.hasGenerated = true; }
// Create Mesh for Cube, given Chunk Internal Coords as int(x,y,z), Block 3D Array blocks, Block block, UVMaps as Vector2 Arrays, and Chunk Coords as int(PosX, PosY, PosZ) // Draw Grass Block public static MeshData DrawCube(int _x, int _y, int _z, Block[,,] _blocks, Block _block, Block.BlockFaceStyle _style, Vector2[] _uvMap0, Vector2[] _uvMap1, Vector2[] _uvMap2, Vector2[] _uvMap3, Vector2[] _uvMap4, Vector2[] _uvMap5, Int3 _chunkPos) { MeshData data = new MeshData(); Int3 pos = new Int3(_x, _y, _z); pos.ChunkInternalCoordsToWorldCoords(_chunkPos); // Bottom Face bool bottomVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Bottom); bool topVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Top); bool frontVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Front); bool backVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Back); bool leftVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Left); bool rightVis = CheckVis(_x, _y, _z, pos, _blocks, Side.Right); if (bottomVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { data.Merge(new MeshData( bottomFaceVerts, bottomFaceDrawOrder, new Vector2[] { _uvMap3[0], _uvMap3[1], _uvMap3[2], _uvMap3[3] })); } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( bottomFaceVerts, bottomFaceDrawOrder, new Vector2[] { _uvMap0[0], _uvMap0[1], _uvMap0[2], _uvMap0[3] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( bottomFaceVerts, bottomFaceDrawOrder, new Vector2[] { _uvMap0[0], _uvMap0[1], _uvMap0[2], _uvMap0[3] })); } } // Top Face if (topVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { data.Merge(new MeshData( topFaceVerts, topFaceDrawOrder, new Vector2[] { _uvMap0[0], _uvMap0[1], _uvMap0[2], _uvMap0[3] })); } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( topFaceVerts, topFaceDrawOrder, new Vector2[] { _uvMap0[0], _uvMap0[1], _uvMap0[2], _uvMap0[3] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( topFaceVerts, topFaceDrawOrder, new Vector2[] { _uvMap0[0], _uvMap0[1], _uvMap0[2], _uvMap0[3] })); } } // Front Face if (frontVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { if (topVis) { data.Merge(new MeshData( frontFaceVerts, frontFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else { data.Merge(new MeshData( frontFaceVerts, frontFaceDrawOrder, new Vector2[] { _uvMap3[2], _uvMap3[0], _uvMap3[3], _uvMap3[1] })); } } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( frontFaceVerts, frontFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( frontFaceVerts, frontFaceDrawOrder, new Vector2[] { _uvMap0[2], _uvMap0[0], _uvMap0[3], _uvMap0[1] })); } } // Back Face if (backVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { if (topVis) { data.Merge(new MeshData( backFaceVerts, backFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else { data.Merge(new MeshData( backFaceVerts, backFaceDrawOrder, new Vector2[] { _uvMap3[2], _uvMap3[0], _uvMap3[3], _uvMap3[1] })); } } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( backFaceVerts, backFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( backFaceVerts, backFaceDrawOrder, new Vector2[] { _uvMap0[2], _uvMap0[0], _uvMap0[3], _uvMap0[1] })); } } // Left Face if (leftVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { if (topVis) { data.Merge(new MeshData( leftFaceVerts, leftFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else { data.Merge(new MeshData( leftFaceVerts, leftFaceDrawOrder, new Vector2[] { _uvMap3[2], _uvMap3[0], _uvMap3[3], _uvMap3[1] })); } } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( leftFaceVerts, leftFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( leftFaceVerts, leftFaceDrawOrder, new Vector2[] { _uvMap0[2], _uvMap0[0], _uvMap0[3], _uvMap0[1] })); } } // Right Face if (rightVis) { if (_style == Block.BlockFaceStyle.GrassStyle) { if (topVis) { data.Merge(new MeshData( rightFaceVerts, rightFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else { data.Merge(new MeshData( rightFaceVerts, rightFaceDrawOrder, new Vector2[] { _uvMap3[2], _uvMap3[0], _uvMap3[3], _uvMap3[1] })); } } else if (_style == Block.BlockFaceStyle.LogStyle) { data.Merge(new MeshData( rightFaceVerts, rightFaceDrawOrder, new Vector2[] { _uvMap1[2], _uvMap1[0], _uvMap1[3], _uvMap1[1] })); } else if (_style == Block.BlockFaceStyle.UniversalStyle) { data.Merge(new MeshData( rightFaceVerts, rightFaceDrawOrder, new Vector2[] { _uvMap0[2], _uvMap0[0], _uvMap0[3], _uvMap0[1] })); } } data.AddPos(new Vector3(_x - 0.5f, _y - 0.5f, _z - 0.5f)); return(data); }