public SubchunkCoord GetSubchunkCoord(Vector3 globalPos) { ChunkCoord superChunk = GetChunkCoord(globalPos); byte subchunkIndex = Subchunk.GetSubchunkIndex(Mathf.FloorToInt(globalPos.y)); return(new SubchunkCoord(superChunk, subchunkIndex)); }
public List <SubchunkCoord> GetAdjacentSubchunks(int x, int y, int z) { List <SubchunkCoord> adjacentSubchunks = new List <SubchunkCoord>(); byte subchunkIndex = Subchunk.GetSubchunkIndex(y); if (x == 0) { ChunkCoord adjacentChunk = new ChunkCoord(coord); adjacentChunk.x -= 1; if (world.isChunkInWorld(adjacentChunk) && world.GetChunk(adjacentChunk) != null) { adjacentSubchunks.Add(world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex).coord); } } else if (x == VoxelData.ChunkWidth - 1) { ChunkCoord adjacentChunk = new ChunkCoord(coord); adjacentChunk.x += 1; if (world.isChunkInWorld(adjacentChunk) && world.GetChunk(adjacentChunk) != null) { adjacentSubchunks.Add(world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex).coord); } } if (y % VoxelData.ChunkSubdivisionHeight == 0 && y != 0) { adjacentSubchunks.Add(new SubchunkCoord(coord, (byte)(subchunkIndex - 1))); } else if (y % VoxelData.ChunkSubdivisionHeight == (VoxelData.ChunkSubdivisionHeight - 1) && y < VoxelData.ChunkHeight) { adjacentSubchunks.Add(new SubchunkCoord(coord, (byte)(subchunkIndex + 1))); } if (z == 0) { ChunkCoord adjacentChunk = new ChunkCoord(coord); adjacentChunk.z -= 1; if (world.isChunkInWorld(adjacentChunk) && world.GetChunk(adjacentChunk) != null) { adjacentSubchunks.Add(world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex).coord); } } else if (z == VoxelData.ChunkWidth - 1) { ChunkCoord adjacentChunk = new ChunkCoord(coord); adjacentChunk.z += 1; if (world.isChunkInWorld(adjacentChunk) && world.GetChunk(adjacentChunk) != null) { if (world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex) == null) { Debug.Log(world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex)); } adjacentSubchunks.Add(world.GetChunk(adjacentChunk).GetSubchunk(subchunkIndex).coord); } } return(adjacentSubchunks); }
public void _updateChunk() { isChunkLocked = true; bool[] subchunksToUpdate = new bool[VoxelData.ChunkSubdivisions]; List <SubchunkCoord> adjacentSubchunksToUpdate = new List <SubchunkCoord>(); lock (voxelModifications) { while (voxelModifications.Count > 0) { Queue <VoxelModification> voxModElement = voxelModifications.Dequeue(); while (voxModElement.Count > 0) { VoxelModification voxMod = voxModElement.Dequeue(); voxelMap[voxMod.x, voxMod.y, voxMod.z] = voxMod.newBlockType.blockTypeIndex; subchunksToUpdate[Subchunk.GetSubchunkIndex(voxMod.y)] = true; List <SubchunkCoord> adjacentSubchunks = GetAdjacentSubchunks(voxMod.x, voxMod.y, voxMod.z); foreach (SubchunkCoord adjacentSubchunk in adjacentSubchunks) { if (adjacentSubchunk.superChunkCoord.Equals(coord)) { subchunksToUpdate[adjacentSubchunk.subchunkIndex] = true; } else { adjacentSubchunksToUpdate.Add(adjacentSubchunk); } } } } } List <SubchunkCoord> updatedAdjacentSubchunks = new List <SubchunkCoord>(); for (int i = 0; i < subchunksToUpdate.Length; i++) { if (subchunksToUpdate[i]) { subchunks[i].UpdateSubChunk(); } } for (int i = 0; i < adjacentSubchunksToUpdate.Count; i++) { if (!updatedAdjacentSubchunks.Contains(adjacentSubchunksToUpdate[i])) { world.GetSubchunk(adjacentSubchunksToUpdate[i]).UpdateSubChunk(); updatedAdjacentSubchunks.Add(adjacentSubchunksToUpdate[i]); } } isChunkLocked = false; }
public void Init() { chunkObject = new GameObject(); materials[0] = world.material; materials[1] = world.transparentMaterial; chunkObject.transform.SetParent(world.transform); chunkObject.transform.position = new Vector3(coord.x * VoxelData.ChunkWidth, 0f, coord.z * VoxelData.ChunkWidth); chunkObject.name = "Chunk " + coord.x + " " + coord.z; position = chunkObject.transform.position; for (byte subChunkIndex = 0; subChunkIndex < VoxelData.ChunkSubdivisions; subChunkIndex++) { subchunks[subChunkIndex] = new Subchunk(this, world, subChunkIndex, materials); } isChunkLocked = true; new Thread(new ThreadStart(PopulateVoxelMap)).Start(); if (!activeOnInit) { isActive = false; } }
private void UpdateDebugOverlay() { if (Input.GetButtonDown("ToggleDebugOverlay")) { debugOverlayActive = !debugOverlayActive; debugOverlay.gameObject.SetActive(debugOverlayActive); } if (debugOverlayActive) { Vector3 pos = World.GetFlooredVector3(playerGameObject.transform.position); debugOverlay.text = "Block Position: X: " + (int)pos.x + " Y: " + (int)pos.y + " Z: " + (int)pos.z + "\nChunk X: " + world.playerLastChunkCoord.x + " Y: " + Subchunk.GetSubchunkIndex((int)pos.y) + " Z: " + world.playerLastChunkCoord.z + "\nFPS: " + Mathf.FloorToInt(1f / Time.deltaTime); if (Mathf.FloorToInt(1f / Time.deltaTime) < 30) { Debug.Log("FPS Hit: " + Mathf.FloorToInt(1f / Time.deltaTime)); } } }