summaryrefslogtreecommitdiffstats
path: root/scene/main/scene_tree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main/scene_tree.cpp')
-rw-r--r--scene/main/scene_tree.cpp51
1 files changed, 32 insertions, 19 deletions
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index cb16f425b5..ced6d9aaa6 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -55,7 +55,6 @@
#include "scene/resources/mesh.h"
#include "scene/resources/packed_scene.h"
#include "scene/resources/world_2d.h"
-#include "scene/scene_string_names.h"
#include "servers/display_server.h"
#include "servers/navigation_server_3d.h"
#include "servers/physics_server_2d.h"
@@ -120,7 +119,6 @@ void SceneTreeTimer::release_connections() {
SceneTreeTimer::SceneTreeTimer() {}
void SceneTree::tree_changed() {
- tree_version++;
emit_signal(tree_changed_name);
}
@@ -153,7 +151,6 @@ SceneTree::Group *SceneTree::add_to_group(const StringName &p_group, Node *p_nod
ERR_FAIL_COND_V_MSG(E->value.nodes.has(p_node), &E->value, "Already in group: " + p_group + ".");
E->value.nodes.push_back(p_node);
- //E->value.last_tree_version=0;
E->value.changed = true;
return &E->value;
}
@@ -451,9 +448,31 @@ void SceneTree::initialize() {
root->_set_tree(this);
}
-bool SceneTree::physics_process(double p_time) {
- root_lock++;
+void SceneTree::set_physics_interpolation_enabled(bool p_enabled) {
+ // We never want interpolation in the editor.
+ if (Engine::get_singleton()->is_editor_hint()) {
+ p_enabled = false;
+ }
+
+ if (p_enabled == _physics_interpolation_enabled) {
+ return;
+ }
+ _physics_interpolation_enabled = p_enabled;
+ RenderingServer::get_singleton()->set_physics_interpolation_enabled(p_enabled);
+}
+
+bool SceneTree::is_physics_interpolation_enabled() const {
+ return _physics_interpolation_enabled;
+}
+
+void SceneTree::iteration_prepare() {
+ if (_physics_interpolation_enabled) {
+ RenderingServer::get_singleton()->tick();
+ }
+}
+
+bool SceneTree::physics_process(double p_time) {
current_frame++;
flush_transform_notifications();
@@ -477,7 +496,6 @@ bool SceneTree::physics_process(double p_time) {
process_tweens(p_time, true);
flush_transform_notifications();
- root_lock--;
_flush_delete_queue();
_call_idle_callbacks();
@@ -486,8 +504,6 @@ bool SceneTree::physics_process(double p_time) {
}
bool SceneTree::process(double p_time) {
- root_lock++;
-
if (MainLoop::process(p_time)) {
_quit = true;
}
@@ -513,8 +529,6 @@ bool SceneTree::process(double p_time) {
MessageQueue::get_singleton()->flush(); //small little hack
flush_transform_notifications(); //transforms after world update, to avoid unnecessary enter/exit notifications
- root_lock--;
-
_flush_delete_queue();
if (unlikely(pending_new_scene)) {
@@ -714,13 +728,6 @@ void SceneTree::set_quit_on_go_back(bool p_enable) {
quit_on_go_back = p_enable;
}
-#ifdef TOOLS_ENABLED
-
-bool SceneTree::is_node_being_edited(const Node *p_node) const {
- return Engine::get_singleton()->is_editor_hint() && edited_scene_root && (edited_scene_root->is_ancestor_of(p_node) || edited_scene_root == p_node);
-}
-#endif
-
#ifdef DEBUG_ENABLED
void SceneTree::set_debug_collisions_hint(bool p_enabled) {
debug_collisions_hint = p_enabled;
@@ -1606,6 +1613,9 @@ void SceneTree::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_frame"), &SceneTree::get_frame);
ClassDB::bind_method(D_METHOD("quit", "exit_code"), &SceneTree::quit, DEFVAL(EXIT_SUCCESS));
+ ClassDB::bind_method(D_METHOD("set_physics_interpolation_enabled", "enabled"), &SceneTree::set_physics_interpolation_enabled);
+ ClassDB::bind_method(D_METHOD("is_physics_interpolation_enabled"), &SceneTree::is_physics_interpolation_enabled);
+
ClassDB::bind_method(D_METHOD("queue_delete", "obj"), &SceneTree::queue_delete);
MethodInfo mi;
@@ -1657,6 +1667,7 @@ void SceneTree::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "current_scene", PROPERTY_HINT_RESOURCE_TYPE, "Node", PROPERTY_USAGE_NONE), "set_current_scene", "get_current_scene");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "root", PROPERTY_HINT_RESOURCE_TYPE, "Node", PROPERTY_USAGE_NONE), "", "get_root");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "multiplayer_poll"), "set_multiplayer_poll_enabled", "is_multiplayer_poll_enabled");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "physics_interpolation"), "set_physics_interpolation_enabled", "is_physics_interpolation_enabled");
ADD_SIGNAL(MethodInfo("tree_changed"));
ADD_SIGNAL(MethodInfo("tree_process_mode_changed")); //editor only signal, but due to API hash it can't be removed in run-time
@@ -1733,7 +1744,7 @@ SceneTree::SceneTree() {
root = memnew(Window);
root->set_min_size(Size2i(64, 64)); // Define a very small minimum window size to prevent bugs such as GH-37242.
root->set_process_mode(Node::PROCESS_MODE_PAUSABLE);
- root->set_auto_translate_mode(Node::AUTO_TRANSLATE_MODE_ALWAYS);
+ root->set_auto_translate_mode(GLOBAL_GET("internationalization/rendering/root_node_auto_translate") ? Node::AUTO_TRANSLATE_MODE_ALWAYS : Node::AUTO_TRANSLATE_MODE_DISABLED);
root->set_name("root");
root->set_title(GLOBAL_GET("application/config/name"));
@@ -1748,6 +1759,8 @@ SceneTree::SceneTree() {
root->set_as_audio_listener_3d(true);
#endif // _3D_DISABLED
+ set_physics_interpolation_enabled(GLOBAL_DEF("physics/common/physics_interpolation", false));
+
// Initialize network state.
set_multiplayer(MultiplayerAPI::create_default_interface());
@@ -1862,7 +1875,7 @@ SceneTree::SceneTree() {
root->connect("close_requested", callable_mp(this, &SceneTree::_main_window_close));
root->connect("go_back_requested", callable_mp(this, &SceneTree::_main_window_go_back));
- root->connect("focus_entered", callable_mp(this, &SceneTree::_main_window_focus_in));
+ root->connect(SceneStringName(focus_entered), callable_mp(this, &SceneTree::_main_window_focus_in));
#ifdef TOOLS_ENABLED
edited_scene_root = nullptr;