diff --git a/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt b/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt index fbf1ab345..319f30e90 100644 --- a/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt +++ b/src/main/java/de/bixilon/minosoft/config/config/game/CameraGameConfig.kt @@ -18,6 +18,7 @@ import com.squareup.moshi.Json data class CameraGameConfig( @Json(name = "render_distance") var renderDistance: Int = 10, var fov: Float = 60f, + @Json(name = "dynamic_fov") var dynamicFov: Boolean = true, @Json(name = "mouse_sensitivity") var moseSensitivity: Float = 0.1f, @Json(name = "no_clip_movement") var noCipMovement: Boolean = false, @Json(name = "disable_movement_sending") var disableMovementSending: Boolean = true, // ToDo: This should get false once the physics are "complete" 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 702a0f018..468522044 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 @@ -96,7 +96,7 @@ abstract class Entity( val realPosition: Vec3 get() = VecUtil.lerp((System.currentTimeMillis() - lastTickTime) / ProtocolDefinition.TICK_TIMEf, previousPosition, position) - private var lastTickTime = -1L + protected var lastTickTime = -1L fun forceMove(deltaPosition: Vec3) { previousPosition = Vec3(position) 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 0bfe11b61..404525015 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt @@ -37,6 +37,7 @@ import de.bixilon.minosoft.protocol.packets.c2s.play.* import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.decide import de.bixilon.minosoft.util.KUtil.synchronizedMapOf +import de.bixilon.minosoft.util.MMath import glm_.func.cos import glm_.func.rad import glm_.func.sin @@ -80,7 +81,7 @@ class LocalPlayerEntity( private var flyingSpeed: Float = 0.02f - private val movementSpeed: Float + val movementSpeed: Float get() = getAttributeValue(DefaultStatusEffectAttributeNames.GENERIC_MOVEMENT_SPEED) private var horizontalCollision = false @@ -93,6 +94,12 @@ class LocalPlayerEntity( var forwardSpeed = 1.0f var fallDistance = 0.0f + private var lastFovMultiplier = 1.0f + private var currentFovMultiplier = 1.0f + + val fovMultiplier: Float + get() = MMath.lerp((System.currentTimeMillis() - lastTickTime) / ProtocolDefinition.TICK_TIMEf, lastFovMultiplier, currentFovMultiplier) + override val hasGravity: Boolean get() = !baseAbilities.isFlying @@ -452,5 +459,8 @@ class LocalPlayerEntity( tickMovement() sendMovementPackets() + + lastFovMultiplier = currentFovMultiplier + currentFovMultiplier = MMath.clamp(1.0f + movementSpeed, 1.0f, 1.5f) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt index ff797e8df..84af68c1a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/Camera.kt @@ -39,7 +39,6 @@ import glm_.vec3.Vec3 class Camera( val connection: PlayConnection, - var fov: Float, val renderWindow: RenderWindow, ) { private var mouseSensitivity = Minosoft.getConfig().config.game.camera.moseSensitivity @@ -62,7 +61,17 @@ class Camera( private set var viewProjectionMatrix = projectionMatrix * viewMatrix private set - var lastFlyKeyDown = false + + val fov: Float + get() { + val fov = Minosoft.config.config.game.camera.fov + + if (!Minosoft.config.config.game.camera.dynamicFov) { + return fov + } + return fov * entity.fovMultiplier + } + fun mouseCallback(xPos: Double, yPos: Double) { var xOffset = xPos - this.lastMouseX diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt index d0b72caad..378e8e97b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt @@ -34,7 +34,7 @@ class RenderWindowInputHandler( val renderWindow: RenderWindow, ) { val connection: PlayConnection = renderWindow.connection - val camera: Camera = Camera(connection, Minosoft.getConfig().config.game.camera.fov, renderWindow) + val camera: Camera = Camera(connection, renderWindow) private val keyBindingCallbacks: MutableMap = mutableMapOf() private val keysDown: MutableList = mutableListOf()