diff options
author | reduz <reduzio@gmail.com> | 2021-06-16 15:43:02 -0300 |
---|---|---|
committer | reduz <reduzio@gmail.com> | 2021-06-16 18:50:39 -0300 |
commit | 6e98c4cd502949fc3659c882ac671a69457251b4 (patch) | |
tree | 5191d90e436da24e7eb69ca14694740cba1b70e2 /scene/3d/visibility_notifier_3d.h | |
parent | 341cb8da311698d685b390524d0f20795f1774d7 (diff) |
Refactor VisibilityNotifier3D
* This is the 3D counterpart to #49632
* Implemented a bit different as 3D works using instancing
After merged, both 2D and 3D classes will most likely be renamed in a separate PR to DisplayNotifier2D/3D.
Diffstat (limited to 'scene/3d/visibility_notifier_3d.h')
-rw-r--r-- | scene/3d/visibility_notifier_3d.h | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/scene/3d/visibility_notifier_3d.h b/scene/3d/visibility_notifier_3d.h index 9f7705067f..878c97e35e 100644 --- a/scene/3d/visibility_notifier_3d.h +++ b/scene/3d/visibility_notifier_3d.h @@ -31,34 +31,34 @@ #ifndef VISIBILITY_NOTIFIER_H #define VISIBILITY_NOTIFIER_H -#include "scene/3d/node_3d.h" +#include "scene/3d/visual_instance_3d.h" class World3D; class Camera3D; -class VisibilityNotifier3D : public Node3D { - GDCLASS(VisibilityNotifier3D, Node3D); - - Ref<World3D> world; - Set<Camera3D *> cameras; +class VisibilityNotifier3D : public VisualInstance3D { + GDCLASS(VisibilityNotifier3D, VisualInstance3D); AABB aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); +private: + bool on_screen = false; + void _visibility_enter(); + void _visibility_exit(); + protected: virtual void _screen_enter() {} virtual void _screen_exit() {} void _notification(int p_what); static void _bind_methods(); - friend struct SpatialIndexer; - - void _enter_camera(Camera3D *p_camera); - void _exit_camera(Camera3D *p_camera); public: void set_aabb(const AABB &p_aabb); - AABB get_aabb() const; + virtual AABB get_aabb() const override; bool is_on_screen() const; + virtual Vector<Face3> get_faces(uint32_t p_usage_flags) const override; + VisibilityNotifier3D(); }; @@ -66,36 +66,35 @@ class VisibilityEnabler3D : public VisibilityNotifier3D { GDCLASS(VisibilityEnabler3D, VisibilityNotifier3D); public: - enum Enabler { - ENABLER_PAUSE_ANIMATIONS, - ENABLER_FREEZE_BODIES, - ENABLER_MAX + enum EnableMode { + ENABLE_MODE_INHERIT, + ENABLE_MODE_ALWAYS, + ENABLE_MODE_WHEN_PAUSED, }; protected: + ObjectID node_id; virtual void _screen_enter() override; virtual void _screen_exit() override; - bool visible = false; - - void _find_nodes(Node *p_node); - - Map<Node *, Variant> nodes; - void _node_removed(Node *p_node); - bool enabler[ENABLER_MAX]; - - void _change_node_state(Node *p_node, bool p_enabled); + EnableMode enable_mode = ENABLE_MODE_INHERIT; + NodePath enable_node_path = NodePath(".."); void _notification(int p_what); static void _bind_methods(); + void _update_enable_mode(bool p_enable); + public: - void set_enabler(Enabler p_enabler, bool p_enable); - bool is_enabler_enabled(Enabler p_enabler) const; + void set_enable_mode(EnableMode p_mode); + EnableMode get_enable_mode(); + + void set_enable_node_path(NodePath p_path); + NodePath get_enable_node_path(); VisibilityEnabler3D(); }; -VARIANT_ENUM_CAST(VisibilityEnabler3D::Enabler); +VARIANT_ENUM_CAST(VisibilityEnabler3D::EnableMode); #endif // VISIBILITY_NOTIFIER_H |