camera: calculate targets and visibility graph parallel

This commit is contained in:
Bixilon 2022-09-02 22:07:31 +02:00
parent 63154beeee
commit ced8e710ce
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 16 additions and 10 deletions

View File

@ -309,7 +309,7 @@ class World(
val offset = Vec3i.EMPTY + { random.nextInt(-radius, radius) } val offset = Vec3i.EMPTY + { random.nextInt(-radius, radius) }
val blockPosition = origin + offset val blockPosition = origin + offset
val blockState = chunk.getWorld(offset, origin, blockPosition) ?: return val blockState = chunk.traceBlock(offset, origin, blockPosition) ?: return
blockState.block.randomTick(connection, blockState, blockPosition, random) blockState.block.randomTick(connection, blockState, blockPosition, random)
} }

View File

@ -377,16 +377,16 @@ class Chunk(
} }
} }
fun getWorld(offset: Vec3i, origin: Vec3i, blockPosition: Vec3i = origin + offset): BlockState? { fun traceBlock(offset: Vec3i, origin: Vec3i, blockPosition: Vec3i = origin + offset): BlockState? {
val originChunkPosition = origin.chunkPosition val originChunkPosition = origin.chunkPosition
val targetChunkPosition = blockPosition.chunkPosition val targetChunkPosition = blockPosition.chunkPosition
val deltaChunkPosition = targetChunkPosition - originChunkPosition val deltaChunkPosition = targetChunkPosition - originChunkPosition
return getWorld(blockPosition.inChunkPosition, deltaChunkPosition) return traceBlock(blockPosition.inChunkPosition, deltaChunkPosition)
} }
private fun getWorld(inChunkSectionPosition: Vec3i, chunkOffset: Vec2i): BlockState? { private fun traceBlock(inChunkSectionPosition: Vec3i, chunkOffset: Vec2i): BlockState? {
if (chunkOffset.x == 0 && chunkOffset.y == 0) { if (chunkOffset.x == 0 && chunkOffset.y == 0) {
return this[inChunkSectionPosition] return this[inChunkSectionPosition]
} }
@ -394,19 +394,19 @@ class Chunk(
if (chunkOffset.x > 0) { if (chunkOffset.x > 0) {
chunkOffset.x-- chunkOffset.x--
return neighbours[6].getWorld(inChunkSectionPosition, chunkOffset) return neighbours[6].traceBlock(inChunkSectionPosition, chunkOffset)
} }
if (chunkOffset.x < 0) { if (chunkOffset.x < 0) {
chunkOffset.x++ chunkOffset.x++
return neighbours[1].getWorld(inChunkSectionPosition, chunkOffset) return neighbours[1].traceBlock(inChunkSectionPosition, chunkOffset)
} }
if (chunkOffset.y > 0) { if (chunkOffset.y > 0) {
chunkOffset.y-- chunkOffset.y--
return neighbours[4].getWorld(inChunkSectionPosition, chunkOffset) return neighbours[4].traceBlock(inChunkSectionPosition, chunkOffset)
} }
if (chunkOffset.y < 0) { if (chunkOffset.y < 0) {
chunkOffset.y++ chunkOffset.y++
return neighbours[3].getWorld(inChunkSectionPosition, chunkOffset) return neighbours[3].traceBlock(inChunkSectionPosition, chunkOffset)
} }
Broken("Can not get chunk from offset: $chunkOffset") Broken("Can not get chunk from offset: $chunkOffset")

View File

@ -13,6 +13,10 @@
package de.bixilon.minosoft.gui.rendering.camera package de.bixilon.minosoft.gui.rendering.camera
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable
import de.bixilon.kutil.latch.CountUpAndDownLatch
import de.bixilon.kutil.time.TimeUtil import de.bixilon.kutil.time.TimeUtil
import de.bixilon.minosoft.config.key.KeyActions import de.bixilon.minosoft.config.key.KeyActions
import de.bixilon.minosoft.config.key.KeyBinding import de.bixilon.minosoft.config.key.KeyBinding
@ -68,8 +72,10 @@ class Camera(
entity._draw(TimeUtil.millis) entity._draw(TimeUtil.millis)
} }
matrixHandler.draw() matrixHandler.draw()
visibilityGraph.draw() val latch = CountUpAndDownLatch(2)
targetHandler.raycast() DefaultThreadPool += ThreadPoolRunnable(ThreadPool.Priorities.HIGHER) { visibilityGraph.draw();latch.dec() }
DefaultThreadPool += ThreadPoolRunnable(ThreadPool.Priorities.HIGHER) { targetHandler.raycast();latch.dec() }
fogManager.draw() fogManager.draw()
latch.await()
} }
} }