From 02db2d7ba911ab19ea98d55898a89061ba3fdacb Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 1 May 2021 13:31:22 +0200 Subject: [PATCH] physics: add stepping --- .../minosoft/data/entities/entities/Entity.kt | 18 +++++++++++++++--- .../gui/rendering/chunk/models/AABB.kt | 2 +- 2 files changed, 16 insertions(+), 4 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 96e139e69..07c48ff68 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 @@ -227,13 +227,24 @@ abstract class Entity( val delta = Vec3(deltaPosition) if (delta.y != 0.0f) { delta.y = collisionsToCheck.computeOffset(aabb, deltaPosition.y, Axes.Y) - aabb.offsetAssign(0f, delta.y, 0f) if (delta.y != deltaPosition.y) { onGround = false velocity.y = 0.0f if (deltaPosition.y < 0) { onGround = true } + aabb.offsetAssign(0f, delta.y, 0f) + } else if (delta.y < 0) { + onGround = false + } + } + if ((deltaPosition.x != 0f || deltaPosition.z != 0f)) { + val testDelta = Vec3(delta) + testDelta.y = STEP_HEIGHT + val stepMovementY = collisionsToCheck.computeOffset(aabb + testDelta, -STEP_HEIGHT, Axes.Y) + if (stepMovementY < 0 && stepMovementY >= -STEP_HEIGHT) { + delta.y = STEP_HEIGHT + stepMovementY + aabb.offsetAssign(0f, delta.y, 0f) } } val xPriority = delta.x > delta.z @@ -264,7 +275,7 @@ abstract class Entity( val newVelocity = Vec3(velocity) val oldVelocity = Vec3(velocity) val deltaTime = deltaMillis.toFloat() / 1000.0f - if (!hasNoGravity && !isFlying) { + if (! hasNoGravity && !isFlying) { newVelocity.y -= ProtocolDefinition.GRAVITY * deltaTime } newVelocity *= 0.25f.pow(deltaTime) // apply @@ -284,6 +295,7 @@ abstract class Entity( get() = defaultAABB + position companion object { - private const val HITBOX_MARGIN = 1e-5 + private const val HITBOX_MARGIN = 1e-5f + private const val STEP_HEIGHT = 0.6f } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/AABB.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/AABB.kt index fb0951b43..72a91f068 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/AABB.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/AABB.kt @@ -134,7 +134,7 @@ class AABB { offsetAssign(Vec3(x, y, z)) } - fun offsetAssign(vec3: Vec3) { + private fun offsetAssign(vec3: Vec3) { min += vec3 max += vec3 }