From 9ebaeb6eb01425a29bb204676df1a5d90900574f Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 27 Jun 2021 22:22:32 +0200 Subject: [PATCH] improve fluid pushing, proper aabb::blockPositions --- .../data/physics/CollisionDetector.kt | 3 +-- .../minosoft/data/player/LocalPlayerEntity.kt | 3 +++ .../data/registries/fluid/FlowableFluid.kt | 2 +- .../minosoft/data/registries/fluid/Fluid.kt | 6 +---- .../de/bixilon/minosoft/data/world/World.kt | 2 +- .../gui/rendering/chunk/models/AABB.kt | 6 ++--- .../java/de/bixilon/minosoft/util/MMath.kt | 24 ++++++++++++++----- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt b/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt index 7a1316475..3008de108 100644 --- a/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt +++ b/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt @@ -14,7 +14,6 @@ package de.bixilon.minosoft.data.physics import de.bixilon.minosoft.data.Axes -import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.player.LocalPlayerEntity import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape import de.bixilon.minosoft.gui.rendering.chunk.models.AABB @@ -33,7 +32,7 @@ class CollisionDetector(val connection: PlayConnection) { private fun getCollisionsToCheck(deltaPosition: Vec3d, aabb: AABB, ignoreUnloadedChunks: Boolean = true): VoxelShape { // also look at blocks further down to also cover blocks with a higher than normal hitbox (for example fences) - val blockPositions = (aabb extend deltaPosition extend Directions.DOWN grow COLLISION_BOX_MARGIN).blockPositions.toMutableList() + val blockPositions = (aabb extend deltaPosition grow 1.0 + COLLISION_BOX_MARGIN).blockPositions.toMutableList() // check if already in block if (!connection.world.isSpaceEmpty(aabb)) { diff --git a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt index 666b34634..2dbdf84bf 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt @@ -60,6 +60,9 @@ import de.bixilon.minosoft.util.KUtil.decide import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.KUtil.synchronizedMapOf import de.bixilon.minosoft.util.MMath +import de.bixilon.minosoft.util.logging.Log +import de.bixilon.minosoft.util.logging.LogLevels +import de.bixilon.minosoft.util.logging.LogMessageType import glm_.func.cos import glm_.func.rad import glm_.func.sin diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/FlowableFluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/FlowableFluid.kt index 84f81681b..60f2e40d9 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/FlowableFluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/FlowableFluid.kt @@ -70,6 +70,6 @@ abstract class FlowableFluid( // ToDo: Falling fluid - return velocity.normalize() * -1.0 + return velocity.normalize() } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt index dc6c5a764..d083cb499 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt @@ -62,11 +62,7 @@ open class Fluid( } fun getHeight(blockState: BlockState): Float { - val fluidLevel = blockState.properties[BlockProperties.FLUID_LEVEL]?.unsafeCast() ?: 0 - if (fluidLevel == 0) { - return 1.0f - } - return fluidLevel / 9.0f + return (8 - ((blockState.properties[BlockProperties.FLUID_LEVEL]?.unsafeCast()) ?: 8)) / 9.0f } open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) {} diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index d8bffe199..f331cee14 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -185,7 +185,7 @@ class World( } operator fun get(aabb: AABB): Map { - var ret: MutableMap = mutableMapOf() + val ret: MutableMap = mutableMapOf() for (position in aabb.blockPositions) { this[position]?.let { ret[position] = it } } 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 171d9eda9..f6abbf0e2 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 @@ -7,9 +7,9 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.ONE import de.bixilon.minosoft.gui.rendering.util.VecUtil.get import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 +import de.bixilon.minosoft.util.MMath.ceil +import de.bixilon.minosoft.util.MMath.floor import glm_.Java.Companion.glm -import glm_.func.common.ceil -import glm_.func.common.floor import glm_.vec3.Vec3 import glm_.vec3.Vec3d import glm_.vec3.Vec3i @@ -222,7 +222,7 @@ class AABB( get() = AABB(Vec3.EMPTY, Vec3.EMPTY) private fun getRange(min: Double, max: Double): IntRange { - return IntRange(min.floor.toInt(), max.ceil.toInt()) + return IntRange(min.floor, max.ceil - 1) } } } diff --git a/src/main/java/de/bixilon/minosoft/util/MMath.kt b/src/main/java/de/bixilon/minosoft/util/MMath.kt index 2cdb64c8a..315b50946 100644 --- a/src/main/java/de/bixilon/minosoft/util/MMath.kt +++ b/src/main/java/de/bixilon/minosoft/util/MMath.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.util +import de.bixilon.minosoft.util.KUtil.decide import glm_.vec2.Vec2i import kotlin.math.floor @@ -93,10 +94,21 @@ object MMath { } val Boolean.positiveNegative: Int - get() = - if (this) { - 1 - } else { - -1 - } + get() = if (this) { + 1 + } else { + -1 + } + + val Double.floor: Int + get() { + val int = this.toInt() + return (this < int).decide(int - 1, int) + } + + val Double.ceil: Int + get() { + val int = this.toInt() + return (this > int).decide(int + 1, int) + } }