Files
voxelotl-engine/Sources/Voxelotl/ChunkMeshGeneration.swift

41 lines
1.2 KiB
Swift
Raw Permalink Normal View History

2024-09-03 09:48:29 -04:00
import Foundation
public struct ChunkMeshGeneration {
private let queue: OperationQueue
private let localReadyMeshes = ConcurrentDictionary<ChunkID, RendererMesh?>()
2024-09-03 09:48:29 -04:00
private weak var _world: World?
private weak var _renderer: Renderer?
2024-09-03 09:48:29 -04:00
init(world: World, renderer: Renderer, queue: DispatchQueue) {
self._world = world
self._renderer = renderer
2024-09-03 09:48:29 -04:00
self.queue = OperationQueue()
self.queue.underlyingQueue = queue
self.queue.maxConcurrentOperationCount = 8
self.queue.qualityOfService = .userInitiated
}
public mutating func generate(id chunkID: ChunkID, chunk: Chunk) {
self.queueGenerateJob(id: chunkID, chunk: chunk)
2024-09-03 09:48:29 -04:00
}
func queueGenerateJob(id chunkID: ChunkID, chunk: Chunk) {
2024-09-03 09:48:29 -04:00
self.queue.addOperation {
let mesh = ChunkMeshBuilder.build(world: self._world!, chunk: chunk)
self.localReadyMeshes[chunkID] = self._renderer!.createMesh(mesh)
2024-09-03 09:48:29 -04:00
}
}
public mutating func acceptReadyMeshes(_ chunkRenderer: inout ChunkRenderer) {
2024-09-03 09:48:29 -04:00
queue.waitUntilAllOperationsAreFinished()
for (chunkID, mesh) in self.localReadyMeshes.take() {
if let mesh = mesh {
chunkRenderer.addChunk(id: chunkID, mesh: mesh)
} else {
chunkRenderer.removeChunk(id: chunkID)
}
2024-09-03 09:48:29 -04:00
}
}
}