diff --git a/doc/classes/VisibleOnScreenNotifier2D.xml b/doc/classes/VisibleOnScreenNotifier2D.xml
index 418abb6d175..01ab440d437 100644
--- a/doc/classes/VisibleOnScreenNotifier2D.xml
+++ b/doc/classes/VisibleOnScreenNotifier2D.xml
@@ -24,6 +24,9 @@
The VisibleOnScreenNotifier2D's bounding rectangle.
+
+ If [code]true[/code], shows the rectangle area of [member rect] in the editor with a translucent magenta fill. Unlike changing the visibility of the VisibleOnScreenNotifier2D, this does not affect the screen culling detection.
+
diff --git a/scene/2d/visible_on_screen_notifier_2d.cpp b/scene/2d/visible_on_screen_notifier_2d.cpp
index 7bf6371ee9a..8af3514b1a2 100644
--- a/scene/2d/visible_on_screen_notifier_2d.cpp
+++ b/scene/2d/visible_on_screen_notifier_2d.cpp
@@ -31,12 +31,28 @@
#include "visible_on_screen_notifier_2d.h"
#ifdef DEBUG_ENABLED
+Dictionary VisibleOnScreenNotifier2D::_edit_get_state() const {
+ Dictionary state = Node2D::_edit_get_state();
+ state["rect"] = rect;
+ return state;
+}
+
+void VisibleOnScreenNotifier2D::_edit_set_state(const Dictionary &p_state) {
+ ERR_FAIL_COND(p_state.is_empty() || !p_state.has("rect"));
+ set_rect(p_state["rect"]);
+ Node2D::_edit_set_state(p_state);
+}
+
+void VisibleOnScreenNotifier2D::_edit_set_rect(const Rect2 &p_edit_rect) {
+ set_rect(p_edit_rect);
+}
+
Rect2 VisibleOnScreenNotifier2D::_edit_get_rect() const {
return rect;
}
bool VisibleOnScreenNotifier2D::_edit_use_rect() const {
- return true;
+ return show_rect;
}
#endif // DEBUG_ENABLED
@@ -71,6 +87,18 @@ Rect2 VisibleOnScreenNotifier2D::get_rect() const {
return rect;
}
+void VisibleOnScreenNotifier2D::set_show_rect(bool p_show_rect) {
+ if (show_rect == p_show_rect) {
+ return;
+ }
+ show_rect = p_show_rect;
+ queue_redraw();
+}
+
+bool VisibleOnScreenNotifier2D::is_showing_rect() const {
+ return show_rect;
+}
+
void VisibleOnScreenNotifier2D::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE: {
@@ -79,7 +107,7 @@ void VisibleOnScreenNotifier2D::_notification(int p_what) {
} break;
case NOTIFICATION_DRAW: {
- if (Engine::get_singleton()->is_editor_hint()) {
+ if (show_rect && Engine::get_singleton()->is_editor_hint()) {
draw_rect(rect, Color(1, 0.5, 1, 0.2));
}
} break;
@@ -98,9 +126,12 @@ bool VisibleOnScreenNotifier2D::is_on_screen() const {
void VisibleOnScreenNotifier2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_rect", "rect"), &VisibleOnScreenNotifier2D::set_rect);
ClassDB::bind_method(D_METHOD("get_rect"), &VisibleOnScreenNotifier2D::get_rect);
+ ClassDB::bind_method(D_METHOD("set_show_rect", "show_rect"), &VisibleOnScreenNotifier2D::set_show_rect);
+ ClassDB::bind_method(D_METHOD("is_showing_rect"), &VisibleOnScreenNotifier2D::is_showing_rect);
ClassDB::bind_method(D_METHOD("is_on_screen"), &VisibleOnScreenNotifier2D::is_on_screen);
ADD_PROPERTY(PropertyInfo(Variant::RECT2, "rect", PROPERTY_HINT_NONE, "suffix:px"), "set_rect", "get_rect");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_rect"), "set_show_rect", "is_showing_rect");
ADD_SIGNAL(MethodInfo("screen_entered"));
ADD_SIGNAL(MethodInfo("screen_exited"));
diff --git a/scene/2d/visible_on_screen_notifier_2d.h b/scene/2d/visible_on_screen_notifier_2d.h
index 84545a2d6ad..b3ae294d1d2 100644
--- a/scene/2d/visible_on_screen_notifier_2d.h
+++ b/scene/2d/visible_on_screen_notifier_2d.h
@@ -40,6 +40,7 @@ class VisibleOnScreenNotifier2D : public Node2D {
HashSet viewports;
Rect2 rect;
+ bool show_rect = true;
private:
bool on_screen = false;
@@ -55,13 +56,23 @@ protected:
public:
#ifdef DEBUG_ENABLED
+ virtual Dictionary _edit_get_state() const override;
+ virtual void _edit_set_state(const Dictionary &p_state) override;
+
+ virtual Vector2 _edit_get_minimum_size() const override { return Vector2(); }
+
+ virtual void _edit_set_rect(const Rect2 &p_edit_rect) override;
virtual Rect2 _edit_get_rect() const override;
+
virtual bool _edit_use_rect() const override;
#endif // DEBUG_ENABLED
void set_rect(const Rect2 &p_rect);
Rect2 get_rect() const;
+ void set_show_rect(bool p_show_rect);
+ bool is_showing_rect() const;
+
bool is_on_screen() const;
VisibleOnScreenNotifier2D();