Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        // 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);
        }