summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <remi@verschelde.fr>2021-08-13 12:44:15 +0200
committerGitHub <noreply@github.com>2021-08-13 12:44:15 +0200
commit3a3be769b8d7ccdfece5054e306c2467ca1c4b45 (patch)
tree1208382c07ac92e3d6b4cdfb886c9fc3871e065b /main
parent52d07e7ef03c031bc96b7d4fc05b22c9906f857f (diff)
parente745088f1f953af867717574ddf8239be459ee90 (diff)
Merge pull request #51597 from RandomShaper/input_buffering
Diffstat (limited to 'main')
-rw-r--r--main/main.cpp22
-rw-r--r--main/main.h1
2 files changed, 20 insertions, 3 deletions
diff --git a/main/main.cpp b/main/main.cpp
index 7351dafa22..6764332f16 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -1735,6 +1735,8 @@ Error Main::setup2(Thread::ID p_main_tid_override) {
Input *id = Input::get_singleton();
if (id) {
+ agile_input_event_flushing = GLOBAL_DEF("input_devices/buffering/agile_event_flushing", false);
+
if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) &&
!(editor || project_manager)) {
bool found_touchscreen = false;
@@ -2442,6 +2444,7 @@ uint32_t Main::frames = 0;
uint32_t Main::frame = 0;
bool Main::force_redraw_requested = false;
int Main::iterating = 0;
+bool Main::agile_input_event_flushing = false;
bool Main::is_iterating() {
return iterating > 0;
@@ -2491,9 +2494,13 @@ bool Main::iteration() {
bool exit = false;
- Engine::get_singleton()->_in_physics = true;
-
for (int iters = 0; iters < advance.physics_steps; ++iters) {
+ if (Input::get_singleton()->is_using_input_buffering() && agile_input_event_flushing) {
+ Input::get_singleton()->flush_buffered_events();
+ }
+
+ Engine::get_singleton()->_in_physics = true;
+
uint64_t physics_begin = OS::get_singleton()->get_ticks_usec();
PhysicsServer3D::get_singleton()->sync();
@@ -2522,9 +2529,13 @@ 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;
}
- Engine::get_singleton()->_in_physics = false;
+ if (Input::get_singleton()->is_using_input_buffering() && agile_input_event_flushing) {
+ Input::get_singleton()->flush_buffered_events();
+ }
uint64_t process_begin = OS::get_singleton()->get_ticks_usec();
@@ -2587,6 +2598,11 @@ bool Main::iteration() {
iterating--;
+ // Needed for OSs using input buffering regardless accumulation (like Android)
+ if (Input::get_singleton()->is_using_input_buffering() && !agile_input_event_flushing) {
+ Input::get_singleton()->flush_buffered_events();
+ }
+
if (fixed_fps != -1) {
return exit;
}
diff --git a/main/main.h b/main/main.h
index 84077137ba..4911ff42b4 100644
--- a/main/main.h
+++ b/main/main.h
@@ -42,6 +42,7 @@ class Main {
static uint32_t frame;
static bool force_redraw_requested;
static int iterating;
+ static bool agile_input_event_flushing;
public:
static bool is_project_manager();