/// <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; }
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; } }
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; }