dash speed 3x, slam visual/damage fix
This commit is contained in:
+27
-63
@@ -4,58 +4,39 @@ extends Camera3D
|
||||
@export var horizontal_distance: float = 28.0
|
||||
@export var horizontal_angle_deg: float = 45.0
|
||||
|
||||
# --- ORTHOGRAPHIC ZOOM SETTINGS ---
|
||||
@export var size_min: float = 5.0 # Maximum zoom in (small frame size)
|
||||
@export var size_max: float = 30.0 # Maximum zoom out (large frame size)
|
||||
@export var size_min: float = 5.0
|
||||
@export var size_max: float = 30.0
|
||||
@export var default_size: float = 15.0
|
||||
|
||||
# --- TILT-SHIFT DOF SETTINGS ---
|
||||
@export var focus_slice_thickness: float = 6.0
|
||||
@export var blur_transition: float = 15.0
|
||||
|
||||
const _FLASH_DURATION: float = 0.30
|
||||
@export var focus_slice_thickness: float = 6.0
|
||||
@export var blur_transition: float = 15.0
|
||||
|
||||
var _shake_amount: float = 0.0
|
||||
var _shake_decay: float = 0.0
|
||||
var _flash_timer: float = 0.0
|
||||
var _flash_rect: ColorRect = null
|
||||
var _target_size: float = 0.0
|
||||
var _shake_decay: float = 0.0
|
||||
var _user_size: float = 0.0
|
||||
var _charge_active: bool = false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
set_as_top_level(true)
|
||||
projection = Camera3D.PROJECTION_ORTHOGONAL # Switched to orthographic
|
||||
_target_size = default_size
|
||||
projection = Camera3D.PROJECTION_ORTHOGONAL
|
||||
_user_size = default_size
|
||||
size = default_size
|
||||
|
||||
near = 0.1
|
||||
far = 150.0
|
||||
|
||||
_setup_flash()
|
||||
|
||||
|
||||
func _setup_flash() -> void:
|
||||
var canvas := CanvasLayer.new()
|
||||
canvas.layer = 20
|
||||
add_child(canvas)
|
||||
_flash_rect = ColorRect.new()
|
||||
_flash_rect.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
||||
_flash_rect.color = Color(1.0, 0.25, 0.2, 0.0)
|
||||
_flash_rect.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||
canvas.add_child(_flash_rect)
|
||||
near = 0.1
|
||||
far = 150.0
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
# Zoom inputs now scale the Orthographic Size property
|
||||
if event.is_action_pressed("zoom_in"):
|
||||
_target_size = clamp(_target_size / 1.2, size_min, size_max)
|
||||
_user_size = clamp(_user_size / 1.2, size_min, size_max)
|
||||
if event.is_action_pressed("zoom_out"):
|
||||
_target_size = clamp(_target_size * 1.2, size_min, size_max)
|
||||
_user_size = clamp(_user_size * 1.2, size_min, size_max)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
size = lerpf(size, _target_size, delta * 10.0)
|
||||
|
||||
var zoom_target := _user_size * DP.f("charge_zoom_factor") if _charge_active else _user_size
|
||||
size = lerpf(size, zoom_target, delta * 8.0)
|
||||
|
||||
var angle_rad := deg_to_rad(horizontal_angle_deg)
|
||||
var offset := Vector3(
|
||||
sin(angle_rad) * horizontal_distance,
|
||||
@@ -66,7 +47,6 @@ func _process(delta: float) -> void:
|
||||
global_position = target.global_position + offset
|
||||
look_at(target.global_position, Vector3.UP)
|
||||
|
||||
# --- DYNAMIC TILT SHIFT CALCULATION ---
|
||||
_update_ortho_tilt_shift_dof(target.global_position)
|
||||
|
||||
if _shake_amount > 0.005:
|
||||
@@ -77,54 +57,38 @@ func _process(delta: float) -> void:
|
||||
)
|
||||
_shake_amount = move_toward(_shake_amount, 0.0, _shake_decay * delta)
|
||||
|
||||
if _flash_timer > 0.0:
|
||||
_flash_timer = maxf(0.0, _flash_timer - delta)
|
||||
_flash_rect.color.a = (_flash_timer / _FLASH_DURATION) * 0.6
|
||||
else:
|
||||
_flash_rect.color.a = 0.0
|
||||
|
||||
|
||||
func trigger_hit(strength: float) -> void:
|
||||
_shake_amount = strength * 0.5
|
||||
_shake_decay = _shake_amount / 0.4
|
||||
_flash_timer = _FLASH_DURATION
|
||||
_shake_decay = _shake_amount / 0.4
|
||||
|
||||
|
||||
func set_charge_active(active: bool) -> void:
|
||||
_charge_active = active
|
||||
|
||||
|
||||
func _update_ortho_tilt_shift_dof(target_pos: Vector3) -> void:
|
||||
var cam_attr: CameraAttributesPractical = null
|
||||
|
||||
|
||||
if "attributes" in self and self.attributes is CameraAttributesPractical:
|
||||
cam_attr = self.attributes
|
||||
elif "camera_attributes" in self and self.camera_attributes is CameraAttributesPractical:
|
||||
cam_attr = self.camera_attributes
|
||||
|
||||
if cam_attr != null:
|
||||
# 1. Project distance onto the camera's true forward forward axis
|
||||
var to_target := target_pos - global_position
|
||||
var forward_vector := -global_transform.basis.z
|
||||
var ortho_depth := to_target.dot(forward_vector)
|
||||
|
||||
# 2. Extract the dynamic zoom multiplier
|
||||
|
||||
var zoom_factor := size / default_size
|
||||
var dynamic_slice := focus_slice_thickness * zoom_factor
|
||||
var half_slice := dynamic_slice * 0.5
|
||||
|
||||
# Base transition modified by the zoom state
|
||||
|
||||
var base_transition := blur_transition * zoom_factor
|
||||
|
||||
# 3. Apply the focal zones
|
||||
cam_attr.dof_blur_far_distance = ortho_depth + half_slice
|
||||
cam_attr.dof_blur_far_distance = ortho_depth + half_slice
|
||||
cam_attr.dof_blur_near_distance = maxf(near + 0.1, ortho_depth - half_slice)
|
||||
|
||||
# 4. ASYMMETRICAL CORRECTION FOR GODOT 4.7 FORWARD+
|
||||
# Far transition needs a massive punch to actually manifest on screen
|
||||
cam_attr.dof_blur_far_transition = maxf(0.1, base_transition * 0.5)
|
||||
|
||||
# Near transition needs to be greatly expanded (larger number = gentler slope)
|
||||
# to stop it from snapping into massive instant blur
|
||||
cam_attr.dof_blur_far_transition = maxf(0.1, base_transition * 0.5)
|
||||
cam_attr.dof_blur_near_transition = maxf(1.0, base_transition * 1.5)
|
||||
|
||||
# 5. Keep both enabled
|
||||
cam_attr.dof_blur_far_enabled = false
|
||||
cam_attr.dof_blur_far_enabled = false
|
||||
cam_attr.dof_blur_near_enabled = false
|
||||
|
||||
|
||||
Reference in New Issue
Block a user