refactor chunk rendering and fix chunk rendering precision loss at large positions

This commit is contained in:
2024-09-09 02:20:31 +10:00
parent 6e99401474
commit 935aa3e765
8 changed files with 158 additions and 65 deletions

View File

@ -4,10 +4,12 @@ public struct ChunkMeshGeneration {
private let queue: OperationQueue
private let localReadyMeshes = ConcurrentDictionary<ChunkID, RendererMesh?>()
weak var game: Game?
weak var renderer: Renderer?
private weak var _world: World?
private weak var _renderer: Renderer?
init(queue: DispatchQueue) {
init(world: World, renderer: Renderer, queue: DispatchQueue) {
self._world = world
self._renderer = renderer
self.queue = OperationQueue()
self.queue.underlyingQueue = queue
self.queue.maxConcurrentOperationCount = 8
@ -20,28 +22,19 @@ public struct ChunkMeshGeneration {
func queueGenerateJob(id chunkID: ChunkID, chunk: Chunk) {
self.queue.addOperation {
guard let game = self.game else {
return
}
guard let renderer = self.renderer else {
return
}
let mesh = ChunkMeshBuilder.build(world: game.world, chunk: chunk)
self.localReadyMeshes[chunkID] = renderer.createMesh(mesh)
let mesh = ChunkMeshBuilder.build(world: self._world!, chunk: chunk)
self.localReadyMeshes[chunkID] = self._renderer!.createMesh(mesh)
}
}
public mutating func acceptReadyMeshes() {
guard let game = self.game else {
return
}
public mutating func acceptReadyMeshes(_ chunkRenderer: inout ChunkRenderer) {
queue.waitUntilAllOperationsAreFinished()
for (chunkID, mesh) in self.localReadyMeshes.take() {
game.renderChunks.updateValue(mesh, forKey: chunkID)
if let mesh = mesh {
chunkRenderer.addChunk(id: chunkID, mesh: mesh)
} else {
chunkRenderer.removeChunk(id: chunkID)
}
}
}
}