From 4e6013ed92183cb1fef2bf0d89f4b5139a0c621c Mon Sep 17 00:00:00 2001 From: Lukas Date: Tue, 27 Apr 2021 18:01:09 +0200 Subject: [PATCH] physics: fix multithreading issues with entity velocity --- .../minosoft/data/entities/entities/Entity.kt | 46 ++++++++----------- .../minosoft/gui/input/camera/Camera.kt | 12 ++--- .../protocol/protocol/ProtocolDefinition.java | 3 +- 3 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt index a8742e415..9769c0cf2 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt @@ -26,7 +26,6 @@ import de.bixilon.minosoft.data.mappings.entities.EntityType import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape import de.bixilon.minosoft.gui.rendering.chunk.models.AABB -import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition import de.bixilon.minosoft.protocol.network.connection.PlayConnection @@ -51,7 +50,7 @@ abstract class Entity( var entityMetaData: EntityMetaData = EntityMetaData(connection) - var velocity: Vec3? = null + var velocity: Vec3 = Vec3() protected open val hasCollisions = true protected open val isFlying = false @@ -229,9 +228,9 @@ abstract class Entity( if (delta.y != 0.0f) { delta.y = collisionsToCheck.computeOffset(aabb, deltaPosition.y, Axes.Y) aabb.offsetAssign(0f, delta.y, 0f) - onGround = false if (delta.y != deltaPosition.y) { - velocity?.y = 0.0f + onGround = false + velocity.y = 0.0f if (deltaPosition.y < 0) { onGround = true } @@ -242,56 +241,49 @@ abstract class Entity( delta.x = collisionsToCheck.computeOffset(aabb, deltaPosition.x, Axes.X) aabb.offsetAssign(delta.x, 0f, 0f) if (delta.x != deltaPosition.x) { - velocity?.x = 0.0f + velocity.x = 0.0f } } if (delta.z != 0.0f) { delta.z = collisionsToCheck.computeOffset(aabb, deltaPosition.z, Axes.Z) aabb.offsetAssign(0f, 0f, delta.z) if (delta.z != deltaPosition.z) { - velocity?.z = 0.0f + velocity.z = 0.0f } } if (delta.x != 0.0f && !xPriority) { delta.x = collisionsToCheck.computeOffset(aabb, deltaPosition.x, Axes.X) if (delta.x != deltaPosition.x) { - velocity?.x = 0.0f + velocity.x = 0.0f } } return delta } fun computeTimeStep(deltaMillis: Long) { + val newVelocity = Vec3(velocity) + val oldVelocity = Vec3(velocity) val deltaTime = deltaMillis.toFloat() / 1000.0f if (!hasNoGravity && !isFlying) { - velocity?.let { - it.y += deltaTime * ProtocolDefinition.GRAVITY - } ?: let { - velocity = Vec3(0, deltaTime * ProtocolDefinition.GRAVITY, 0) - } + newVelocity.y -= ProtocolDefinition.GRAVITY * deltaTime } - if (velocity == null) { + newVelocity *= 0.25f.pow(deltaTime) // apply + if (newVelocity.length() < 0.05f) { + newVelocity *= 0 + } + if (velocity != oldVelocity) { + // the velocity has changed + computeTimeStep(deltaMillis) return } - if (velocity == VecUtil.EMPTY_VEC3) { - velocity = null - } - velocity?.timesAssign(0.25f.pow(deltaTime)) - velocity?.let { - if (it.length() < 0.05f) { - velocity = null - return - } - } - velocity?.let { - move(it * deltaTime, false) - } + velocity = newVelocity + move(velocity * deltaTime) } private val aabb: AABB get() = defaultAABB + position companion object { - val HITBOX_MARGIN = 1e-5 + private const val HITBOX_MARGIN = 1e-5 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt index 42d290fdb..941b3d5e4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/input/camera/Camera.kt @@ -48,8 +48,8 @@ class Camera( val renderWindow: RenderWindow, ) : ScreenResizeCallback { private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity - private val walkingSpeed get() = connection.player.baseAbilities.walkingSpeed * ProtocolDefinition.TICKS_PER_SECOND - private val flyingSpeed get() = connection.player.baseAbilities.flyingSpeed * ProtocolDefinition.TICKS_PER_SECOND + private val walkingSpeed get() = connection.player.baseAbilities.walkingSpeed * ProtocolDefinition.TICKS_PER_SECOND * 2 + private val flyingSpeed get() = connection.player.baseAbilities.flyingSpeed * ProtocolDefinition.TICKS_PER_SECOND * 2 var cameraPosition = Vec3(0.0f, 0.0f, 0.0f) private var lastMouseX = 0.0 private var lastMouseY = 0.0 @@ -173,12 +173,8 @@ class Camera( } } else { if (playerEntity.onGround && renderWindow.inputHandler.isKeyBindingDown(KeyBindingsNames.MOVE_JUMP)) { - // TODO: jump delay, correct jump height, direction wrong? - playerEntity.velocity?.let { - it.y += -0.75f * ProtocolDefinition.GRAVITY - } ?: run { - playerEntity.velocity = Vec3(0, -0.75f * ProtocolDefinition.GRAVITY, 0) - } + // TODO: jump delay, correct jump height + playerEntity.velocity.y += 0.75f * ProtocolDefinition.GRAVITY playerEntity.onGround = false } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java index 4dabdefb5..504539e44 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java @@ -95,14 +95,13 @@ public final class ProtocolDefinition { public static final float VELOCITY_CONSTANT = (float) TICKS_PER_SECOND / 80f; - public static final float GRAVITY = -10; // TODO: find the correct value + public static final float GRAVITY = 32; public static final boolean FAST_MOVEMENT = true; public static final int SEA_LEVEL_HEIGHT = 62; public static final float HEIGHT_SEA_LEVEL_MODIFIER = 0.00166667f; - public static final ResourceLocation AIR_RESOURCE_LOCATION = new ResourceLocation("air"); public static final RGBColor DEFAULT_COLOR = ChatColors.WHITE;