Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Smoothing Speed Control for Individual Axes in Camera2D #95717

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
Open
5 changes: 4 additions & 1 deletion doc/classes/Camera2D.xml
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,12 @@
<member name="position_smoothing_enabled" type="bool" setter="set_position_smoothing_enabled" getter="is_position_smoothing_enabled" default="false">
If [code]true[/code], the camera's view smoothly moves towards its target position at [member position_smoothing_speed].
</member>
<member name="position_smoothing_speed" type="float" setter="set_position_smoothing_speed" getter="get_position_smoothing_speed" default="5.0">
<member name="position_smoothing_speed" type="float" setter="set_position_smoothing_speed" getter="get_position_smoothing_speed" default="5.0" deprecated="Use [member position_smoothing_velocity] instead.">
Speed in pixels per second of the camera's smoothing effect when [member position_smoothing_enabled] is [code]true[/code].
</member>
<member name="position_smoothing_velocity" type="Vector2" setter="set_position_smoothing_velocity" getter="get_position_smoothing_velocity" default="Vector2(5, 5)">
Speed in pixels per second for the X and Y axes of the camera's smoothing effect when [member position_smoothing_enabled] is [code]true[/code].
</member>
<member name="process_callback" type="int" setter="set_process_callback" getter="get_process_callback" enum="Camera2D.Camera2DProcessCallback" default="1">
The camera's process callback. See [enum Camera2DProcessCallback].
</member>
Expand Down
33 changes: 28 additions & 5 deletions scene/2d/camera_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ Transform2D Camera2D::get_camera_transform() {
if (position_smoothing_enabled && !_is_editing_in_editor()) {
bool physics_process = (process_callback == CAMERA2D_PROCESS_PHYSICS) || is_physics_interpolated_and_enabled();
real_t delta = physics_process ? get_physics_process_delta_time() : get_process_delta_time();
real_t c = position_smoothing_speed * delta;
Vector2 c = position_smoothing_velocity * delta;
smoothed_camera_pos = ((camera_pos - smoothed_camera_pos) * c) + smoothed_camera_pos;
ret_camera_pos = smoothed_camera_pos;
//camera_pos=camera_pos*(1.0-position_smoothing_speed)+new_camera_pos*position_smoothing_speed;
Expand Down Expand Up @@ -538,7 +538,7 @@ void Camera2D::_make_current(Object *p_which) {

void Camera2D::_update_process_internal_for_smoothing() {
bool is_not_in_scene_or_editor = !(is_inside_tree() && _is_editing_in_editor());
bool is_any_smoothing_valid = position_smoothing_speed > 0 || rotation_smoothing_speed > 0;
bool is_any_smoothing_valid = position_smoothing_velocity.x > 0 || position_smoothing_velocity.y > 0 || rotation_smoothing_speed > 0;

bool enable = is_any_smoothing_valid && is_not_in_scene_or_editor;
set_process_internal(enable);
Expand Down Expand Up @@ -650,6 +650,7 @@ void Camera2D::align() {
_update_scroll();
}

#ifndef DISABLE_DEPRECATED
void Camera2D::set_position_smoothing_speed(real_t p_speed) {
position_smoothing_speed = MAX(0, p_speed);
_update_process_internal_for_smoothing();
Expand All @@ -658,6 +659,15 @@ void Camera2D::set_position_smoothing_speed(real_t p_speed) {
real_t Camera2D::get_position_smoothing_speed() const {
return position_smoothing_speed;
}
#endif

void Camera2D::set_position_smoothing_velocity(Vector2 p_speed) {
position_smoothing_velocity = Vector2(MAX(0, p_speed.x), MAX(0, p_speed.y));
}

Vector2 Camera2D::get_position_smoothing_velocity() const {
return position_smoothing_velocity;
}

void Camera2D::set_rotation_smoothing_speed(real_t p_speed) {
rotation_smoothing_speed = MAX(0, p_speed);
Expand Down Expand Up @@ -732,7 +742,7 @@ void Camera2D::_set_old_smoothing(real_t p_enable) {
//compatibility
if (p_enable > 0) {
position_smoothing_enabled = true;
set_position_smoothing_speed(p_enable);
set_position_smoothing_velocity(Vector2(p_enable, p_enable));
}
}

Expand Down Expand Up @@ -813,7 +823,12 @@ bool Camera2D::is_margin_drawing_enabled() const {
}

void Camera2D::_validate_property(PropertyInfo &p_property) const {
if (!position_smoothing_enabled && p_property.name == "position_smoothing_speed") {
#ifndef DISABLE_DEPRECATED
if (p_property.name == "position_smoothing_speed" && position_smoothing_speed == 5.0) {
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
}
#endif
if (!position_smoothing_enabled && p_property.name == "position_smoothing_velocity") {
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
}
if (!rotation_smoothing_enabled && p_property.name == "rotation_smoothing_speed") {
Expand Down Expand Up @@ -873,10 +888,15 @@ void Camera2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_custom_viewport", "viewport"), &Camera2D::set_custom_viewport);
ClassDB::bind_method(D_METHOD("get_custom_viewport"), &Camera2D::get_custom_viewport);

#ifndef DISABLE_DEPRECATED
ClassDB::bind_method(D_METHOD("set_position_smoothing_speed", "position_smoothing_speed"), &Camera2D::set_position_smoothing_speed);
ClassDB::bind_method(D_METHOD("get_position_smoothing_speed"), &Camera2D::get_position_smoothing_speed);
#endif

ClassDB::bind_method(D_METHOD("set_position_smoothing_enabled", "position_smoothing_speed"), &Camera2D::set_position_smoothing_enabled);
ClassDB::bind_method(D_METHOD("set_position_smoothing_velocity", "position_smoothing_velocity"), &Camera2D::set_position_smoothing_velocity);
ClassDB::bind_method(D_METHOD("get_position_smoothing_velocity"), &Camera2D::get_position_smoothing_velocity);

ClassDB::bind_method(D_METHOD("set_position_smoothing_enabled", "position_smoothing_velocity"), &Camera2D::set_position_smoothing_enabled);
ClassDB::bind_method(D_METHOD("is_position_smoothing_enabled"), &Camera2D::is_position_smoothing_enabled);

ClassDB::bind_method(D_METHOD("set_rotation_smoothing_enabled", "enabled"), &Camera2D::set_rotation_smoothing_enabled);
Expand Down Expand Up @@ -917,7 +937,10 @@ void Camera2D::_bind_methods() {

ADD_GROUP("Position Smoothing", "position_smoothing_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "position_smoothing_enabled"), "set_position_smoothing_enabled", "is_position_smoothing_enabled");
#ifndef DISABLE_DEPRECATED
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "position_smoothing_speed", PROPERTY_HINT_NONE, "suffix:px/s"), "set_position_smoothing_speed", "get_position_smoothing_speed");
#endif
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "position_smoothing_velocity", PROPERTY_HINT_LINK, "suffix:px/s"), "set_position_smoothing_velocity", "get_position_smoothing_velocity");

ADD_GROUP("Rotation Smoothing", "rotation_smoothing_");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "rotation_smoothing_enabled"), "set_rotation_smoothing_enabled", "is_rotation_smoothing_enabled");
Expand Down
7 changes: 7 additions & 0 deletions scene/2d/camera_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ class Camera2D : public Node2D {
AnchorMode anchor_mode = ANCHOR_MODE_DRAG_CENTER;
bool ignore_rotation = true;
bool enabled = true;
#ifndef DISABLE_DEPRECATED
real_t position_smoothing_speed = 5.0;
#endif
Vector2 position_smoothing_velocity = Vector2(5.0, 5.0);
bool position_smoothing_enabled = false;

real_t camera_angle = 0.0;
Expand Down Expand Up @@ -156,8 +159,12 @@ class Camera2D : public Node2D {
void set_position_smoothing_enabled(bool p_enabled);
bool is_position_smoothing_enabled() const;

#ifndef DISABLE_DEPRECATED
void set_position_smoothing_speed(real_t p_speed);
real_t get_position_smoothing_speed() const;
#endif
void set_position_smoothing_velocity(Vector2 p_speed);
Vector2 get_position_smoothing_velocity() const;

void set_rotation_smoothing_speed(real_t p_speed);
real_t get_rotation_smoothing_speed() const;
Expand Down
7 changes: 4 additions & 3 deletions tests/scene/test_camera_2d.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,12 @@ TEST_CASE("[SceneTree][Camera2D] Getters and setters") {
}

SUBCASE("Position") {
constexpr float smoothing_speed = 20.0f;
constexpr float smoothing_speed_horizontal = 20.0f;
constexpr float smoothing_speed_vertical = 20.0f;
test_camera->set_position_smoothing_enabled(true);
CHECK(test_camera->is_position_smoothing_enabled());
test_camera->set_position_smoothing_speed(smoothing_speed);
CHECK(test_camera->get_position_smoothing_speed() == smoothing_speed);
test_camera->set_position_smoothing_velocity(Vector2(smoothing_speed_horizontal, smoothing_speed_vertical));
CHECK(test_camera->get_position_smoothing_velocity() == Vector2(smoothing_speed_horizontal, smoothing_speed_vertical));
}

memdelete(test_camera);
Expand Down
Loading