79 lines
2.8 KiB
GDScript
79 lines
2.8 KiB
GDScript
extends RigidBody3D
|
|
|
|
var mouse_input = Vector3(0.0,0.0,0.0)
|
|
var raw_mouse_input = Vector3(0.0,0.0,0.0)
|
|
var alpha = 10
|
|
|
|
var can_float = 0.0
|
|
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
|
|
|
|
|
|
# Sets up the input variables
|
|
# Cursor input
|
|
var tmp = Input.get_last_mouse_velocity() * delta * Globals.sensitivity
|
|
raw_mouse_input = Vector3(tmp.x, tmp.y, Input.get_axis("more", "less") / 100.0)
|
|
# Zoom in/out
|
|
var scroll_input = 0.5 * int(Input.is_action_just_released("out")) - int(Input.is_action_just_released("in"))
|
|
# WASD
|
|
var move_input := Vector3.ZERO
|
|
|
|
# Filters the mouse input using exponential interpolation
|
|
mouse_input.x = mouse_input.x * exp(-alpha * delta) + raw_mouse_input.x * (1.0 - exp(-alpha * delta))
|
|
mouse_input.y = mouse_input.y * exp(-alpha * delta * 3) + raw_mouse_input.y * (1.0 - exp(-alpha * delta * 3))
|
|
#mouse_input.z = mouse_input.z * exp(-alpha * delta * 3) + raw_mouse_input.z * (1.0 - exp(-alpha * delta * 3))
|
|
mouse_input.z = raw_mouse_input.z
|
|
|
|
|
|
# Assigns the controls input
|
|
move_input.x = Input.get_axis("forward", "backwards")
|
|
move_input.y = -Input.get_axis("right", "left")
|
|
move_input.z = Input.get_axis("up", "alternate")
|
|
move_input = move_input.normalized()
|
|
|
|
# Funky FOV thing
|
|
if (!Globals.next && !Globals.restart):
|
|
# Not doing anything special? Track FOV
|
|
$gimbal/stick/camera.fov = $gimbal/stick/camera.fov * exp(-0.5 * delta) + Globals.fov * (1.0 - exp(-0.5 * delta))
|
|
else:
|
|
# Either skipping / restarting : explode FOV
|
|
$gimbal/stick/camera.fov = $gimbal/stick/camera.fov * exp(-7 * delta) + 179 * (1.0 - exp(-7 * delta))
|
|
# Finished animation?
|
|
if $gimbal/stick/camera.fov > 175:
|
|
# Was it triggered by a restart or by a next?
|
|
if Globals.restart:
|
|
# Reset vars and load active scene
|
|
Globals.restart = false
|
|
Globals.next = false
|
|
LevelLoader.redo()
|
|
else:
|
|
# Reset vars and load next scene
|
|
Globals.restart = false
|
|
Globals.next = false
|
|
LevelLoader.next()
|
|
|
|
# Rotates the camera
|
|
$gimbal.rotate_object_local(quaternion * Vector3.LEFT, mouse_input.y)
|
|
$gimbal.rotate_object_local(quaternion * Vector3.FORWARD, mouse_input.x)
|
|
$gimbal.rotate_object_local(quaternion * Vector3.UP, mouse_input.z)
|
|
|
|
# Zooms in/out
|
|
$gimbal/stick/camera.translate(Vector3(0,0,scroll_input))
|
|
$gimbal/stick/camera.position.z = clamp($gimbal/stick/camera.position.z, 0, 50)
|
|
# Default size is 0.85 = 1m
|
|
$player_model.scale = Vector3(1,1,1) * clamp($gimbal/stick/camera.position.z/2, 0, 0.85)
|
|
|
|
# Movement + animation
|
|
# Makes sure the player is in a moveable area
|
|
if can_float != 0:
|
|
linear_damp = 2
|
|
apply_central_force($gimbal.quaternion * Vector3(move_input.y, -move_input.x, -move_input.z) * delta * 2000.0)
|
|
if move_input != Vector3.ZERO:
|
|
$player_model.rotate(move_input, delta * 5)
|
|
else:
|
|
linear_damp = 0.0
|