Skip to content

Commit

Permalink
Improved camera zoom
Browse files Browse the repository at this point in the history
  • Loading branch information
mbrlabs committed Jun 12, 2021
1 parent f6b392a commit 78c06a8
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 22 deletions.
2 changes: 2 additions & 0 deletions docs/changelog.md
Expand Up @@ -14,10 +14,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Translations: Spanish

### Fixed
- Fixed camera position & zoom getting reset when switching between tabs

### Changed
- Disabled VSync and set the fixed target FPS to 144, which results in much smoother brush strokes and a better feeling on low Hz monitors
- Lower the FPS to 10 if the window is unfocused to reduce the CPU/GPU load and save energy
- Improved camera zoom

## [0.2.0] - 2021-06-03

Expand Down
13 changes: 13 additions & 0 deletions lorien/InfiniteCanvas/InfiniteCanvas.gd
Expand Up @@ -38,6 +38,8 @@ func _ready():
get_tree().get_root().connect("size_changed", self, "_on_window_resized")
_camera.connect("zoom_changed", $Viewport/SelectionCursor, "_on_zoom_changed")
_camera.connect("zoom_changed", $Viewport/ColorPickerCursor, "_on_zoom_changed")
_camera.connect("zoom_changed", self, "_on_zoom_changed")
_camera.connect("position_changed", self, "_on_camera_moved")
_viewport.size = OS.window_size

# -------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -239,6 +241,17 @@ func get_camera_zoom() -> float:
func get_camera_offset() -> Vector2:
return _camera.offset

# -------------------------------------------------------------------------------------------------
func _on_zoom_changed(zoom: float) -> void:
_current_project.meta_data[ProjectMetadata.CAMERA_ZOOM] = str(zoom)
_current_project.dirty = true

# -------------------------------------------------------------------------------------------------
func _on_camera_moved(pos: Vector2) -> void:
_current_project.meta_data[ProjectMetadata.CAMERA_OFFSET_X] = str(pos.x)
_current_project.meta_data[ProjectMetadata.CAMERA_OFFSET_Y] = str(pos.y)
_current_project.dirty = true

# -------------------------------------------------------------------------------------------------
func _delete_selected_strokes() -> void:
var strokes := _selection_tool.get_selected_strokes()
Expand Down
4 changes: 3 additions & 1 deletion lorien/InfiniteCanvas/InfiniteCanvas.tscn
@@ -1,4 +1,4 @@
[gd_scene load_steps=15 format=2]
[gd_scene load_steps=16 format=2]

[ext_resource path="res://InfiniteCanvas/InfiniteCanvas.gd" type="Script" id=1]
[ext_resource path="res://InfiniteCanvas/PanZoomCamera.gd" type="Script" id=2]
Expand All @@ -13,6 +13,7 @@
[ext_resource path="res://InfiniteCanvas/Cursor/ColorPickerCursor/ColorPickerCursor.tscn" type="PackedScene" id=11]
[ext_resource path="res://InfiniteCanvas/InfiniteCanvasGrid.gd" type="Script" id=12]
[ext_resource path="res://InfiniteCanvas/Tools/ColorPickerTool.gd" type="Script" id=13]
[ext_resource path="res://InfiniteCanvas/zoom_curve.tres" type="Curve" id=14]

[sub_resource type="ShaderMaterial" id=1]
shader = ExtResource( 10 )
Expand Down Expand Up @@ -60,6 +61,7 @@ render_target_update_mode = 3
anchor_mode = 0
current = true
script = ExtResource( 2 )
zoom_curve = ExtResource( 14 )

[node name="Grid" type="Node2D" parent="Viewport"]
script = ExtResource( 12 )
Expand Down
40 changes: 24 additions & 16 deletions lorien/InfiniteCanvas/PanZoomCamera.gd
Expand Up @@ -3,10 +3,12 @@ extends Camera2D
signal zoom_changed(value)
signal position_changed(value)

const MAX_MOUSE_WHEEL_LEVEL := 1000
const MIN_MOUSE_WHEEL_LEVEL := -9
const MAX_MOUSE_WHEEL_LEVEL := 99
const MIN_MOUSE_WHEEL_LEVEL := -8
const ZOOM_INCREMENT = 0.1

export var zoom_curve: Curve

var _current_zoom_level := 1.0
var _pan_active := false
var _is_input_enabled := true
Expand All @@ -15,7 +17,22 @@ var _mouse_wheel_counter := 0

# -------------------------------------------------------------------------------------------------
func set_zoom_level(zoom_level: float) -> void:
_current_zoom_level = zoom_level
_current_zoom_level = 1.0
_mouse_wheel_counter = 0

if !is_equal_approx(zoom_level, 1.0):
var wheel_direction := -1 if (zoom_level < 1.0) else 1

while true:
_mouse_wheel_counter += wheel_direction
_current_zoom_level = 1.0 + _mouse_wheel_counter * _calc_zoom_increment()

if wheel_direction < 0:
if _current_zoom_level <= zoom_level:
break
else:
if _current_zoom_level >= zoom_level:
break
zoom = Vector2(_current_zoom_level, _current_zoom_level)

# -------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -63,19 +80,10 @@ func _do_zoom() -> void:

# -------------------------------------------------------------------------------------------------
func _calc_zoom_increment() -> float:
var incr := ZOOM_INCREMENT
if _mouse_wheel_counter >= 100:
incr *= 5.0
elif _mouse_wheel_counter >= 75:
incr *= 4.0
elif _mouse_wheel_counter >= 50:
incr *= 3.0
elif _mouse_wheel_counter >= 25:
incr *= 2.0
elif _mouse_wheel_counter >= 10:
incr *= 1.5
return incr

var progress: float = _mouse_wheel_counter + abs(MIN_MOUSE_WHEEL_LEVEL)
progress /= (abs(MIN_MOUSE_WHEEL_LEVEL) + MAX_MOUSE_WHEEL_LEVEL)
return zoom_curve.interpolate(progress)

# -------------------------------------------------------------------------------------------------
func enable_intput() -> void:
_is_input_enabled = true
Expand Down
4 changes: 4 additions & 0 deletions lorien/InfiniteCanvas/zoom_curve.tres
@@ -0,0 +1,4 @@
[gd_resource type="Curve" format=2]

[resource]
_data = [ Vector2( 0, 0.103448 ), 0.0, 0.631661, 0, 0, Vector2( 0.372549, 0.5 ), 1.67026, 1.67026, 0, 0, Vector2( 0.602941, 0.896552 ), 0.903076, 0.903076, 0, 0, Vector2( 1, 1 ), 0.167487, 0.0, 0, 0 ]
5 changes: 2 additions & 3 deletions lorien/Misc/I18nParser.gd
Expand Up @@ -4,14 +4,13 @@ class_name I18nParser
const I18N_FOLDER := "res://Assets/I18n/"

# -------------------------------------------------------------------------------------------------

class ParseResult:
var locales := PoolStringArray()
var language_names := PoolStringArray()

func append(var locale : String, var name : String) -> void:
func append(var locale: String, var lang_name: String) -> void:
locales.append(locale)
language_names.append(name)
language_names.append(lang_name)

# -------------------------------------------------------------------------------------------------
func load_files() -> ParseResult:
Expand Down
4 changes: 2 additions & 2 deletions lorien/ProjectManager/ProjectMetadata.gd
@@ -1,7 +1,7 @@
extends Node

# -------------------------------------------------------------------------------------------------
const CAMERA_ZOOM = "camera_zoom"
const CAMERA_ZOOM := "camera_zoom"
const CAMERA_OFFSET_X := "camera_offset_x"
const CAMERA_OFFSET_Y := "camera_offset_y"
const CANVAS_COLOR := "canvas_color"
Expand All @@ -26,8 +26,8 @@ func apply_from_dict(meta_data: Dictionary, canvas: InfiniteCanvas) -> void:
var new_cam_offset_y_str: String = meta_data.get(CAMERA_OFFSET_Y, "0.0")
var new_canvas_color: String = meta_data.get(CANVAS_COLOR, Config.DEFAULT_CANVAS_COLOR.to_html())

cam.set_zoom_level(float(new_cam_zoom_str))
cam.offset = Vector2(float(new_cam_offset_x_str), float(new_cam_offset_y_str))
cam.set_zoom_level(float(new_cam_zoom_str))
canvas.set_background_color(Color(new_canvas_color))

# -------------------------------------------------------------------------------------------------
Expand Down

0 comments on commit 78c06a8

Please sign in to comment.