Пример #1
0
    void ApplyModifications()
    {
        applyingModifications = true;

        while (modifications.Count > 0)
        {
            Queue <VoxelMod> queue = modifications.Dequeue();

            while (queue.Count > 0)
            {
                VoxelMod v = queue.Dequeue();

                ChunkCoord c = GetChunkCoordFromVector3(v.position);

                if (chunks[c.x, c.z] == null)
                {
                    chunks[c.x, c.z] = new Chunk(c, this);
                    chunksToCreate.Add(c);
                }

                chunks[c.x, c.z].modifications.Enqueue(v);
            }
        }

        applyingModifications = false;
    }
Пример #2
0
    IEnumerator ApplyModifications()
    {
        applyingModifications = true;
        int count = 0;

        while (modifications.Count > 0)
        {
            VoxelMod v = modifications.Dequeue();

            ChunkCoord c = GetChunkCoordFromVector3(v.position);

            if (chunks[c.x, c.z] == null)
            {
                chunks[c.x, c.z] = new Chunk(c, this, true);
                activeChunks.Add(c);
            }

            chunks[c.x, c.z].modifications.Enqueue(v);

            if (!chunksToUpdate.Contains(chunks[c.x, c.z]))
            {
                chunksToUpdate.Add(chunks[c.x, c.z]);
            }

            count++;
            if (count > 200)
            {
                count = 0;
                yield return(null);
            }
        }

        applyingModifications = false;
    }
Пример #3
0
    public void UpdateChunk()
    {
        while (modifications.Count > 0)
        {
            VoxelMod v = modifications.Dequeue();
            blocks[(int)v.position.x, (int)v.position.z, (int)v.position.y] = v.id;
        }

        ClearMeshData();

        for (int z = 0; z < VoxelData.chunkHeight; z++)
        {
            for (int x = 0; x < VoxelData.chunkSize; x++)
            {
                for (int y = 0; y < VoxelData.chunkSize; y++)
                {
                    if (world.blockTypes[blocks[x, y, z]].isSolid)
                    {
                        AddVoxelDataToChunck(new Vector3(x, z, y));
                    }
                }
            }
        }

        CreateMesh();
    }
Пример #4
0
    void ApplyModifications()
    {
        applyingModifications = true;

        while (modifications.Count > 0)
        {
            Queue <VoxelMod> queue = modifications.Dequeue();

            //try
            //{
            while (queue.Count > 0)
            {
                VoxelMod v = queue.Dequeue();

                worldData.SetVoxel(v.position, v.id);
            }
            //}
            //catch (System.NullReferenceException)
            //{
            //    Debug.Log("Nullreference Exception again...");
            //}
        }

        applyingModifications = false;
    }
Пример #5
0
    private void _updateChunk()
    {
        threadLocked = true;

        while (modifications.Count > 0)
        {
            VoxelMod v   = modifications.Dequeue();
            Vector3  pos = v.position -= position;
            voxelMap[(int)pos.x, (int)pos.y, (int)pos.z] = v.id;
        }

        ClearMeshData();

        for (int y = 0; y < VoxelData.ChunkHeight; y++)
        {
            for (int x = 0; x < VoxelData.ChunkWidth; x++)
            {
                for (int z = 0; z < VoxelData.ChunkWidth; z++)
                {
                    if (world.blocktypes[voxelMap[x, y, z]].isSolid)
                    {
                        UpdateMeshData(new Vector3(x, y, z));
                    }
                }
            }
        }

        lock (world.chunksToDraw) {
            world.chunksToDraw.Enqueue(this);
        }

        threadLocked = false;
    }
Пример #6
0
    public void UpdateChunk()
    {
        while (modifications.Count > 0)
        {
            VoxelMod v   = modifications.Dequeue();
            Vector3  pos = v.position -= position;
            voxelMap[(int)pos.x, (int)pos.y, (int)pos.z].id = v.id;
        }

        ClearMeshData();
        CalculateLight();

        for (int y = 0; y < VoxelData.ChunkHeight; y++)
        {
            for (int x = 0; x < VoxelData.ChunkWidth; x++)
            {
                for (int z = 0; z < VoxelData.ChunkWidth; z++)
                {
                    if (world.blockTypes[voxelMap[x, y, z].id].isSolid)
                    {
                        UpdateMeshData(new Vector3(x, y, z));
                    }
                }
            }
        }

        lock (world.chunksToDraw) {
            world.chunksToDraw.Enqueue(this);
        }
    }
Пример #7
0
    public void UpdateChunk()
    {
        while (modifications.Count > 0)
        {
            VoxelMod v   = modifications.Dequeue();
            Vector3  pos = v.position -= position;
            voxelMap[(int)pos.x, (int)pos.y, (int)pos.z] = v.id;
        }

        _isUpdating = true;
        ClearMeshData();

        for (int y = 0; y < Voxel.ChunkHeight; y++)
        {
            for (int x = 0; x < Voxel.ChunkWidth; x++)
            {
                for (int z = 0; z < Voxel.ChunkWidth; z++)
                {
                    // Only render if block is solid
                    if (world.blocktypes[voxelMap[x, y, z]].isSolid)
                    {
                        UpdateMeshData(new Vector3(x, y, z));
                    }
                }
            }
        }

        _isUpdating = false;
        world.chunksToDraw.Enqueue(this);
    }
    IEnumerator UpdateChunk()
    {
        isUpdatingChunks = true;

        while (modifications.Count > 0)
        {
            VoxelMod v = modifications.Dequeue();

            ChunkCoord c = getChunkCoord(v.position);
            if (Chunks[c.x, c.z] == null)
            {
                Chunks[c.x, c.z] = new Chunk(this, c, true);
                activeChunks.Add(c);
            }
            Chunks[c.x, c.z].modifications.Enqueue(v);

            if (!ChunksToUpdate.Contains(Chunks[c.x, c.z]))
            {
                ChunksToUpdate.Add(Chunks[c.x, c.z]);
            }
        }

        for (int i = 0; i < ChunksToUpdate.Count; i++)
        {
            ChunksToUpdate[0].UpdateChunk();
            ChunksToUpdate.RemoveAt(0);
            yield return(null);
        }

        isUpdatingChunks = false;
    }
Пример #9
0
    void ApplyModifications()
    {
        applyingModifications = true;

        while (modifications.Count > 0)
        {
            Queue <VoxelMod> queue = modifications.Dequeue();

            while (queue.Count > 0)
            {
                VoxelMod v = queue.Dequeue();

                ChunkCoord c             = GetChunkCoordFromVector3(v.position);
                ChunkCoord newChunkCoord = new ChunkCoord(c.x, c.z);

                if (!chunkMap.ContainsKey(newChunkCoord))
                {
                    chunkMap.TryAdd(newChunkCoord, new Chunk(c, this));
                    chunksToCreate.Add(c);
                }

                chunkMap[newChunkCoord].modifications.Enqueue(v);
            }
        }
        applyingModifications = false;
    }
Пример #10
0
    public void UpdateChunk()
    {
        while (modifications.Count > 0)
        {
            VoxelMod v   = modifications.Dequeue();
            Vector3  pos = v.position -= position;
            voxelMap[(int)pos.x, (int)pos.y, (int)pos.z] = v.id;
        }

        ClearMeshData();

        for (int y = 0; y < VoxelData.ChunkHeight; y++)
        {
            for (int x = 0; x < VoxelData.ChunkWidth; x++)
            {
                for (int z = 0; z < VoxelData.ChunkWidth; z++)
                {
                    if (world.blocktypes[voxelMap[x, y, z]].isSolid)
                    {
                        UpdateMeshData(new Vector3(x, y, z));
                    }
                }
            }
        }

        CreateMesh();
    }
Пример #11
0
    void ApplyModifications()
    {
        applyingModifications = true;

        while (modifications.Count > 0)
        {
            Queue <VoxelMod> queue = modifications.Dequeue();

            while (/* queue.Peek() != null && */ queue.Count > 0)
            {
                VoxelMod v = queue.Dequeue();

                ChunkCoord c = GetChunkCoordFromVector3(v.position);

                if (chunks[c.x, c.z] == null)
                {
                    chunks[c.x, c.z] = new Chunk(c, this);
                    activeChunks.Add(c);
                }

                chunks[c.x, c.z].modifications.Enqueue(v);

                if (!chunksToUpdate.Contains(chunks[c.x, c.z]))
                {
                    chunksToUpdate.Add(chunks[c.x, c.z]);
                }
            }
        }

        applyingModifications = false;
    }
Пример #12
0
 public void UpdateChunk()
 {
     while (modifications.Count > 0)
     {
         VoxelMod v = modifications[0]; //removes from list and take
         modifications.RemoveAt(0);
         Vector3 pos = v.position -= position;
         voxelMap[(int)pos.x, (int)pos.y, (int)pos.z] = v.id;
     }
 }
Пример #13
0
 void ApplyModifications()
 {
     applyingModifications = true;
     while (modifications.Count > 0)
     {
         Queue <VoxelMod> queue = modifications.Dequeue();
         while (queue.Count > 0)
         {
             VoxelMod v = queue.Dequeue();
             worldData.SetVoxel(v.position, v.id);
         }
     }
     applyingModifications = false;
 }
Пример #14
0
    private static void AddVoxelMod(VoxelMod voxelMod, Vector3Int offset)
    {
        Vector3Int chunkCoord = WorldData.GlobalPosToChunkCoord(voxelMod._pos + offset);
        Vector3Int pos        = (voxelMod._pos + offset) - WorldData.ChunkCoordToGlobalPos(chunkCoord);

        if (_voxelMods.ContainsKey(chunkCoord))
        {
            _voxelMods[chunkCoord].Add(new VoxelMod(pos, voxelMod._id));                                     // Override other voxel.
        }
        else
        {
            _voxelMods.Add(chunkCoord, new List <VoxelMod>()
            {
                new VoxelMod(pos, voxelMod._id)
            });
        }
    }
    //tree pa
    void ApplyModifications()
    {
        lock (modifications)
        {
            applyingModifications = true;
            int count = 0;
            while (modifications.Count > 0 && count < 100)
            {
                count++;

                VoxelMod v = modifications.Dequeue();
                worldData.SetVoxel(v.position, v.id);
            }

            applyingModifications = false;
        }
    }
Пример #16
0
    void GenerateWorld()
    {
        for (int x = ((VoxelData.WorldSizeInChunks / 2) - VoxelData.ViewDistanceInChunks); x < ((VoxelData.WorldSizeInChunks / 2) + VoxelData.ViewDistanceInChunks); x++)
        {
            for (int z = ((VoxelData.WorldSizeInChunks / 2) - VoxelData.ViewDistanceInChunks); z < ((VoxelData.WorldSizeInChunks / 2) + VoxelData.ViewDistanceInChunks); z++)
            {
                chunks[x, z] = new Chunk(new ChunkCoord(x, z), this, true);
                activeChunks.Add(new ChunkCoord(x, z));
            }
        }

        while (modifications.Count > 0)
        {
            VoxelMod v = modifications.Dequeue();

            ChunkCoord c = GetChunkCoordFromVector3(v.position);

            if (IsChunkInWorld(c))
            {
                if (chunks[c.x, c.z] == null)
                {
                    chunks[c.x, c.z] = new Chunk(c, this, true);
                    activeChunks.Add(c);
                }

                // adding global modification to each chunk's modifications
                chunks[c.x, c.z].modifications.Enqueue(v);

                if (!chunksToUpdate.Contains(chunks[c.x, c.z]))
                {
                    chunksToUpdate.Add(chunks[c.x, c.z]);
                }
            }
        }

        for (int i = 0; i < chunksToUpdate.Count; i++)
        {
            chunksToUpdate[0].UpdateChunk();
            chunksToUpdate.RemoveAt(0);
        }

        player.position = spawnPosition;
    }
Пример #17
0
    void ApplyModifications()
    {
        applyingModifications = true;

        while (modifications.Count > 0)
        {
            Queue <VoxelMod> queue = modifications.Dequeue();
            try
            {
                queue = modifications.Dequeue();
                if (queue is null)
                {
                    Debug.Log("Queue is null, continue");
                    continue;
                }
            }
            catch (Exception err)
            {
                if (err.GetBaseException() is NullReferenceException)
                {
                    Debug.Log("queue is null");
                }
                continue;
            }

            while (queue.Count > 0)
            {
                VoxelMod v = queue.Dequeue();

                ChunkCoord c = GetChunkCoordFromVector3(v.position);

                if (chunks[c.x, c.z] == null)
                {
                    chunks[c.x, c.z] = new Chunk(c, this);
                    chunksToCreate.Add(c);
                }

                chunks[c.x, c.z].modifications.Enqueue(v);
            }
        }

        applyingModifications = false;
    }
Пример #18
0
    void GenerateWorld()
    {
        for (int x = (VoxelData.WorldSizeInChunks / 2) - VoxelData.viewDistanceInChunks; x < (VoxelData.WorldSizeInChunks / 2) + VoxelData.viewDistanceInChunks; x++) // generating the world
        {
            for (int z = (VoxelData.WorldSizeInChunks / 2) - VoxelData.viewDistanceInChunks; z < (VoxelData.WorldSizeInChunks / 2) + VoxelData.viewDistanceInChunks; z++)
            {
                chunks[x, z] = new Chunk(new ChunkCoord(x, z), this, true);
                //CreateNewChunk(x, z);
                activeChunks.Add(new ChunkCoord(x, z));
            }
        }

        while (modifications.Count > 0)    // loop til no more mods
        {
            VoxelMod v = modifications[0]; // global list
            modifications.RemoveAt(0);

            ChunkCoord c = GetChunkCoordFromVector3(v.position);

            if (chunks[c.x, c.z] == null) // if something crosses over chunks we need to add it
            {
                chunks[c.x, c.z] = new Chunk(c, this, true);
                activeChunks.Add(c); // all chunks in game must be here
            }

            chunks[c.x, c.z].modifications.Insert(0, v);

            if (!chunksToUpdate.Contains(chunks[c.x, c.z]))
            {
                chunksToUpdate.Add(chunks[c.x, c.z]);
            }
        }

        for (int i = 0; i < chunksToUpdate.Count; i++)
        {
            chunksToUpdate[i].UpdateChunk();
            chunksToUpdate.RemoveAt(i);
        }

        player.position = spawnPosition;
    }