Exemplo n.º 1
0
    //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;
            }
        }
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
    //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();
    }
Exemplo n.º 4
0
    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;
    }