Skip to content

Commit

Permalink
Do not defer PathFollow3D transform updates
Browse files Browse the repository at this point in the history
Co-authored-by: Yaohua Xiong <[email protected]>
  • Loading branch information
xiongyaohua authored and kleonc committed Sep 10, 2024
1 parent 444683b commit 51b8b74
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 60 deletions.
52 changes: 25 additions & 27 deletions scene/3d/path_3d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,24 +216,7 @@ void Path3D::_bind_methods() {
ADD_SIGNAL(MethodInfo("curve_changed"));
}

// Update transform, in deferred mode by default to avoid superfluity.
void PathFollow3D::update_transform(bool p_immediate) {
transform_dirty = true;

if (p_immediate) {
_update_transform();
} else {
callable_mp(this, &PathFollow3D::_update_transform).call_deferred();
}
}

// Update transform immediately .
void PathFollow3D::_update_transform() {
if (!transform_dirty) {
return;
}
transform_dirty = false;

void PathFollow3D::update_transform() {
if (!path) {
return;
}
Expand Down Expand Up @@ -286,9 +269,7 @@ void PathFollow3D::_notification(int p_what) {
Node *parent = get_parent();
if (parent) {
path = Object::cast_to<Path3D>(parent);
if (path) {
update_transform();
}
update_transform();
}
} break;

Expand Down Expand Up @@ -414,6 +395,9 @@ void PathFollow3D::_bind_methods() {

void PathFollow3D::set_progress(real_t p_progress) {
ERR_FAIL_COND(!isfinite(p_progress));
if (progress == p_progress) {
return;
}
progress = p_progress;

if (path) {
Expand All @@ -435,21 +419,23 @@ void PathFollow3D::set_progress(real_t p_progress) {
}

void PathFollow3D::set_h_offset(real_t p_h_offset) {
h_offset = p_h_offset;
if (path) {
update_transform();
if (h_offset == p_h_offset) {
return;
}
h_offset = p_h_offset;
update_transform();
}

real_t PathFollow3D::get_h_offset() const {
return h_offset;
}

void PathFollow3D::set_v_offset(real_t p_v_offset) {
v_offset = p_v_offset;
if (path) {
update_transform();
if (v_offset == p_v_offset) {
return;
}
v_offset = p_v_offset;
update_transform();
}

real_t PathFollow3D::get_v_offset() const {
Expand All @@ -476,6 +462,9 @@ real_t PathFollow3D::get_progress_ratio() const {
}

void PathFollow3D::set_rotation_mode(RotationMode p_rotation_mode) {
if (rotation_mode == p_rotation_mode) {
return;
}
rotation_mode = p_rotation_mode;

update_configuration_warnings();
Expand All @@ -487,6 +476,9 @@ PathFollow3D::RotationMode PathFollow3D::get_rotation_mode() const {
}

void PathFollow3D::set_use_model_front(bool p_use_model_front) {
if (use_model_front == p_use_model_front) {
return;
}
use_model_front = p_use_model_front;
update_transform();
}
Expand All @@ -496,6 +488,9 @@ bool PathFollow3D::is_using_model_front() const {
}

void PathFollow3D::set_loop(bool p_loop) {
if (loop == p_loop) {
return;
}
loop = p_loop;
update_transform();
}
Expand All @@ -505,6 +500,9 @@ bool PathFollow3D::has_loop() const {
}

void PathFollow3D::set_tilt_enabled(bool p_enabled) {
if (tilt_enabled == p_enabled) {
return;
}
tilt_enabled = p_enabled;
update_transform();
}
Expand Down
3 changes: 1 addition & 2 deletions scene/3d/path_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ class PathFollow3D : public Node3D {
void _validate_property(PropertyInfo &p_property) const;

void _notification(int p_what);
void _update_transform();

static void _bind_methods();

Expand Down Expand Up @@ -124,7 +123,7 @@ class PathFollow3D : public Node3D {

PackedStringArray get_configuration_warnings() const override;

void update_transform(bool p_immediate = false);
void update_transform();

static Transform3D correct_posture(Transform3D p_transform, PathFollow3D::RotationMode p_rotation_mode);

Expand Down
31 changes: 0 additions & 31 deletions tests/scene/test_path_follow_3d.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,39 +60,30 @@ TEST_CASE("[SceneTree][PathFollow3D] Sampling with progress ratio") {
SceneTree::get_singleton()->get_root()->add_child(path);

path_follow_3d->set_progress_ratio(0);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.125);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(50, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.25);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.375);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 50, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.5);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.625);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 50), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.75);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 100), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(0.875);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 50, 100), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress_ratio(1);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 0, 100), path_follow_3d->get_transform().get_origin()));

memdelete(path);
Expand All @@ -113,39 +104,30 @@ TEST_CASE("[SceneTree][PathFollow3D] Sampling with progress") {
SceneTree::get_singleton()->get_root()->add_child(path);

path_follow_3d->set_progress(0);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(50);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(50, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(100);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 0, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(150);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 50, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(200);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 0), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(250);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 50), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(300);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 100, 100), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(350);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 50, 100), path_follow_3d->get_transform().get_origin()));

path_follow_3d->set_progress(400);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 0, 100), path_follow_3d->get_transform().get_origin()));

memdelete(path);
Expand All @@ -163,13 +145,11 @@ TEST_CASE("[SceneTree][PathFollow3D] Removal of a point in curve") {
SceneTree::get_singleton()->get_root()->add_child(path);

path_follow_3d->set_progress_ratio(0.5);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(100, 0, 0), path_follow_3d->get_transform().get_origin()));

curve->remove_point(1);

path_follow_3d->set_progress_ratio(0.5);
path_follow_3d->update_transform(true);
CHECK_MESSAGE(
is_equal_approx(Vector3(50, 50, 0), path_follow_3d->get_transform().get_origin()),
"Path follow's position should be updated after removing a point from the curve");
Expand Down Expand Up @@ -270,47 +250,36 @@ TEST_CASE("[SceneTree][PathFollow3D] Calculate forward vector") {
path_follow_3d->set_rotation_mode(PathFollow3D::RotationMode::ROTATION_ORIENTED);

path_follow_3d->set_progress(-50);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-1, 0, 0), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(0);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-1, 0, 0), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(50);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-1, 0, 0), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(100);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-1, 0, 0), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(100 + dist_cube_100 / 2);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-0.577348, -0.577348, 0.577348), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(100 + dist_cube_100 - 0.01);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(-0.577348, -0.577348, 0.577348), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(250 + dist_cube_100);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0, 0, -1), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(400 + dist_cube_100 - 0.01);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0, 0, -1), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(400 + 1.5 * dist_cube_100);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0.577348, 0.577348, 0.577348), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(400 + 2 * dist_cube_100 - 0.01);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(0.577348, 0.577348, 0.577348), path_follow_3d->get_transform().get_basis().get_column(2)));

path_follow_3d->set_progress(500 + 2 * dist_cube_100);
path_follow_3d->update_transform(true);
CHECK(is_equal_approx(Vector3(1, 0, 0), path_follow_3d->get_transform().get_basis().get_column(2)));

memdelete(path);
Expand Down

0 comments on commit 51b8b74

Please sign in to comment.