world renderer: sort queue by chunk section position

This commit is contained in:
Bixilon 2022-05-11 17:54:39 +02:00
parent 390ce2e139
commit f2f7c9f371
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 31 additions and 11 deletions

View File

@ -51,4 +51,8 @@ object Vec3iUtil {
fun Vec3i.max(value: Int): Vec3i { fun Vec3i.max(value: Int): Vec3i {
return Vec3i(maxOf(value, x), maxOf(value, y), maxOf(value, z)) return Vec3i(maxOf(value, x), maxOf(value, y), maxOf(value, z))
} }
fun Vec3i.length2(): Int {
return x * x + y * y + z * z
}
} }

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.world
import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.minosoft.data.world.Chunk import de.bixilon.minosoft.data.world.Chunk
import de.bixilon.minosoft.data.world.ChunkSection import de.bixilon.minosoft.data.world.ChunkSection
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
@ -28,6 +29,7 @@ class WorldQueueItem(
val center: Vec3, val center: Vec3,
var neighbours: Array<ChunkSection?>?, var neighbours: Array<ChunkSection?>?,
) { ) {
val sectionPosition = Vec3i(chunkPosition.x, sectionHeight, chunkPosition.y)
var mesh: WorldMesh? = null var mesh: WorldMesh? = null
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {

View File

@ -50,6 +50,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable
import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable
import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition
import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty import de.bixilon.minosoft.gui.rendering.util.VecUtil.empty
import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkSectionPosition
@ -59,6 +60,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.length2
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.toVec3 import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.toVec3
import de.bixilon.minosoft.gui.rendering.world.mesh.VisibleMeshes import de.bixilon.minosoft.gui.rendering.world.mesh.VisibleMeshes
import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh import de.bixilon.minosoft.gui.rendering.world.mesh.WorldMesh
@ -121,6 +123,7 @@ class WorldRenderer(
private var cameraPosition = Vec3.EMPTY private var cameraPosition = Vec3.EMPTY
private var cameraChunkPosition = Vec2i.EMPTY private var cameraChunkPosition = Vec2i.EMPTY
private var cameraSectionHeight = 0
val visibleSize: String val visibleSize: String
get() = visible.sizeString get() = visible.sizeString
@ -404,9 +407,14 @@ class WorldRenderer(
} }
private fun sortQueue() { private fun sortQueue() {
// ToDo: This dirty sorts the queue without really locking it. Check for crashes...
queueLock.lock() queueLock.lock()
queue.sortBy { (it.center - cameraPosition).length2() } val cameraSectionPosition = Vec3i(cameraChunkPosition.x, cameraSectionHeight, cameraChunkPosition.y)
queue.sortBy {
if (it.chunkPosition == cameraChunkPosition) {
return@sortBy Int.MAX_VALUE
}
(it.sectionPosition - cameraSectionPosition).length2()
}
queueLock.unlock() queueLock.unlock()
} }
@ -723,11 +731,19 @@ class WorldRenderer(
private fun onFrustumChange() { private fun onFrustumChange() {
var sortQueue = false var sortQueue = false
val cameraPosition = connection.player.cameraPosition val cameraPosition = connection.player.cameraPosition
val cameraChunkPosition = cameraPosition.blockPosition.chunkPosition
val cameraSectionHeight = this.cameraSectionHeight
if (this.cameraPosition != cameraPosition) { if (this.cameraPosition != cameraPosition) {
this.cameraPosition = cameraPosition if (this.cameraChunkPosition != cameraChunkPosition) {
this.cameraChunkPosition = connection.player.positionInfo.chunkPosition this.cameraChunkPosition = cameraChunkPosition
sortQueue = true sortQueue = true
} }
if (this.cameraSectionHeight != cameraSectionHeight) {
this.cameraSectionHeight = cameraSectionHeight
sortQueue = true
}
this.cameraPosition = cameraPosition
}
val visible = VisibleMeshes(cameraPosition) val visible = VisibleMeshes(cameraPosition)
@ -771,13 +787,15 @@ class WorldRenderer(
queueSection(chunkPosition, sectionHeight, ignoreFrustum = true) queueSection(chunkPosition, sectionHeight, ignoreFrustum = true)
} }
} }
if (queue.isNotEmpty()) { if (sortQueue && queue.isNotEmpty()) {
sortQueue() sortQueue()
}
if (queue.isNotEmpty()) {
workQueue() workQueue()
sortQueue = false
} }
culledQueueLock.acquire() culledQueueLock.acquire()
queueLock.acquire()
for ((chunkPosition, sectionHeights) in queue) { for ((chunkPosition, sectionHeights) in queue) {
val originalSectionHeight = this.culledQueue[chunkPosition] ?: continue val originalSectionHeight = this.culledQueue[chunkPosition] ?: continue
originalSectionHeight -= sectionHeights originalSectionHeight -= sectionHeights
@ -785,16 +803,12 @@ class WorldRenderer(
this.culledQueue -= chunkPosition this.culledQueue -= chunkPosition
} }
} }
queueLock.release()
culledQueueLock.release() culledQueueLock.release()
visible.sort() visible.sort()
this.visible = visible this.visible = visible
if (sortQueue) {
sortQueue()
}
} }