Example #1
0
        private void AddToQueue(FastPriorityQueue <ChunkNode> queue, int3 position, float priority)
        {
            ChunkNode node = new ChunkNode(position);

#if DEBUG
            if (queue.Contains(node))
            {
                Debug.LogWarning("Wants to enqueue generator job but it already exists.");
                return;
            }
#endif
            if (queue.Count + 1 >= queue.MaxSize)
            {
                queue.Resize(queue.Count + 32);
            }

            queue.Enqueue(node, priority);
        }
Example #2
0
        private void LateUpdateChunks()
        {
            if (generatingChunks)
            {
                generatingChunksFrame++;
                if (generateChunksJob.IsCompleted || generatingChunksFrame >= maxJobFrames)
                {
                    FinishGeneratingChunks();
                }
            }

            int numChunks = 0;

            while (generateQueue.Count > 0)
            {
                if (generator == null)
                {
                    break;
                }

                if (numChunks > maxGenerateJobs)
                {
                    break;
                }

                ChunkNode node = generateQueue.Dequeue();

                if (chunks.TryGetValue(node.position, out Chunk chunk))
                {
                    if (generateJobs.ContainsKey(chunk.position) || !chunk.NeedsTerrain || chunk.RequestedRemoval || chunk.GeneratingTerrain)
                    {
                        continue;
                    }

                    chunk.StartGenerating(new NativeArray <int>(Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE * Chunk.CHUNK_SIZE, Allocator.TempJob));

                    JobHandle    job  = generator.GenerateChunk(chunk.temporaryBlocks, chunk.position);
                    ChunkJobData data = new ChunkJobData(node.position, job, node.Priority, false);
                    generateJobs.Add(chunk.position, data);

                    numChunks++;
                }
            }

            numChunks = 0;

            while (renderQueue.Count > 0)
            {
                if (numChunks > maxRenderJobs)
                {
                    break;
                }

                ChunkNode node = renderQueue.Dequeue();
                if (chunks.TryGetValue(node.position, out Chunk chunk))
                {
                    if (AddChunkToRenderList(chunk, node.Priority))
                    {
                        numChunks++;
                    }
                }
            }

            numChunks = 0;

            while (colliderQueue.Count > 0)
            {
                if (numChunks > maxColliderJobs)
                {
                    break;
                }

                ChunkNode node = colliderQueue.Dequeue();
                if (chunks.TryGetValue(node.position, out Chunk chunk))
                {
                    if (colliderJobs.ContainsKey(node.position) || chunk.RequestedRemoval)
                    {
                        continue;
                    }

                    JobHandle job = chunk.ScheduleColliderJob();
                    colliderJobs.Add(node.position, new ChunkJobData(node.position, job, node.Priority, false));
                    numChunks++;
                }
            }
        }