mirror of
https://github.com/GayPizzaSpecifications/voxelotl-engine.git
synced 2025-08-03 13:11:33 +00:00
refactor chunk rendering and fix chunk rendering precision loss at large positions
This commit is contained in:
42
Sources/Voxelotl/Renderer/ChunkRenderer.swift
Normal file
42
Sources/Voxelotl/Renderer/ChunkRenderer.swift
Normal file
@ -0,0 +1,42 @@
|
||||
import simd
|
||||
|
||||
public struct ChunkRenderer {
|
||||
private weak var _renderer: Renderer?
|
||||
private var _renderChunks = [ChunkID: RendererMesh]()
|
||||
|
||||
public var material: Material
|
||||
|
||||
public init(renderer: Renderer) {
|
||||
self._renderer = renderer
|
||||
self.material = .init(ambient: .black, diffuse: .white, specular: .white, gloss: 20.0)
|
||||
}
|
||||
|
||||
public mutating func draw(environment: Environment, camera globalCamera: Camera) {
|
||||
let fChunkSz = Float(Chunk.size), divisor = 1 / fChunkSz
|
||||
let origin = SIMD3<Int>(floor(globalCamera.position * divisor), rounding: .down)
|
||||
|
||||
let localCamera = Camera(globalCamera)
|
||||
localCamera.position = globalCamera.position - SIMD3<Float>(origin) * fChunkSz
|
||||
|
||||
self._renderer!.setupBatch(environment: environment, camera: localCamera)
|
||||
for (chunkID, mesh) in self._renderChunks {
|
||||
let drawPos = SIMD3<Float>(SIMD3<Int>(chunkID) &- origin) * fChunkSz
|
||||
self._renderer!.submit(
|
||||
mesh: mesh,
|
||||
instance: .init(world: .translate(drawPos)),
|
||||
material: self.material)
|
||||
}
|
||||
}
|
||||
|
||||
public mutating func addChunk(id chunkID: ChunkID, mesh: RendererMesh) {
|
||||
self._renderChunks.updateValue(mesh, forKey: chunkID)
|
||||
}
|
||||
|
||||
public mutating func removeChunk(id chunkID: ChunkID) {
|
||||
self._renderChunks.removeValue(forKey: chunkID)
|
||||
}
|
||||
|
||||
public mutating func removeAll() {
|
||||
self._renderChunks.removeAll()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user