Stabilize camera input across fishing and radial menus
This commit is contained in:
parent
6fd1aa0388
commit
8f8398cbcd
4 changed files with 147 additions and 43 deletions
|
|
@ -375,7 +375,6 @@ class ShowcaseCameraSnapshot:
|
|||
var pitch_rotation: Vector3
|
||||
var spring_length: float
|
||||
var target_zoom: float
|
||||
var camera_input_enabled: bool
|
||||
var camera_dragging: bool
|
||||
|
||||
|
||||
|
|
@ -477,6 +476,7 @@ var _free_camera_yaw: float = 0.0
|
|||
var _free_camera_pitch: float = 0.0
|
||||
var _movement_enabled: bool = true
|
||||
var _local_input_suppressors: Dictionary[StringName, bool] = {}
|
||||
var _camera_input_suppressors: Dictionary[StringName, bool] = {}
|
||||
var _water_recovery_active: bool = false
|
||||
var _remote_recovery_presentation_active: bool = false
|
||||
var _remote_recovery_visual_origin: Vector3
|
||||
|
|
@ -1789,7 +1789,10 @@ func _update_free_camera_physics() -> void:
|
|||
if _free_camera == null or _free_camera_body == null:
|
||||
_set_free_camera_active(false)
|
||||
return
|
||||
if not _is_movement_input_enabled():
|
||||
# Freecam translation is camera input, not avatar movement. Fishing locks
|
||||
# the avatar after a cast, but the detached camera must remain movable.
|
||||
# Camera/menu input ownership still stops freecam while an overlay is active.
|
||||
if not _is_camera_input_enabled():
|
||||
_free_camera_body.velocity = Vector3.ZERO
|
||||
_free_camera_body.move_and_slide()
|
||||
return
|
||||
|
|
@ -2483,7 +2486,11 @@ func _is_movement_input_enabled() -> bool:
|
|||
|
||||
|
||||
func _is_camera_input_enabled() -> bool:
|
||||
return _camera_input_enabled and _local_input_suppressors.is_empty()
|
||||
return (
|
||||
_camera_input_enabled
|
||||
and _local_input_suppressors.is_empty()
|
||||
and _camera_input_suppressors.is_empty()
|
||||
)
|
||||
|
||||
|
||||
func set_camera_input_enabled(enabled: bool) -> void:
|
||||
|
|
@ -2492,6 +2499,19 @@ func set_camera_input_enabled(enabled: bool) -> void:
|
|||
_set_camera_dragging(false)
|
||||
|
||||
|
||||
func set_camera_input_suppressed(
|
||||
owner: StringName,
|
||||
suppressed: bool,
|
||||
) -> void:
|
||||
if owner.is_empty():
|
||||
return
|
||||
if suppressed:
|
||||
_camera_input_suppressors[owner] = true
|
||||
_set_camera_dragging(false)
|
||||
else:
|
||||
_camera_input_suppressors.erase(owner)
|
||||
|
||||
|
||||
func set_camera_active(active: bool) -> void:
|
||||
if _free_camera_active and _free_camera != null:
|
||||
_free_camera.current = active
|
||||
|
|
@ -3344,9 +3364,6 @@ func _complete_showcase_restore(
|
|||
_camera_pitch.rotation = _showcase_camera_snapshot.pitch_rotation
|
||||
_spring_arm.spring_length = _showcase_camera_snapshot.spring_length
|
||||
_target_zoom = _showcase_camera_snapshot.target_zoom
|
||||
_camera_input_enabled = (
|
||||
_showcase_camera_snapshot.camera_input_enabled
|
||||
)
|
||||
_set_camera_dragging(
|
||||
_showcase_camera_snapshot.camera_dragging
|
||||
and Input.is_action_pressed("camera_drag")
|
||||
|
|
@ -3367,9 +3384,7 @@ func _capture_showcase_camera_snapshot() -> void:
|
|||
_showcase_camera_snapshot.pitch_rotation = _camera_pitch.rotation
|
||||
_showcase_camera_snapshot.spring_length = _spring_arm.spring_length
|
||||
_showcase_camera_snapshot.target_zoom = _target_zoom
|
||||
_showcase_camera_snapshot.camera_input_enabled = _camera_input_enabled
|
||||
_showcase_camera_snapshot.camera_dragging = _camera_dragging
|
||||
_camera_input_enabled = false
|
||||
_set_camera_dragging(false)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue