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); }
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++; } } }