From d939f3f7b14c347addc9155e5176716f0b24f5ac Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 20 Mar 2023 10:38:11 +0100 Subject: [PATCH] optimize physics a bit --- .../minosoft/data/entities/EntityRenderInfo.kt | 1 + .../minosoft/data/entities/entities/Entity.kt | 14 ++++++++------ .../data/entities/entities/player/PlayerEntity.kt | 11 +++++++++++ .../registries/shapes/voxel/AbstractVoxelShape.kt | 5 +++-- .../physics/parts/CollisionMovementPhysics.kt | 3 ++- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityRenderInfo.kt b/src/main/java/de/bixilon/minosoft/data/entities/EntityRenderInfo.kt index 9f84fa05c..be8640a86 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityRenderInfo.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityRenderInfo.kt @@ -43,6 +43,7 @@ class EntityRenderInfo(private val entity: Entity) : Drawable, Tickable { private fun interpolatePosition(delta: Float) { + // TODO: Only interpolate if changed position = Vec3Util.interpolateLinear(delta, position0, position1) eyePosition = position + Vec3(0.0f, entity.eyeHeight, 0.0f) cameraAABB = entity.defaultAABB + position 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 b133261b0..48f44e69d 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 @@ -62,15 +62,17 @@ abstract class Entity( open val clientControlled: Boolean get() = primaryPassenger is LocalPlayerEntity open val dimensions = Vec2(type.width, type.height) - val defaultAABB: AABB - get() { - val halfWidth = dimensions.x / 2 - return AABB(Vec3(-halfWidth, 0.0f, -halfWidth), Vec3(halfWidth, dimensions.y, halfWidth)) - } + open val defaultAABB: AABB = createDefaultAABB() open val mountHeightOffset: Double get() = dimensions.y * 0.75 open val heightOffset: Double get() = 0.0 - + + + protected fun createDefaultAABB(): AABB { + val halfWidth = dimensions.x / 2 + return AABB(Vec3(-halfWidth, 0.0f, -halfWidth), Vec3(halfWidth, dimensions.y, halfWidth)) + } + open fun getDimensions(pose: Poses): Vec2? { return dimensions } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt index f13d959b5..8a31d19b7 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.kt @@ -32,6 +32,7 @@ import de.bixilon.minosoft.data.entities.entities.SynchronizedEntityData import de.bixilon.minosoft.data.entities.entities.player.additional.PlayerAdditional import de.bixilon.minosoft.data.registries.entities.EntityType import de.bixilon.minosoft.data.registries.item.items.dye.DyeableItem +import de.bixilon.minosoft.data.registries.shapes.aabb.AABB import de.bixilon.minosoft.data.text.formatting.color.ChatColors import de.bixilon.minosoft.data.text.formatting.color.RGBColor import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer @@ -79,6 +80,16 @@ abstract class PlayerEntity( val score: Int get() = data.get(SCORE_DATA, 0) + protected var aabbPose = pose + override var defaultAABB: AABB = createDefaultAABB() + get() { + val pose = pose + if (aabbPose == pose) return field + field = createDefaultAABB() + aabbPose = pose + return field + } + val skinParts: MutableSet by observedSet(mutableSetOf()) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/shapes/voxel/AbstractVoxelShape.kt b/src/main/java/de/bixilon/minosoft/data/registries/shapes/voxel/AbstractVoxelShape.kt index c8667be5b..30a7b3d30 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/shapes/voxel/AbstractVoxelShape.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/shapes/voxel/AbstractVoxelShape.kt @@ -24,6 +24,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.get import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.max import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.min +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet abstract class AbstractVoxelShape : Iterable { abstract val aabbs: Int @@ -109,7 +110,7 @@ abstract class AbstractVoxelShape : Iterable { when (data) { is Int -> return this[data] is Collection<*> -> { - val aabbs: MutableSet = mutableSetOf() + val aabbs: MutableSet = ObjectOpenHashSet() for (id in data) { aabbs += this[id.toInt()] } @@ -123,7 +124,7 @@ abstract class AbstractVoxelShape : Iterable { when (data) { is Int -> return VoxelShape(aabbs[data]) is Collection<*> -> { - val shape: MutableSet = mutableSetOf() + val shape: MutableSet = ObjectOpenHashSet() for (id in data) { shape += aabbs[id.toInt()] } diff --git a/src/main/java/de/bixilon/minosoft/physics/parts/CollisionMovementPhysics.kt b/src/main/java/de/bixilon/minosoft/physics/parts/CollisionMovementPhysics.kt index 23bd50fe4..e678ecf68 100644 --- a/src/main/java/de/bixilon/minosoft/physics/parts/CollisionMovementPhysics.kt +++ b/src/main/java/de/bixilon/minosoft/physics/parts/CollisionMovementPhysics.kt @@ -31,12 +31,13 @@ import de.bixilon.minosoft.data.world.positions.ChunkPositionUtil.inChunkPositio import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.set import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.physics.entities.EntityPhysics +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import kotlin.math.abs object CollisionMovementPhysics { fun World.collectCollisions(context: CollisionContext, movement: Vec3d, aabb: AABB, chunk: Chunk?, predicate: CollisionPredicate? = null): VoxelShape { - val shapes: MutableSet = hashSetOf() + val shapes: MutableSet = ObjectOpenHashSet() // TODO: add entity collisions (boat, shulker) // TODO: add world border collision shape