From 40961d62e2ffd966a3a9e7f1c707cbc5f31228ac Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Sun, 9 Jun 2024 15:34:23 +0100 Subject: [PATCH] Fix physics tick counter The counter is now incremented at the start of a physics tick rather than the end. --- main/input_default.cpp | 5 +++-- main/main.cpp | 2 +- scene/2d/camera_2d.h | 2 +- scene/2d/navigation_agent_2d.h | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/main/input_default.cpp b/main/input_default.cpp index 215188a97be..5cf68caa816 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -506,13 +506,14 @@ void InputDefault::_parse_input_event_impl(const Ref &p_event, bool // If not echo and action pressed state has changed if (!p_event->is_echo() && is_action_pressed(E->key(), false) != p_event->is_action_pressed(E->key())) { + // As input may come in part way through a physics tick, the earliest we can react to it is the next physics tick. if (p_event->is_action_pressed(E->key())) { action.pressed = true; - action.pressed_physics_frame = Engine::get_singleton()->get_physics_frames(); + action.pressed_physics_frame = Engine::get_singleton()->get_physics_frames() + 1; action.pressed_idle_frame = Engine::get_singleton()->get_idle_frames(); } else { action.pressed = false; - action.released_physics_frame = Engine::get_singleton()->get_physics_frames(); + action.released_physics_frame = Engine::get_singleton()->get_physics_frames() + 1; action.released_idle_frame = Engine::get_singleton()->get_idle_frames(); } action.strength = 0.0f; diff --git a/main/main.cpp b/main/main.cpp index 9553e90bc53..db03f3efeef 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2364,6 +2364,7 @@ bool Main::iteration() { } Engine::get_singleton()->_in_physics = true; + Engine::get_singleton()->_physics_frames++; uint64_t physics_begin = OS::get_singleton()->get_ticks_usec(); @@ -2398,7 +2399,6 @@ bool Main::iteration() { physics_process_ticks = MAX(physics_process_ticks, OS::get_singleton()->get_ticks_usec() - physics_begin); // keep the largest one for reference physics_process_max = MAX(OS::get_singleton()->get_ticks_usec() - physics_begin, physics_process_max); - Engine::get_singleton()->_physics_frames++; Engine::get_singleton()->_in_physics = false; } diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index f8d8f5ecfdf..97190ebf266 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -98,7 +98,7 @@ protected: struct InterpolationData { Transform2D xform_curr; Transform2D xform_prev; - uint32_t last_update_physics_tick = 0; + uint32_t last_update_physics_tick = UINT32_MAX; } _interpolation_data; protected: diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 6b9fb5a509a..4dd96f3a465 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -70,7 +70,7 @@ class NavigationAgent2D : public Node { bool target_reached = false; bool navigation_finished = true; // No initialized on purpose - uint32_t update_frame_id = 0; + uint32_t update_frame_id = UINT32_MAX; protected: static void _bind_methods();