summaryrefslogtreecommitdiffstats
path: root/scene/main/node.h
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main/node.h')
-rw-r--r--scene/main/node.h74
1 files changed, 52 insertions, 22 deletions
diff --git a/scene/main/node.h b/scene/main/node.h
index 57a7278e73..f49eeec9cd 100644
--- a/scene/main/node.h
+++ b/scene/main/node.h
@@ -66,7 +66,9 @@ protected:
};
public:
- enum ProcessMode {
+ // N.B. Any enum stored as a bitfield should be specified as UNSIGNED to work around
+ // some compilers trying to store it as signed, and requiring 1 more bit than necessary.
+ enum ProcessMode : unsigned int {
PROCESS_MODE_INHERIT, // same as parent node
PROCESS_MODE_PAUSABLE, // process only if not paused
PROCESS_MODE_WHEN_PAUSED, // process only if paused
@@ -86,6 +88,12 @@ public:
FLAG_PROCESS_THREAD_MESSAGES_ALL = 3,
};
+ enum PhysicsInterpolationMode : unsigned int {
+ PHYSICS_INTERPOLATION_MODE_INHERIT,
+ PHYSICS_INTERPOLATION_MODE_ON,
+ PHYSICS_INTERPOLATION_MODE_OFF,
+ };
+
enum DuplicateFlags {
DUPLICATE_SIGNALS = 1,
DUPLICATE_GROUPS = 2,
@@ -170,9 +178,7 @@ private:
int blocked = 0; // Safeguard that throws an error when attempting to modify the tree in a harmful way while being traversed.
StringName name;
SceneTree *tree = nullptr;
- bool inside_tree = false;
- bool ready_notified = false; // This is a small hack, so if a node is added during _ready() to the tree, it correctly gets the _ready() notification.
- bool ready_first = true;
+
#ifdef TOOLS_ENABLED
NodePath import_path; // Path used when imported, used by scene editors to keep tracking.
#endif
@@ -184,7 +190,6 @@ private:
List<Node *>::Element *OW = nullptr; // Owned element.
List<Node *> owned;
- ProcessMode process_mode = PROCESS_MODE_INHERIT;
Node *process_owner = nullptr;
ProcessThreadGroup process_thread_group = PROCESS_THREAD_GROUP_INHERIT;
Node *process_thread_group_owner = nullptr;
@@ -196,26 +201,39 @@ private:
Variant rpc_config;
// Variables used to properly sort the node when processing, ignored otherwise.
- // TODO: Should move all the stuff below to bits.
- bool physics_process = false;
- bool process = false;
int process_priority = 0;
int physics_process_priority = 0;
- bool physics_process_internal = false;
- bool process_internal = false;
+ // Keep bitpacked values together to get better packing.
+ ProcessMode process_mode : 3;
+ PhysicsInterpolationMode physics_interpolation_mode : 2;
+
+ bool physics_process : 1;
+ bool process : 1;
+
+ bool physics_process_internal : 1;
+ bool process_internal : 1;
+
+ bool input : 1;
+ bool shortcut_input : 1;
+ bool unhandled_input : 1;
+ bool unhandled_key_input : 1;
- bool input = false;
- bool shortcut_input = false;
- bool unhandled_input = false;
- bool unhandled_key_input = false;
+ // Physics interpolation can be turned on and off on a per node basis.
+ // This only takes effect when the SceneTree (or project setting) physics interpolation
+ // is switched on.
+ bool physics_interpolated : 1;
- bool parent_owned = false;
- bool in_constructor = true;
- bool use_placeholder = false;
+ bool parent_owned : 1;
+ bool in_constructor : 1;
+ bool use_placeholder : 1;
- bool display_folded = false;
- bool editable_instance = false;
+ bool display_folded : 1;
+ bool editable_instance : 1;
+
+ bool inside_tree : 1;
+ bool ready_notified : 1;
+ bool ready_first : 1;
AutoTranslateMode auto_translate_mode = AUTO_TRANSLATE_MODE_INHERIT;
mutable bool is_auto_translating = true;
@@ -243,10 +261,12 @@ private:
void _propagate_ready();
void _propagate_exit_tree();
void _propagate_after_exit_tree();
+ void _propagate_physics_interpolated(bool p_interpolated);
void _propagate_process_owner(Node *p_owner, int p_pause_notification, int p_enabled_notification);
void _propagate_groups_dirty();
Array _get_node_and_resource(const NodePath &p_path);
+ void _duplicate_properties_node(const Node *p_root, const Node *p_original, Node *p_copy) const;
void _duplicate_signals(const Node *p_original, Node *p_copy) const;
Node *_duplicate(int p_flags, HashMap<const Node *, Node *> *r_duplimap = nullptr) const;
@@ -295,6 +315,8 @@ protected:
void _notification(int p_notification);
+ virtual void _physics_interpolated_changed();
+
virtual void add_child_notify(Node *p_child);
virtual void remove_child_notify(Node *p_child);
virtual void move_child_notify(Node *p_child);
@@ -339,7 +361,7 @@ protected:
public:
enum {
- // you can make your own, but don't use the same numbers as other notifications in other nodes
+ // You can make your own, but don't use the same numbers as other notifications in other nodes.
NOTIFICATION_ENTER_TREE = 10,
NOTIFICATION_EXIT_TREE = 11,
NOTIFICATION_MOVED_IN_PARENT = 12,
@@ -360,8 +382,8 @@ public:
NOTIFICATION_POST_ENTER_TREE = 27,
NOTIFICATION_DISABLED = 28,
NOTIFICATION_ENABLED = 29,
- //keep these linked to node
-
+ NOTIFICATION_RESET_PHYSICS_INTERPOLATION = 2001, // A GodotSpace Odyssey.
+ // Keep these linked to Node.
NOTIFICATION_WM_MOUSE_ENTER = 1002,
NOTIFICATION_WM_MOUSE_EXIT = 1003,
NOTIFICATION_WM_WINDOW_FOCUS_IN = 1004,
@@ -613,6 +635,13 @@ public:
ProcessMode get_process_mode() const;
bool can_process() const;
bool can_process_notification(int p_what) const;
+
+ void set_physics_interpolation_mode(PhysicsInterpolationMode p_mode);
+ PhysicsInterpolationMode get_physics_interpolation_mode() const { return data.physics_interpolation_mode; }
+ _FORCE_INLINE_ bool is_physics_interpolated() const { return data.physics_interpolated; }
+ _FORCE_INLINE_ bool is_physics_interpolated_and_enabled() const { return is_inside_tree() && get_tree()->is_physics_interpolation_enabled() && is_physics_interpolated(); }
+ void reset_physics_interpolation();
+
bool is_enabled() const;
bool is_ready() const;
@@ -742,6 +771,7 @@ VARIANT_ENUM_CAST(Node::ProcessMode);
VARIANT_ENUM_CAST(Node::ProcessThreadGroup);
VARIANT_BITFIELD_CAST(Node::ProcessThreadMessages);
VARIANT_ENUM_CAST(Node::InternalMode);
+VARIANT_ENUM_CAST(Node::PhysicsInterpolationMode);
VARIANT_ENUM_CAST(Node::AutoTranslateMode);
typedef HashSet<Node *, Node::Comparator> NodeSet;