mirror of
https://github.com/GayPizzaSpecifications/voxelotl-engine.git
synced 2025-08-03 05:10:57 +00:00
refactor chunk rendering and fix chunk rendering precision loss at large positions
This commit is contained in:
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user