public Space3D <Mesh> Completed() { var system = new Space3D <Mesh>(); foreach (var work in processed) { var mesh = Compile(work.Fab); system.Set(work.Blocks.Coordinate, mesh); } processed.Clear(); return(system); }
public void Enqueue(ChunkBlocks blocks) { if (queue.Contains(blocks.X, blocks.Y, blocks.Z)) { return; } var work = new WorkItem() { Blocks = blocks }; queue.Set(blocks.X, blocks.Y, blocks.Z, work); }
private void UpdateChunks() { var processed = factory.Completed(); if (!processed.IsEmpty) { foreach (var entity in processed) { var coord = entity.Coordinate; var mesh = entity.Element; var blocks = chunkBlocks.Get(coord); var chunk = Chunk.Create(blocks, material, coord.x, coord.y, coord.z, gameObject, mesh); chunks.Set(coord, chunk); } } }
public void Ping(Vector3Int position) { var current = generators.Get(MathHelper.Anchor(position.x, position.y, position.z, REGION)); chunkBlocks.Ping(position, radius, v => { var coord = MathHelper.Anchor(v.x, v.y, v.z, REGION); if (!generators.TryGet(ref coord, out ChunkGenerator biome)) { biome = current.Transitions[(int)(Random.value * (current.Transitions.Length))]; generators.Set(coord, biome); } var chunk = new ChunkBlocks(v.x, v.y, v.z, SIZE); var result = biome.Generate(v, chunk, SIZE); factory.Enqueue(result); return(result); });
private void Start() { radius = new Vector3Int(16, 3, 16); chunks = new Space3D <Chunk>(); generators = new Space3D <ChunkGenerator>(); chunkBlocks = new Space3D <ChunkBlocks>(); factory = new ChunkFactory(); var chunk = player.Chunk(); generators.Set(MathHelper.Anchor(chunk.x, chunk.y, chunk.z, REGION), start); Ping(player.Chunk()); for (int i = 0; i < STARTUP_PROCESSED_CHUNKS; i++) { factory.Process(player.Chunk()); } }