summaryrefslogtreecommitdiffstats
path: root/scene/main/canvas_item.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main/canvas_item.cpp')
-rw-r--r--scene/main/canvas_item.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp
index 598f6aa4c6..ae01e8b009 100644
--- a/scene/main/canvas_item.cpp
+++ b/scene/main/canvas_item.cpp
@@ -148,7 +148,7 @@ void CanvasItem::_redraw_callback() {
}
void CanvasItem::_invalidate_global_transform() {
- global_invalid.set();
+ _set_global_invalid(true);
}
Transform2D CanvasItem::get_global_transform_with_canvas() const {
@@ -171,7 +171,7 @@ Transform2D CanvasItem::get_screen_transform() const {
Transform2D CanvasItem::get_global_transform() const {
ERR_READ_THREAD_GUARD_V(Transform2D());
- if (global_invalid.is_set()) {
+ if (_is_global_invalid()) {
// This code can enter multiple times from threads if dirty, this is expected.
const CanvasItem *pi = get_parent_item();
Transform2D new_global;
@@ -182,12 +182,24 @@ Transform2D CanvasItem::get_global_transform() const {
}
global_transform = new_global;
- global_invalid.clear();
+ _set_global_invalid(false);
}
return global_transform;
}
+void CanvasItem::_set_global_invalid(bool p_invalid) const {
+ if (is_group_processing()) {
+ if (p_invalid) {
+ global_invalid.mt.set();
+ } else {
+ global_invalid.mt.clear();
+ }
+ } else {
+ global_invalid.st = p_invalid;
+ }
+}
+
void CanvasItem::_top_level_raise_self() {
if (!is_inside_tree()) {
return;
@@ -308,7 +320,7 @@ void CanvasItem::_notification(int p_what) {
}
}
- global_invalid.set();
+ _set_global_invalid(true);
_enter_canvas();
RenderingServer::get_singleton()->canvas_item_set_visible(canvas_item, is_visible_in_tree()); // The visibility of the parent may change.
@@ -341,7 +353,7 @@ void CanvasItem::_notification(int p_what) {
window->disconnect(SceneStringNames::get_singleton()->visibility_changed, callable_mp(this, &CanvasItem::_window_visibility_changed));
window = nullptr;
}
- global_invalid.set();
+ _set_global_invalid(true);
parent_visible_in_tree = false;
if (get_viewport()) {
@@ -869,11 +881,11 @@ void CanvasItem::_notify_transform(CanvasItem *p_node) {
* notification anyway).
*/
- if (/*p_node->xform_change.in_list() &&*/ p_node->global_invalid.is_set()) {
+ if (/*p_node->xform_change.in_list() &&*/ p_node->_is_global_invalid()) {
return; //nothing to do
}
- p_node->global_invalid.set();
+ p_node->_set_global_invalid(true);
if (p_node->notify_transform && !p_node->xform_change.in_list()) {
if (!p_node->block_transform_notify) {