Ground plane now supports zoom in and zoom out

This commit is contained in:
hz
2025-11-07 14:23:18 -06:00
parent a5fc35fb0e
commit cdbcf29459
+51 -2
View File
@@ -71,6 +71,34 @@ var _ground_padding: float = 20.0
get: get:
return _ground_padding 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 var _show_grid_lines: bool = true
@export var show_grid_lines: bool: @export var show_grid_lines: bool:
set(value): set(value):
@@ -109,6 +137,7 @@ var _hex_center_offset_local: Vector3 = Vector3.ZERO
func _ready() -> void: func _ready() -> void:
set_process(true) set_process(true)
_zoom_factor = clamp(_zoom_factor, _zoom_min_internal, _zoom_max_internal)
_queue_rebuild() _queue_rebuild()
func get_cells() -> Dictionary: func get_cells() -> Dictionary:
@@ -155,6 +184,8 @@ func _rebuild_grid() -> void:
emit_signal("grid_layout_changed", _cells) emit_signal("grid_layout_changed", _cells)
func _update_ground_assets() -> void: func _update_ground_assets() -> void:
if not is_node_ready():
return
var required_size := _compute_required_ground_size() var required_size := _compute_required_ground_size()
if _ground_mesh and _ground_mesh.mesh is PlaneMesh: if _ground_mesh and _ground_mesh.mesh is PlaneMesh:
var plane_mesh := _ground_mesh.mesh as PlaneMesh var plane_mesh := _ground_mesh.mesh as PlaneMesh
@@ -358,8 +389,8 @@ func _update_camera_view() -> void:
return return
var extent: float = max(_grid_size.x, _grid_size.y) var extent: float = max(_grid_size.x, _grid_size.y)
var half_extent: float = extent * 0.5 var half_extent: float = extent * 0.5
var distance: float = max(half_extent * 1.1, 6.0) var distance: float = max(half_extent * 1.1, 6.0) * _zoom_factor
var height: float = max(half_extent * 0.8, 6.0) var height: float = max(half_extent * 0.8, 6.0) * _zoom_factor
var offset: Vector3 = Vector3(distance, height, distance) var offset: Vector3 = Vector3(distance, height, distance)
var target: Vector3 = global_transform.origin var target: Vector3 = global_transform.origin
var offset_global: Vector3 = global_transform.basis * offset 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() var mouse_position: Vector2 = get_viewport().get_mouse_position()
_update_hovered_cell(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: func _update_hovered_cell(mouse_position: Vector2) -> void:
if not _camera or not _hover_highlight: if not _camera or not _hover_highlight:
return return