Skip to content

Commit 15ea670

Browse files
committed
Invert Camear2D zoom to make it intuitive
1 parent d7822cb commit 15ea670

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

doc/classes/Camera2D.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@
157157
Speed in pixels per second of the camera's smoothing effect when [member smoothing_enabled] is [code]true[/code].
158158
</member>
159159
<member name="zoom" type="Vector2" setter="set_zoom" getter="get_zoom" default="Vector2(1, 1)">
160-
The camera's zoom relative to the viewport. Values larger than [code]Vector2(1, 1)[/code] zoom out and smaller values zoom in. For an example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and [code]Vector2(4, 4)[/code] for a 4× zoom-out.
160+
The camera's zoom. A zoom of [code]Vector(2, 2)[/code] doubles the size seen in the viewport. A zoom of [code]Vector(0.5, 0.5)[/code] halves the size seen in the viewport.
161161
</member>
162162
</members>
163163
<constants>

scene/2d/camera_2d.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ void Camera2D::set_zoom(const Vector2 &p_zoom) {
7878
ERR_FAIL_COND_MSG(Math::is_zero_approx(p_zoom.x) || Math::is_zero_approx(p_zoom.y), "Zoom level must be different from 0 (can be negative).");
7979

8080
zoom = p_zoom;
81+
zoom_scale = Vector2(1, 1) / zoom;
8182
Point2 old_smoothed_camera_pos = smoothed_camera_pos;
8283
_update_scroll();
8384
smoothed_camera_pos = old_smoothed_camera_pos;
@@ -102,8 +103,8 @@ Transform2D Camera2D::get_camera_transform() {
102103
if (!first) {
103104
if (anchor_mode == ANCHOR_MODE_DRAG_CENTER) {
104105
if (drag_horizontal_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_horizontal_offset_changed) {
105-
camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * zoom.x * drag_margin[SIDE_LEFT]));
106-
camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * zoom.x * drag_margin[SIDE_RIGHT]));
106+
camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * zoom_scale.x * drag_margin[SIDE_LEFT]));
107+
camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * zoom_scale.x * drag_margin[SIDE_RIGHT]));
107108
} else {
108109
if (drag_horizontal_offset < 0) {
109110
camera_pos.x = new_camera_pos.x + screen_size.x * 0.5 * drag_margin[SIDE_RIGHT] * drag_horizontal_offset;
@@ -115,8 +116,8 @@ Transform2D Camera2D::get_camera_transform() {
115116
}
116117

117118
if (drag_vertical_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_vertical_offset_changed) {
118-
camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * zoom.y * drag_margin[SIDE_TOP]));
119-
camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * zoom.y * drag_margin[SIDE_BOTTOM]));
119+
camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * zoom_scale.y * drag_margin[SIDE_TOP]));
120+
camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * zoom_scale.y * drag_margin[SIDE_BOTTOM]));
120121

121122
} else {
122123
if (drag_vertical_offset < 0) {
@@ -132,8 +133,8 @@ Transform2D Camera2D::get_camera_transform() {
132133
camera_pos = new_camera_pos;
133134
}
134135

135-
Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2());
136-
Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom);
136+
Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2());
137+
Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom_scale);
137138

138139
if (limit_smoothing_enabled) {
139140
if (screen_rect.position.x < limit[SIDE_LEFT]) {
@@ -167,14 +168,14 @@ Transform2D Camera2D::get_camera_transform() {
167168
first = false;
168169
}
169170

170-
Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2());
171+
Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2());
171172

172173
real_t angle = get_global_rotation();
173174
if (rotating) {
174175
screen_offset = screen_offset.rotated(angle);
175176
}
176177

177-
Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom);
178+
Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom_scale);
178179

179180
if (!smoothing_enabled || !limit_smoothing_enabled) {
180181
if (screen_rect.position.x < limit[SIDE_LEFT]) {
@@ -201,7 +202,7 @@ Transform2D Camera2D::get_camera_transform() {
201202
camera_screen_center = screen_rect.get_center();
202203

203204
Transform2D xform;
204-
xform.scale_basis(zoom);
205+
xform.scale_basis(zoom_scale);
205206
if (rotating) {
206207
xform.set_rotation(angle);
207208
}

scene/2d/camera_2d.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Camera2D : public Node2D {
6161
RID canvas;
6262
Vector2 offset;
6363
Vector2 zoom = Vector2(1, 1);
64+
Vector2 zoom_scale = Vector2(1, 1);
6465
AnchorMode anchor_mode = ANCHOR_MODE_DRAG_CENTER;
6566
bool rotating = false;
6667
bool current = false;

0 commit comments

Comments
 (0)