using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace KairoEngine.Chunks { public class ChunkSystem { public Vector3Int chunkSize = new Vector3Int(16, 16, 16); public Dictionary> chunks; public ChunkSystem(Vector3Int chunkSize, bool debug = false) { this.chunkSize = chunkSize; this.chunks = new Dictionary>(); } public void CreateChunk(Vector3Int position, Func, Vector3Int, TChunkBlock> createChunkBlock) { Chunk chunk = new Chunk(chunkSize, position, createChunkBlock); chunks.Add(position, chunk); } public TChunkBlock GetBlock(Vector3Int position) { Chunk chunk = GetChunk(position); if(!chunk.isInitialized()) return default(TChunkBlock); Vector3Int pos = new Vector3Int(); pos.x = position.x - (Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x); pos.y = position.y - (Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y); pos.z = position.z - (Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z); return chunk.GetBlock(pos); } public void SetBlock(Vector3Int position, TChunkBlock data) { Chunk chunk = GetChunk(position); if(!chunk.isInitialized()) return; Vector3Int pos = new Vector3Int(); pos.x = position.x - (Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x); pos.y = position.y - (Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y); pos.z = position.z - (Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z); chunk.SetBlock(pos, data); } public Chunk GetChunk(Vector3Int position) { Vector3Int pos = new Vector3Int(); pos.x = Mathf.FloorToInt(position.x / chunkSize.x ) * chunkSize.x; pos.y = Mathf.FloorToInt(position.y / chunkSize.y ) * chunkSize.y; pos.z = Mathf.FloorToInt(position.z / chunkSize.z ) * chunkSize.z; Chunk chunk; chunks.TryGetValue(pos, out chunk); return chunk; } } }