bool transparentNeighbor(Game.Utility.IntVec3 index) { Game.Model.Block block; block = chunk.getBlock(index + new Utility.IntVec3(1, 0, 0)); if (block.type.transparent) { return(true); } block = chunk.getBlock(index + new Utility.IntVec3(0, 1, 0)); if (block.type.transparent) { return(true); } block = chunk.getBlock(index + new Utility.IntVec3(0, 0, 1)); if (block.type.transparent) { return(true); } block = chunk.getBlock(index + new Utility.IntVec3(-1, 0, 0)); if (block.type.transparent) { return(true); } block = chunk.getBlock(index + new Utility.IntVec3(0, -1, 0)); if (block.type.transparent) { return(true); } block = chunk.getBlock(index + new Utility.IntVec3(0, 0, -1)); if (block.type.transparent) { return(true); } return(false); }
Game.Model.Block genBlock(Game.Utility.IntVec3 index) { Game.Utility.IntVec3 pos = index + chunk.pos * Game.Model.Settings.chunk_size; float height = getHeight(index); float cc = -0.002f * pos.y; if (cc > 0.1) { cc = 0.1f; } float tc = pos.y * 0.01f + 0.8f; return(pos.y >= height ? new Game.Model.Block("air") : (Client.random.NextDouble() < cc ? new Game.Model.Block("coal") : (Client.random.NextDouble() < tc ? new Game.Model.Block("trash") : new Game.Model.Block("dirt")))); }
float getHeight(Game.Utility.IntVec3 index) { float[,] hm = new float[2, 2]; hm[0, 0] = chunks[Model.Settings.data_distance, Model.Settings.data_distance, Model.Settings.data_distance].surf[0]; hm[0, 1] = chunks[Model.Settings.data_distance, Model.Settings.data_distance, Model.Settings.data_distance + 1].surf[0]; hm[1, 0] = chunks[Model.Settings.data_distance + 1, Model.Settings.data_distance, Model.Settings.data_distance].surf[0]; hm[1, 1] = chunks[Model.Settings.data_distance + 1, Model.Settings.data_distance, Model.Settings.data_distance + 1].surf[0]; float h = Utility.Func.lerp(new Utility.Vec2(index.x, index.z) / Model.Settings.chunk_size, hm); if (h > 0) { h *= 10; } else { h *= 2; } return(h); }
void setBlock(Game.Utility.IntVec3 index) { Game.Model.Block block = chunk.getBlock(index); if (block == null) { return; } if (block.hidden) { return; } if (block.type.transparent) { return; } if (!transparentNeighbor(index)) { return; } Game.Utility.Vec2 pos = block.type.rectpos; Game.Utility.Vec2 dim = block.type.rectdim; int offset = mesh.vertices.Count; for (int i = 0; i < MeshGenerator.cube.vertices.Count; i++) { mesh.vertices.Add(MeshGenerator.cube.vertices[i] + index.Float()); } for (int i = 0; i < MeshGenerator.cube.coords.Count; i++) { mesh.coords.Add(new Game.Utility.Vec2(MeshGenerator.cube.coords[i].x * dim.x, MeshGenerator.cube.coords[i].y * dim.y) + pos); } for (int i = 0; i < MeshGenerator.cube.triangles.Count; i++) { mesh.triangles.Add(MeshGenerator.cube.triangles[i] + offset); } }