From b6118787013459336fd99302f82e2d1db241abb3 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Mon, 4 Apr 2022 15:18:44 +0100 Subject: [PATCH] Physics interpolation - Fix multithreaded rendering Fixes physics interpolation ticking and pre-draw not working in multithreaded rendering mode. --- scene/main/scene_tree.cpp | 4 ++-- servers/visual/visual_server_raster.cpp | 8 ------- servers/visual/visual_server_raster.h | 12 +++++++--- servers/visual/visual_server_scene.cpp | 4 ++-- servers/visual/visual_server_scene.h | 4 ++-- servers/visual/visual_server_wrap_mt.cpp | 30 ------------------------ servers/visual/visual_server_wrap_mt.h | 4 ++-- 7 files changed, 17 insertions(+), 49 deletions(-) diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 1f38926c21fc..6f6b05150c19 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -535,7 +535,7 @@ bool SceneTree::iteration(float p_time) { current_frame++; - if (root->get_world().is_valid()) { + if (_physics_interpolation_enabled && root->get_world().is_valid()) { RID scenario = root->get_world()->get_scenario(); if (scenario.is_valid()) { VisualServer::get_singleton()->scenario_tick(scenario); @@ -686,7 +686,7 @@ bool SceneTree::idle(float p_time) { #endif - if (root->get_world().is_valid()) { + if (_physics_interpolation_enabled && root->get_world().is_valid()) { RID scenario = root->get_world()->get_scenario(); if (scenario.is_valid()) { VisualServer::get_singleton()->scenario_pre_draw(scenario, true); diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index 1dc1263b9958..d0e7b76bb610 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -94,14 +94,6 @@ void VisualServerRaster::request_frame_drawn_callback(Object *p_where, const Str frame_drawn_callbacks.push_back(fdc); } -void VisualServerRaster::scenario_tick(RID p_scenario) { - VSG::scene->_scenario_tick(p_scenario); -} - -void VisualServerRaster::scenario_pre_draw(RID p_scenario, bool p_will_draw) { - VSG::scene->_scenario_pre_draw(p_scenario, p_will_draw); -} - void VisualServerRaster::draw(bool p_swap_buffers, double frame_step) { //needs to be done before changes is reset to 0, to not force the editor to redraw VS::get_singleton()->emit_signal("frame_pre_draw"); diff --git a/servers/visual/visual_server_raster.h b/servers/visual/visual_server_raster.h index 56a643c7f4bd..ae79c9882cc7 100644 --- a/servers/visual/visual_server_raster.h +++ b/servers/visual/visual_server_raster.h @@ -118,10 +118,14 @@ class VisualServerRaster : public VisualServer { #define BIND1(m_name, m_type1) \ void m_name(m_type1 arg1) { DISPLAY_CHANGED BINDBASE->m_name(arg1); } +#define BIND1N(m_name, m_type1) \ + void m_name(m_type1 arg1) { BINDBASE->m_name(arg1); } #define BIND2(m_name, m_type1, m_type2) \ void m_name(m_type1 arg1, m_type2 arg2) { DISPLAY_CHANGED BINDBASE->m_name(arg1, arg2); } #define BIND2C(m_name, m_type1, m_type2) \ void m_name(m_type1 arg1, m_type2 arg2) const { BINDBASE->m_name(arg1, arg2); } +#define BIND2N(m_name, m_type1, m_type2) \ + void m_name(m_type1 arg1, m_type2 arg2) { BINDBASE->m_name(arg1, arg2); } #define BIND3(m_name, m_type1, m_type2, m_type3) \ void m_name(m_type1 arg1, m_type2 arg2, m_type3 arg3) { DISPLAY_CHANGED BINDBASE->m_name(arg1, arg2, arg3); } #define BIND4(m_name, m_type1, m_type2, m_type3, m_type4) \ @@ -149,7 +153,6 @@ class VisualServerRaster : public VisualServer { #define BINDBASE VSG::storage /* TEXTURE API */ - BIND0R(RID, texture_create) BIND7(texture_allocate, RID, int, int, int, Image::Format, TextureType, uint32_t) BIND3(texture_set_data, RID, const Ref &, int) @@ -448,6 +451,11 @@ class VisualServerRaster : public VisualServer { //from now on, calls forwarded to this singleton #define BINDBASE VSG::scene + /* EVENT QUEUING */ + + BIND1N(scenario_tick, RID) + BIND2N(scenario_pre_draw, RID, bool) + /* CAMERA API */ BIND0R(RID, camera_create) @@ -764,8 +772,6 @@ class VisualServerRaster : public VisualServer { virtual bool has_changed(ChangedPriority p_priority = CHANGED_PRIORITY_ANY) const; virtual void init(); virtual void finish(); - virtual void scenario_tick(RID p_scenario); - virtual void scenario_pre_draw(RID p_scenario, bool p_will_draw); /* STATUS INFORMATION */ diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index 138fb2c164f6..bed07b0ae067 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -476,7 +476,7 @@ void VisualServerScene::scenario_set_physics_interpolation_enabled(RID p_scenari scenario->_interpolation_data.interpolation_enabled = p_enabled; } -void VisualServerScene::_scenario_tick(RID p_scenario) { +void VisualServerScene::scenario_tick(RID p_scenario) { Scenario *scenario = scenario_owner.get(p_scenario); ERR_FAIL_COND(!scenario); @@ -485,7 +485,7 @@ void VisualServerScene::_scenario_tick(RID p_scenario) { } } -void VisualServerScene::_scenario_pre_draw(RID p_scenario, bool p_will_draw) { +void VisualServerScene::scenario_pre_draw(RID p_scenario, bool p_will_draw) { Scenario *scenario = scenario_owner.get(p_scenario); ERR_FAIL_COND(!scenario); diff --git a/servers/visual/visual_server_scene.h b/servers/visual/visual_server_scene.h index f1a9040791f9..f9e0fbc1847e 100644 --- a/servers/visual/visual_server_scene.h +++ b/servers/visual/visual_server_scene.h @@ -306,8 +306,8 @@ class VisualServerScene { virtual void scenario_set_fallback_environment(RID p_scenario, RID p_environment); virtual void scenario_set_reflection_atlas_size(RID p_scenario, int p_size, int p_subdiv); virtual void scenario_set_physics_interpolation_enabled(RID p_scenario, bool p_enabled); - void _scenario_tick(RID p_scenario); - void _scenario_pre_draw(RID p_scenario, bool p_will_draw); + void scenario_tick(RID p_scenario); + void scenario_pre_draw(RID p_scenario, bool p_will_draw); /* INSTANCING API */ diff --git a/servers/visual/visual_server_wrap_mt.cpp b/servers/visual/visual_server_wrap_mt.cpp index 54102875e8f8..ec8bbc5e33c3 100644 --- a/servers/visual/visual_server_wrap_mt.cpp +++ b/servers/visual/visual_server_wrap_mt.cpp @@ -36,18 +36,6 @@ void VisualServerWrapMT::thread_exit() { exit.set(); } -void VisualServerWrapMT::thread_scenario_tick(RID p_scenario) { - if (!draw_pending.decrement()) { - visual_server->scenario_tick(p_scenario); - } -} - -void VisualServerWrapMT::thread_scenario_pre_draw(RID p_scenario, bool p_will_draw) { - if (!draw_pending.decrement()) { - visual_server->scenario_pre_draw(p_scenario, p_will_draw); - } -} - void VisualServerWrapMT::thread_draw(bool p_swap_buffers, double frame_step) { if (!draw_pending.decrement()) { visual_server->draw(p_swap_buffers, frame_step); @@ -94,24 +82,6 @@ void VisualServerWrapMT::sync() { } } -void VisualServerWrapMT::scenario_tick(RID p_scenario) { - if (create_thread) { - draw_pending.increment(); - command_queue.push(this, &VisualServerWrapMT::thread_scenario_tick, p_scenario); - } else { - visual_server->scenario_tick(p_scenario); - } -} - -void VisualServerWrapMT::scenario_pre_draw(RID p_scenario, bool p_will_draw) { - if (create_thread) { - draw_pending.increment(); - command_queue.push(this, &VisualServerWrapMT::thread_scenario_pre_draw, p_scenario, p_will_draw); - } else { - visual_server->scenario_pre_draw(p_scenario, p_will_draw); - } -} - void VisualServerWrapMT::draw(bool p_swap_buffers, double frame_step) { if (create_thread) { draw_pending.increment(); diff --git a/servers/visual/visual_server_wrap_mt.h b/servers/visual/visual_server_wrap_mt.h index e2c97cab3ba4..80e06afb5ee7 100644 --- a/servers/visual/visual_server_wrap_mt.h +++ b/servers/visual/visual_server_wrap_mt.h @@ -669,13 +669,13 @@ class VisualServerWrapMT : public VisualServer { /* EVENT QUEUING */ FUNC3(request_frame_drawn_callback, Object *, const StringName &, const Variant &) + FUNC1(scenario_tick, RID) + FUNC2(scenario_pre_draw, RID, bool) virtual void init(); virtual void finish(); virtual void draw(bool p_swap_buffers, double frame_step); virtual void sync(); - virtual void scenario_tick(RID p_scenario); - virtual void scenario_pre_draw(RID p_scenario, bool p_will_draw); FUNC1RC(bool, has_changed, ChangedPriority) /* RENDER INFO */