Ground plane now supports zoom in and zoom out
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user