Browse Source

Enable Camera2D smoothing on limit change

(cherry picked from commit 525ad7c37ee146658e948cffbc2cea1e9071fca2)
Eric 4 years ago
parent
commit
09b231e15f
2 changed files with 16 additions and 11 deletions
  1. 2 0
      doc/classes/Camera2D.xml
  2. 14 11
      scene/2d/camera_2d.cpp

+ 2 - 0
doc/classes/Camera2D.xml

@@ -153,6 +153,8 @@
 		</member>
 		<member name="limit_smoothed" type="bool" setter="set_limit_smoothing_enabled" getter="is_limit_smoothing_enabled" default="false">
 			If [code]true[/code], the camera smoothly stops when reaches its limits.
+			This has no effect if smoothing is disabled.
+			[b]Note:[/b] To immediately update the camera's position to be within limits without smoothing, even with this setting enabled, invoke [method reset_smoothing].
 		</member>
 		<member name="limit_top" type="int" setter="set_limit" getter="get_limit" default="-10000000">
 			Top scroll limit in pixels. The camera stops moving when reaching this value.

+ 14 - 11
scene/2d/camera_2d.cpp

@@ -196,20 +196,23 @@ Transform2D Camera2D::get_camera_transform() {
 	}
 
 	Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom);
-	if (screen_rect.position.x < limit[MARGIN_LEFT]) {
-		screen_rect.position.x = limit[MARGIN_LEFT];
-	}
 
-	if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) {
-		screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x;
-	}
+	if (!limit_smoothing_enabled) {
+		if (screen_rect.position.x < limit[MARGIN_LEFT]) {
+			screen_rect.position.x = limit[MARGIN_LEFT];
+		}
 
-	if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) {
-		screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y;
-	}
+		if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) {
+			screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x;
+		}
+
+		if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) {
+			screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y;
+		}
 
-	if (screen_rect.position.y < limit[MARGIN_TOP]) {
-		screen_rect.position.y = limit[MARGIN_TOP];
+		if (screen_rect.position.y < limit[MARGIN_TOP]) {
+			screen_rect.position.y = limit[MARGIN_TOP];
+		}
 	}
 
 	if (offset != Vector2()) {