//Generating strucutres from text file with position and voxel type void GenerateStructures() { for (int i = 0; i < data.structureZones.Length; i++) { for (int j = 0; j < data.structureZones[i].structures.Length; j++) { List <VoxelModification> modificationList = new List <VoxelModification>(); string text = data.structureZones[i].structures[j].textAsset.text; List <string> lines = new List <string>(); lines.AddRange(text.Split("\n"[0])); for (int l = 0; l < lines.Count; l++) { string[] split = lines[l].Split(); VoxelModification newModification = new VoxelModification { position = new Vector3Int(int.Parse(split[1]), int.Parse(split[2]), int.Parse(split[0])), voxelType = int.Parse(split[3]) }; modificationList.Add(newModification); } data.structureZones[i].structures[j].modifications = modificationList; } } }
public void EditVoxel(int x, int y, int z, BlockType newBlockType) { VoxelModification voxMod = new VoxelModification(x, y, z, newBlockType); Queue <VoxelModification> wrappedVoxMod = new Queue <VoxelModification>(); wrappedVoxMod.Enqueue(voxMod); lock (voxelModifications){ voxelModifications.Enqueue(wrappedVoxMod); } //UpdateSurroundingVoxels(x, z); }
//Updates the voxel and subchunk on same thread. public void EditVoxel(Vector3 pos, BlockType newBlockType) { int[] localCoords = GetVoxelLocalCoords(pos); VoxelModification voxMod = new VoxelModification(localCoords[0], localCoords[1], localCoords[2], newBlockType); Queue <VoxelModification> wrappedVoxMod = new Queue <VoxelModification>(); wrappedVoxMod.Enqueue(voxMod); lock (voxelModifications){ voxelModifications.Enqueue(wrappedVoxMod); } _updateChunk(); }
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; }