Ejemplo n.º 1
0
        public virtual void UpdateChunks(Stopwatch stopwatch)
        {
            if (this.isGenerating)
            {
                return;
            }
            this.meshesLastFrame = 0;
            int num = Mathf.RoundToInt(this.averageFPS - this.targetFPS);

            while (this.updateQueue.Count > 0 && !this.isGenerating)
            {
                TerrainChunk chunk = this.updateQueue.Dequeue();
                if (chunk != null)
                {
                    chunk.UpdateMesh();
                    this.meshesLastFrame++;
                    if (stopwatch.ElapsedMilliseconds >= num)
                    {
                        break;
                    }
                }
            }
            //if (this.updateQueue.Count == 0 || this.isUpdatingChunks)
            //{
            //    return;
            //}
            //StartCoroutine("UpdateChunksAsync");
        }
Ejemplo n.º 2
0
        public virtual Block SetBlockAt(Vector3Int position, Block block, bool worldPosition, bool immediateUpdate)
        {
            Vector3Int blockPosition = position;

            if (worldPosition)
            {
                blockPosition = position - this.position;
            }
            else
            {
                position = position + this.position;
            }
            if (blockPosition.x >= 0 && blockPosition.x < this.size.x && blockPosition.y >= 0 && blockPosition.y < this.size.y && blockPosition.z >= 0 && blockPosition.z < this.size.z)
            {
                Block oldBlock = this.blocks[blockPosition.x, blockPosition.y, blockPosition.z];
                this.blocks[blockPosition.x, blockPosition.y, blockPosition.z] = block;
                this.isUpdateRequired = true;
                if (immediateUpdate)
                {
                    this.UpdateMesh();
                }
                if (blockPosition.x == 0)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position - new Vector3Int(1, 0, 0), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                if (blockPosition.x == this.size.x - 1)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position + new Vector3Int(1, 0, 0), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                if (blockPosition.y == 0)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position - new Vector3Int(0, 1, 0), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                if (blockPosition.y == this.size.y - 1)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position + new Vector3Int(0, 1, 0), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                if (blockPosition.z == 0)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position - new Vector3Int(0, 0, 1), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                if (blockPosition.z == this.size.z - 1)
                {
                    TerrainChunk chunk = VoxelManager.Instance.GetChunkAt(position + new Vector3Int(0, 0, 1), false);
                    if (chunk != null)
                    {
                        chunk.IsUpdateRequired = true;
                        if (immediateUpdate)
                        {
                            chunk.UpdateMesh();
                        }
                    }
                }
                return(oldBlock);
            }
            else
            {
                return(VoxelManager.Instance.SetBlockAt(position, block, immediateUpdate));
            }
        }