optimize physics a bit

This commit is contained in:
Bixilon 2023-03-20 10:38:11 +01:00
parent 5823ac17c7
commit d939f3f7b1
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 25 additions and 9 deletions

View File

@ -43,6 +43,7 @@ class EntityRenderInfo(private val entity: Entity) : Drawable, Tickable {
private fun interpolatePosition(delta: Float) { private fun interpolatePosition(delta: Float) {
// TODO: Only interpolate if changed
position = Vec3Util.interpolateLinear(delta, position0, position1) position = Vec3Util.interpolateLinear(delta, position0, position1)
eyePosition = position + Vec3(0.0f, entity.eyeHeight, 0.0f) eyePosition = position + Vec3(0.0f, entity.eyeHeight, 0.0f)
cameraAABB = entity.defaultAABB + position cameraAABB = entity.defaultAABB + position

View File

@ -62,15 +62,17 @@ abstract class Entity(
open val clientControlled: Boolean get() = primaryPassenger is LocalPlayerEntity open val clientControlled: Boolean get() = primaryPassenger is LocalPlayerEntity
open val dimensions = Vec2(type.width, type.height) open val dimensions = Vec2(type.width, type.height)
val defaultAABB: AABB open val defaultAABB: AABB = createDefaultAABB()
get() {
val halfWidth = dimensions.x / 2
return AABB(Vec3(-halfWidth, 0.0f, -halfWidth), Vec3(halfWidth, dimensions.y, halfWidth))
}
open val mountHeightOffset: Double get() = dimensions.y * 0.75 open val mountHeightOffset: Double get() = dimensions.y * 0.75
open val heightOffset: Double get() = 0.0 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? { open fun getDimensions(pose: Poses): Vec2? {
return dimensions return dimensions
} }

View File

@ -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.entities.entities.player.additional.PlayerAdditional
import de.bixilon.minosoft.data.registries.entities.EntityType import de.bixilon.minosoft.data.registries.entities.EntityType
import de.bixilon.minosoft.data.registries.item.items.dye.DyeableItem 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.ChatColors
import de.bixilon.minosoft.data.text.formatting.color.RGBColor import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer import de.bixilon.minosoft.gui.rendering.entity.EntityRenderer
@ -79,6 +80,16 @@ abstract class PlayerEntity(
val score: Int val score: Int
get() = data.get(SCORE_DATA, 0) 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<SkinParts> by observedSet(mutableSetOf()) val skinParts: MutableSet<SkinParts> by observedSet(mutableSetOf())

View File

@ -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.Vec3Util.get
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.max import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.max
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.min import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.min
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
abstract class AbstractVoxelShape : Iterable<AABB> { abstract class AbstractVoxelShape : Iterable<AABB> {
abstract val aabbs: Int abstract val aabbs: Int
@ -109,7 +110,7 @@ abstract class AbstractVoxelShape : Iterable<AABB> {
when (data) { when (data) {
is Int -> return this[data] is Int -> return this[data]
is Collection<*> -> { is Collection<*> -> {
val aabbs: MutableSet<AABB> = mutableSetOf() val aabbs: MutableSet<AABB> = ObjectOpenHashSet()
for (id in data) { for (id in data) {
aabbs += this[id.toInt()] aabbs += this[id.toInt()]
} }
@ -123,7 +124,7 @@ abstract class AbstractVoxelShape : Iterable<AABB> {
when (data) { when (data) {
is Int -> return VoxelShape(aabbs[data]) is Int -> return VoxelShape(aabbs[data])
is Collection<*> -> { is Collection<*> -> {
val shape: MutableSet<AABB> = mutableSetOf() val shape: MutableSet<AABB> = ObjectOpenHashSet()
for (id in data) { for (id in data) {
shape += aabbs[id.toInt()] shape += aabbs[id.toInt()]
} }

View File

@ -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.Vec3Util.set
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY
import de.bixilon.minosoft.physics.entities.EntityPhysics import de.bixilon.minosoft.physics.entities.EntityPhysics
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
import kotlin.math.abs import kotlin.math.abs
object CollisionMovementPhysics { object CollisionMovementPhysics {
fun World.collectCollisions(context: CollisionContext, movement: Vec3d, aabb: AABB, chunk: Chunk?, predicate: CollisionPredicate? = null): VoxelShape { fun World.collectCollisions(context: CollisionContext, movement: Vec3d, aabb: AABB, chunk: Chunk?, predicate: CollisionPredicate? = null): VoxelShape {
val shapes: MutableSet<AABB> = hashSetOf() val shapes: MutableSet<AABB> = ObjectOpenHashSet()
// TODO: add entity collisions (boat, shulker) // TODO: add entity collisions (boat, shulker)
// TODO: add world border collision shape // TODO: add world border collision shape