summaryrefslogtreecommitdiffstats
path: root/scene/main/viewport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main/viewport.cpp')
-rw-r--r--scene/main/viewport.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index feddb1e779..9f9a2eeb18 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -165,6 +165,31 @@ ViewportTexture::~ViewportTexture() {
}
}
+void Viewport::_process_dirty_canvas_parent_orders() {
+ for (const ObjectID &id : gui.canvas_parents_with_dirty_order) {
+ Object *obj = ObjectDB::get_instance(id);
+ if (!obj) {
+ continue; // May have been deleted.
+ }
+
+ Node *n = static_cast<Node *>(obj);
+ for (int i = 0; i < n->get_child_count(); i++) {
+ Node *c = n->get_child(i);
+ CanvasItem *ci = Object::cast_to<CanvasItem>(c);
+ if (ci) {
+ ci->update_draw_order();
+ continue;
+ }
+ CanvasLayer *cl = Object::cast_to<CanvasLayer>(c);
+ if (cl) {
+ cl->update_draw_order();
+ }
+ }
+ }
+
+ gui.canvas_parents_with_dirty_order.clear();
+}
+
void Viewport::_sub_window_update_order() {
if (gui.sub_windows.size() < 2) {
return;
@@ -929,6 +954,14 @@ Rect2 Viewport::get_visible_rect() const {
return r;
}
+void Viewport::canvas_parent_mark_dirty(Node *p_node) {
+ bool request_update = gui.canvas_parents_with_dirty_order.is_empty();
+ gui.canvas_parents_with_dirty_order.insert(p_node->get_instance_id());
+ if (request_update) {
+ MessageQueue::get_singleton()->push_callable(callable_mp(this, &Viewport::_process_dirty_canvas_parent_orders));
+ }
+}
+
void Viewport::_update_audio_listener_2d() {
if (AudioServer::get_singleton()) {
AudioServer::get_singleton()->notify_listener_changed();