|
@@ -78,6 +78,7 @@ void Camera2D::set_zoom(const Vector2 &p_zoom) {
|
|
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).");
|
|
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).");
|
|
|
|
|
|
zoom = p_zoom;
|
|
zoom = p_zoom;
|
|
|
|
+ zoom_scale = Vector2(1, 1) / zoom;
|
|
Point2 old_smoothed_camera_pos = smoothed_camera_pos;
|
|
Point2 old_smoothed_camera_pos = smoothed_camera_pos;
|
|
_update_scroll();
|
|
_update_scroll();
|
|
smoothed_camera_pos = old_smoothed_camera_pos;
|
|
smoothed_camera_pos = old_smoothed_camera_pos;
|
|
@@ -102,8 +103,8 @@ Transform2D Camera2D::get_camera_transform() {
|
|
if (!first) {
|
|
if (!first) {
|
|
if (anchor_mode == ANCHOR_MODE_DRAG_CENTER) {
|
|
if (anchor_mode == ANCHOR_MODE_DRAG_CENTER) {
|
|
if (drag_horizontal_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_horizontal_offset_changed) {
|
|
if (drag_horizontal_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_horizontal_offset_changed) {
|
|
- camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * zoom.x * drag_margin[SIDE_LEFT]));
|
|
|
|
- camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * zoom.x * drag_margin[SIDE_RIGHT]));
|
|
|
|
|
|
+ camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * zoom_scale.x * drag_margin[SIDE_LEFT]));
|
|
|
|
+ camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * zoom_scale.x * drag_margin[SIDE_RIGHT]));
|
|
} else {
|
|
} else {
|
|
if (drag_horizontal_offset < 0) {
|
|
if (drag_horizontal_offset < 0) {
|
|
camera_pos.x = new_camera_pos.x + screen_size.x * 0.5 * drag_margin[SIDE_RIGHT] * drag_horizontal_offset;
|
|
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() {
|
|
}
|
|
}
|
|
|
|
|
|
if (drag_vertical_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_vertical_offset_changed) {
|
|
if (drag_vertical_enabled && !Engine::get_singleton()->is_editor_hint() && !drag_vertical_offset_changed) {
|
|
- camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * zoom.y * drag_margin[SIDE_TOP]));
|
|
|
|
- camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * zoom.y * drag_margin[SIDE_BOTTOM]));
|
|
|
|
|
|
+ camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * zoom_scale.y * drag_margin[SIDE_TOP]));
|
|
|
|
+ camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * zoom_scale.y * drag_margin[SIDE_BOTTOM]));
|
|
|
|
|
|
} else {
|
|
} else {
|
|
if (drag_vertical_offset < 0) {
|
|
if (drag_vertical_offset < 0) {
|
|
@@ -132,8 +133,8 @@ Transform2D Camera2D::get_camera_transform() {
|
|
camera_pos = new_camera_pos;
|
|
camera_pos = new_camera_pos;
|
|
}
|
|
}
|
|
|
|
|
|
- Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2());
|
|
|
|
- Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom);
|
|
|
|
|
|
+ Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2());
|
|
|
|
+ Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom_scale);
|
|
|
|
|
|
if (limit_smoothing_enabled) {
|
|
if (limit_smoothing_enabled) {
|
|
if (screen_rect.position.x < limit[SIDE_LEFT]) {
|
|
if (screen_rect.position.x < limit[SIDE_LEFT]) {
|
|
@@ -167,14 +168,14 @@ Transform2D Camera2D::get_camera_transform() {
|
|
first = false;
|
|
first = false;
|
|
}
|
|
}
|
|
|
|
|
|
- Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom) : Point2());
|
|
|
|
|
|
+ Point2 screen_offset = (anchor_mode == ANCHOR_MODE_DRAG_CENTER ? (screen_size * 0.5 * zoom_scale) : Point2());
|
|
|
|
|
|
real_t angle = get_global_rotation();
|
|
real_t angle = get_global_rotation();
|
|
if (rotating) {
|
|
if (rotating) {
|
|
screen_offset = screen_offset.rotated(angle);
|
|
screen_offset = screen_offset.rotated(angle);
|
|
}
|
|
}
|
|
|
|
|
|
- Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom);
|
|
|
|
|
|
+ Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom_scale);
|
|
|
|
|
|
if (!smoothing_enabled || !limit_smoothing_enabled) {
|
|
if (!smoothing_enabled || !limit_smoothing_enabled) {
|
|
if (screen_rect.position.x < limit[SIDE_LEFT]) {
|
|
if (screen_rect.position.x < limit[SIDE_LEFT]) {
|
|
@@ -201,7 +202,7 @@ Transform2D Camera2D::get_camera_transform() {
|
|
camera_screen_center = screen_rect.get_center();
|
|
camera_screen_center = screen_rect.get_center();
|
|
|
|
|
|
Transform2D xform;
|
|
Transform2D xform;
|
|
- xform.scale_basis(zoom);
|
|
|
|
|
|
+ xform.scale_basis(zoom_scale);
|
|
if (rotating) {
|
|
if (rotating) {
|
|
xform.set_rotation(angle);
|
|
xform.set_rotation(angle);
|
|
}
|
|
}
|