extends Button class_name TitleButton @export var angle_x_max: float = 7.0 @export var angle_y_max: float = 7.0 var tween_rot: Tween @onready var menu_btn_texture: TextureRect = $MenuTexture func _ready() -> void: angle_x_max = deg_to_rad(angle_x_max) angle_y_max = deg_to_rad(angle_y_max) # Sets the size to any texture size so 3d effect works on all sizes size.x = menu_btn_texture.size.x size.y = menu_btn_texture.size.y menu_btn_texture.material = menu_btn_texture.material.duplicate() func _on_gui_input(event: InputEvent) -> void: if not event is InputEventMouseMotion: return var mouse_pos: Vector2 = get_local_mouse_position() # Calculate rotation based on mouse position var padding_x = size.x * 0.1 var padding_y = size.y * 0.1 var lerp_val_x: float = remap(mouse_pos.x, -padding_x, size.x, 0, 1) var lerp_val_y: float = remap(mouse_pos.y, -padding_y, size.y, 0, 1) var rot_x: float = rad_to_deg(lerp_angle(-angle_x_max, angle_x_max, lerp_val_x)) var rot_y: float = rad_to_deg(lerp_angle(angle_y_max, -angle_y_max, lerp_val_y)) menu_btn_texture.material.set_shader_parameter("x_rot", rot_y) menu_btn_texture.material.set_shader_parameter("y_rot", rot_x) func _on_mouse_exited() -> void: # Resets rotation when exited if tween_rot and tween_rot.is_running(): tween_rot.kill() tween_rot = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK).set_parallel(true) tween_rot.tween_property(menu_btn_texture.material, "shader_parameter/x_rot", 0.0, 0.4) tween_rot.tween_property(menu_btn_texture.material, "shader_parameter/y_rot", 0.0, 0.4) func get_texture_rect() -> TextureRect: return $MenuTexture func set_image(image_path: String) -> void: $MenuTexture.texture = load(image_path)