diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/camera/WorldOffset.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/camera/WorldOffset.kt index dc62f6933..0065bc6a4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/camera/WorldOffset.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/camera/WorldOffset.kt @@ -38,7 +38,7 @@ class WorldOffset(private val camera: Camera) : Drawable { companion object { - const val MAX_DISTANCE = (World.MAX_RENDER_DISTANCE * 2) * ProtocolDefinition.SECTION_WIDTH_X // coordinates higher than that value are not allowed + const val MAX_DISTANCE = World.MAX_RENDER_DISTANCE * ProtocolDefinition.SECTION_WIDTH_X // coordinates higher than that value are not allowed const val MIN_DISTANCE = MAX_DISTANCE - (World.MAX_RENDER_DISTANCE / 4) * ProtocolDefinition.SECTION_WIDTH_X // only if value is lower that that value coordinates will be back offset } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt index 7069f8432..03735da0c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/EntityRenderer.kt @@ -61,6 +61,8 @@ class EntityRenderer( var visibleCount: Int = 0 private set + private var reset = false + override fun init(latch: CountUpAndDownLatch) { connection.events.listen { event -> if (event.entity is LocalPlayerEntity) return@listen @@ -75,6 +77,7 @@ class EntityRenderer( } profile.hitbox::enabled.observe(this) { this.hitboxes = it } + context.camera.offset::offset.observe(this) { reset = true } context.inputHandler.registerKeyCallback( HITBOX_TOGGLE_KEY_COMBINATION, @@ -104,8 +107,12 @@ class EntityRenderer( override fun prePrepareDraw() { val count = AtomicInteger() + val reset = reset runAsync { it.entity.draw(millis()) + if (reset) { + it.reset() + } it.update = it.checkUpdate() it.prepareAsync() if (it.visible) { @@ -113,6 +120,9 @@ class EntityRenderer( } } this.visibleCount = count.get() + if (reset) { + this.reset = false + } } override fun postPrepareDraw() { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/ModelUpdater.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/ModelUpdater.kt index eafeb15e7..44b66bab0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/ModelUpdater.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/ModelUpdater.kt @@ -23,4 +23,6 @@ interface ModelUpdater : Drawable { fun prepare() = Unit fun unload() = Unit + + fun reset() = Unit } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/hitbox/EntityHitbox.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/hitbox/EntityHitbox.kt index 77ff044be..6f17896a2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/hitbox/EntityHitbox.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/hitbox/EntityHitbox.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.entity.hitbox import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.minosoft.data.entities.entities.LivingEntity import de.bixilon.minosoft.data.registries.shapes.aabb.AABB import de.bixilon.minosoft.data.text.formatting.color.ChatColors @@ -31,7 +32,6 @@ class EntityHitbox( private var aabb: AABB = model.aabb private var data: HitboxData? = null - private var update = true var enabled: Boolean = true get() = field && model.renderer.hitboxes @@ -52,7 +52,6 @@ class EntityHitbox( } this.data = data this.aabb = aabb - update = true return true } @@ -80,18 +79,21 @@ class EntityHitbox( } else { mesh.drawAABB(aabb = shrunk, color = data.color, margin = 0.1f) } - val center = Vec3(shrunk.center) + val offset = model.context.camera.offset.offset + val center = Vec3(shrunk.center - offset) + + data.velocity?.let { mesh.drawLine(center, center + Vec3(it) * 3, color = ChatColors.YELLOW) } val eyeHeight = shrunk.min.y + model.entity.eyeHeight - val eyeAABB = AABB(Vec3(shrunk.min.x, eyeHeight, shrunk.min.z), Vec3(shrunk.max.x, eyeHeight, shrunk.max.z)).hShrink(RenderConstants.DEFAULT_LINE_WIDTH) + val eyeAABB = AABB(Vec3d(shrunk.min.x, eyeHeight, shrunk.min.z), Vec3d(shrunk.max.x, eyeHeight, shrunk.max.z)).hShrink(-RenderConstants.DEFAULT_LINE_WIDTH) mesh.drawAABB(eyeAABB, RenderConstants.DEFAULT_LINE_WIDTH, ChatColors.DARK_RED) - val eyeStart = Vec3(center.x, eyeHeight, center.z) + val eyeStart = Vec3(center.x, eyeHeight - offset.y, center.z) - mesh.drawLine(eyeStart, eyeStart + Vec3(data.rotation.front) * 5.0f, color = ChatColors.BLUE) + mesh.drawLine(eyeStart, eyeStart + data.rotation.front * 5.0f, color = ChatColors.BLUE) this.mesh = mesh } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt index f99ba27b5..74711a38e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entity/models/EntityModel.kt @@ -47,6 +47,11 @@ abstract class EntityModel( return update } + override fun reset() { + update = true + hitbox.reset() + } + override fun prepareAsync() { if (!update) { return diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudLayer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudLayer.kt index 88a77e64e..b06c2f441 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudLayer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudLayer.kt @@ -77,6 +77,10 @@ class CloudLayer( if (offset.y != 0) pushZ(offset.y == 1) } + fun reset() { + + } + private fun reset(cloudPosition: Vec2i) { for (array in arrays.unsafeCast>()) { array?.unload() @@ -92,9 +96,13 @@ class CloudLayer( return this shr 4 } - private fun updatePosition() { + private fun calculateCloudPosition(): Vec2i { val offset = this.offset.toInt() - val position = clouds.connection.player.physics.positionInfo.chunkPosition + Vec2i(offset / CloudArray.CLOUD_SIZE, 0) + return clouds.connection.player.physics.positionInfo.chunkPosition + Vec2i(offset / CloudArray.CLOUD_SIZE, 0) + } + + private fun updatePosition() { + val position = calculateCloudPosition() if (position == this.position) { return } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudRenderer.kt index 27a5bdcf7..aa6f6af02 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudRenderer.kt @@ -63,12 +63,16 @@ class CloudRenderer( var delta = 0.0f private set + private var reset = false + override val skipOpaque: Boolean get() = !sky.effects.clouds || !sky.profile.clouds.enabled || connection.profiles.block.viewDistance < 3 || layers.isEmpty() override fun asyncInit(latch: CountUpAndDownLatch) { matrix.load(connection.assetsManager) + + context.camera.offset::offset.observe(this) { reset() } } private fun getCloudHeight(index: Int): IntRange { @@ -103,6 +107,10 @@ class CloudRenderer( sky.profile.clouds::flat.observe(this, instant = true) { this.flat = it } } + private fun reset() { + reset = true + } + private fun updateLayers(layers: Int) { while (layers < this.layers.size) { toUnload += this.layers.removeLast() @@ -117,6 +125,11 @@ class CloudRenderer( if (!sky.effects.clouds) { return } + if (reset) { + updateLayers(0) + updateLayers(nextLayers) + reset = false + } if (layers.size != nextLayers) { updateLayers(nextLayers) } @@ -236,8 +249,8 @@ class CloudRenderer( setYOffset() - for (array in layers) { - array.draw() + for (layer in layers) { + layer.draw() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/LineMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/LineMesh.kt index 45dabcb9a..fd9a0a9e3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/LineMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/LineMesh.kt @@ -80,8 +80,9 @@ open class LineMesh(context: RenderContext) : GenericColorMesh(context) { fun drawLazyAABB(aabb: AABB, color: RGBColor) { data.ensureSize(6 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX) + val offset = context.camera.offset.offset for (direction in Directions.VALUES) { - val positions = direction.getPositions(Vec3(aabb.min), Vec3(aabb.max)) + val positions = direction.getPositions(Vec3(aabb.min - offset), Vec3(aabb.max - offset)) for ((positionIndex, _) in order) { addVertex(positions[positionIndex], color) } @@ -90,8 +91,9 @@ open class LineMesh(context: RenderContext) : GenericColorMesh(context) { fun drawAABB(aabb: AABB, lineWidth: Float = RenderConstants.DEFAULT_LINE_WIDTH, color: RGBColor, margin: Float = 0.0f, shape: AbstractVoxelShape? = null) { data.ensureSize(12 * 4 * order.size * GenericColorMeshStruct.FLOATS_PER_VERTEX) - val min = aabb.min - margin - val max = aabb.max + margin + val offset = context.camera.offset.offset + val min = aabb.min - margin - offset + val max = aabb.max + margin - offset fun tryDrawLine(start: Vec3, end: Vec3) { tryDrawLine(start, end, lineWidth, color, shape) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt index 009d83743..4acccfda5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/outline/BlockOutlineRenderer.kt @@ -63,7 +63,6 @@ class BlockOutlineRenderer( override var unload: Boolean = false override fun init(latch: CountUpAndDownLatch) { - val profile = connection.profiles.block this.profile::enabled.observe(this) { reload = true } this.profile::collisions.observe(this) { reload = true } this.profile::outlineColor.observe(this) { reload = true }