コード例 #1
0
ファイル: Chunk.cs プロジェクト: Shmaug/Voxel-Generator
        /// <summary>
        /// Sets the block at WORLD COORDINATES (x,y,z)
        /// </summary>
        public bool SetBlock(int x, int y, int z, Block block)
        {
            int x2 = x - X * CHUNK_SIZE;
            int z2 = z - Z * CHUNK_SIZE;
            if (x2 < 0)
                if (chunkXneg != null)
                    return chunkXneg.SetBlock(x, y, z, block);
                else
                    return false;
            if (x2 >= CHUNK_SIZE)
                if (chunkXpos != null)
                    return chunkXpos.SetBlock(x, y, z, block);
                else
                    return false;
            if (z2 < 0)
                if (chunkZneg != null)
                    return chunkZneg.SetBlock(x, y, z, block);
                else
                    return false;
            if (z2 >= CHUNK_SIZE)
                if (chunkZpos != null)
                    return chunkZpos.SetBlock(x, y, z, block);
                else
                    return false;
            if (y < 0 || y >= CHUNK_HEIGHT)
                return false;
            blocks[x2, y, z2] = block;
            if (block != null) {
                block.Position = new Vector3(x, y, z);
                block.Chunk = this;
                block.makeBBox();
            } else {
                if (y < CHUNK_HEIGHT-2 && blocks[x2, y + 1, z2] != null && blocks[x2, y + 1, z2].Type == BlockType.TallGrass)
                    blocks[x2, y + 1, z2] = null;
            }
            geometryDirty = true;
            generateLight();

            if (x2 == 0 && chunkXneg != null)
                chunkXneg.setDirty();
            if (x2 == CHUNK_SIZE-1 && chunkXpos != null)
                chunkXpos.setDirty();

            if (z2 == 0 && chunkZneg != null)
                chunkZneg.setDirty();
            if (z2 == CHUNK_SIZE - 1 && chunkZpos != null)
                chunkZpos.setDirty();

            return true;
        }
コード例 #2
0
ファイル: Chunk.cs プロジェクト: Shmaug/Voxel-Generator
        void buildFace(Block block, BlockFace face, ref List<VertexPositionNormalTexture> verts, ref List<int> inds, Vector3 scale, Vector3 offset)
        {
            Vector2 sizeUV = new Vector2((float)Block.BlockTextureSize / (float)Block.BlockTexture.Width, (float)Block.BlockTextureSize / (float)Block.BlockTexture.Height);

            Vector2 coord;
            int i = verts.Count;
            switch (face) {
                case BlockFace.Top:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, 0);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 0) * scale, Vector3.Up, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 0) * scale, Vector3.Up, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 1) * scale, Vector3.Up, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 1) * scale, Vector3.Up, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 3);
                    inds.Add(i + 2);
                    break;
                case BlockFace.Bottom:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, sizeUV.Y);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 0) * scale, Vector3.Down, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 0) * scale, Vector3.Down, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 1) * scale, Vector3.Down, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 1) * scale, Vector3.Down, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 3);
                    break;
                case BlockFace.Back:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, sizeUV.Y * 2);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 1) * scale, Vector3.Backward, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 1) * scale, Vector3.Backward, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 1) * scale, Vector3.Backward, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 1) * scale, Vector3.Backward, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 3);
                    inds.Add(i + 2);
                    break;
                case BlockFace.Front:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, sizeUV.Y * 3);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 0) * scale, Vector3.Forward, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 0) * scale, Vector3.Forward, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 0) * scale, Vector3.Forward, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 0) * scale, Vector3.Forward, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 3);
                    break;
                case BlockFace.Right:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, sizeUV.Y * 4);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 1) * scale, Vector3.Right, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 1, 0) * scale, Vector3.Right, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 1) * scale, Vector3.Right, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(1, 0, 0) * scale, Vector3.Right, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 3);
                    inds.Add(i + 2);
                    break;
                case BlockFace.Left:
                    coord = new Vector2(((int)block.Type - 1) * sizeUV.X, sizeUV.Y * 5);

                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 1) * scale, Vector3.Left, coord));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 1, 0) * scale, Vector3.Left, coord + Vector2.UnitX * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 1) * scale, Vector3.Left, coord + Vector2.UnitY * sizeUV));
                    verts.Add(new VertexPositionNormalTexture(block.Position + offset + new Vector3(0, 0, 0) * scale, Vector3.Left, coord + Vector2.One * sizeUV));
                    inds.Add(i);
                    inds.Add(i + 2);
                    inds.Add(i + 1);
                    inds.Add(i + 1);
                    inds.Add(i + 2);
                    inds.Add(i + 3);
                    break;
            }
        }
コード例 #3
0
ファイル: World.cs プロジェクト: Shmaug/Voxel-Generator
 public bool SetBlock(int x, int y, int z, Block block)
 {
     foreach (Chunk c in Chunks)
         if (c.X == x / Chunk.CHUNK_SIZE && c.Z == z / Chunk.CHUNK_SIZE)
             return c.SetBlock(x, y, z, block);
     return false;
 }