From cdbcf29459a30dd34191781710779364aee8d45b Mon Sep 17 00:00:00 2001 From: hz Date: Fri, 7 Nov 2025 14:23:18 -0600 Subject: [PATCH] Ground plane now supports zoom in and zoom out --- scenes/Grid/grid_plane_manager.gd | 53 +++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/scenes/Grid/grid_plane_manager.gd b/scenes/Grid/grid_plane_manager.gd index aa5c409..01704e5 100644 --- a/scenes/Grid/grid_plane_manager.gd +++ b/scenes/Grid/grid_plane_manager.gd @@ -71,6 +71,34 @@ var _ground_padding: float = 20.0 get: return _ground_padding +var _zoom_factor: float = 1.0 +var _zoom_min_internal: float = 0.5 +var _zoom_max_internal: float = 3.0 +var _zoom_step_internal: float = 0.1 +@export_range(0.1, 10.0, 0.1) var zoom_min: float = 0.5: + set(value): + _zoom_min_internal = clamp(value, 0.1, min(_zoom_max_internal, 10.0)) + if _zoom_factor < _zoom_min_internal: + _zoom_factor = _zoom_min_internal + _update_camera_view() + _update_ground_assets() + get: + return _zoom_min_internal +@export_range(0.1, 10.0, 0.1) var zoom_max: float = 3.0: + set(value): + _zoom_max_internal = max(value, _zoom_min_internal) + if _zoom_factor > _zoom_max_internal: + _zoom_factor = _zoom_max_internal + _update_camera_view() + _update_ground_assets() + get: + return _zoom_max_internal +@export_range(0.01, 1.0, 0.01) var zoom_step: float = 0.1: + set(value): + _zoom_step_internal = clamp(value, 0.01, 1.0) + get: + return _zoom_step_internal + var _show_grid_lines: bool = true @export var show_grid_lines: bool: set(value): @@ -109,6 +137,7 @@ var _hex_center_offset_local: Vector3 = Vector3.ZERO func _ready() -> void: set_process(true) + _zoom_factor = clamp(_zoom_factor, _zoom_min_internal, _zoom_max_internal) _queue_rebuild() func get_cells() -> Dictionary: @@ -155,6 +184,8 @@ func _rebuild_grid() -> void: emit_signal("grid_layout_changed", _cells) func _update_ground_assets() -> void: + if not is_node_ready(): + return var required_size := _compute_required_ground_size() if _ground_mesh and _ground_mesh.mesh is PlaneMesh: var plane_mesh := _ground_mesh.mesh as PlaneMesh @@ -358,8 +389,8 @@ func _update_camera_view() -> void: return var extent: float = max(_grid_size.x, _grid_size.y) var half_extent: float = extent * 0.5 - var distance: float = max(half_extent * 1.1, 6.0) - var height: float = max(half_extent * 0.8, 6.0) + var distance: float = max(half_extent * 1.1, 6.0) * _zoom_factor + var height: float = max(half_extent * 0.8, 6.0) * _zoom_factor var offset: Vector3 = Vector3(distance, height, distance) var target: Vector3 = global_transform.origin var offset_global: Vector3 = global_transform.basis * offset @@ -403,6 +434,24 @@ func _process(_delta: float) -> void: var mouse_position: Vector2 = get_viewport().get_mouse_position() _update_hovered_cell(mouse_position) +func _unhandled_input(event: InputEvent) -> void: + if Engine.is_editor_hint(): + return + if event is InputEventMouseButton and event.pressed: + var button_event := event as InputEventMouseButton + if button_event.button_index == MOUSE_BUTTON_WHEEL_UP: + _adjust_zoom(-_zoom_step_internal) + elif button_event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + _adjust_zoom(_zoom_step_internal) + +func _adjust_zoom(delta: float) -> void: + var previous := _zoom_factor + _zoom_factor = clamp(_zoom_factor + delta, _zoom_min_internal, _zoom_max_internal) + if is_equal_approx(previous, _zoom_factor): + return + _update_camera_view() + _update_ground_assets() + func _update_hovered_cell(mouse_position: Vector2) -> void: if not _camera or not _hover_highlight: return