Fix invalid global position when read outside tree

This commit is contained in:
kobewi 2023-03-30 22:37:00 +02:00
parent 9e6b680cfb
commit 727a4ed79a
2 changed files with 8 additions and 0 deletions

View file

@ -142,6 +142,10 @@ void CanvasItem::_redraw_callback() {
pending_update = false; // don't change to false until finished drawing (avoid recursive update) pending_update = false; // don't change to false until finished drawing (avoid recursive update)
} }
void CanvasItem::_invalidate_global_transform() {
global_invalid = true;
}
Transform2D CanvasItem::get_global_transform_with_canvas() const { Transform2D CanvasItem::get_global_transform_with_canvas() const {
if (canvas_layer) { if (canvas_layer) {
return canvas_layer->get_final_transform() * get_global_transform(); return canvas_layer->get_final_transform() * get_global_transform();
@ -290,6 +294,7 @@ void CanvasItem::_notification(int p_what) {
} }
} }
global_invalid = true;
_enter_canvas(); _enter_canvas();
RenderingServer::get_singleton()->canvas_item_set_visible(canvas_item, is_visible_in_tree()); // The visibility of the parent may change. RenderingServer::get_singleton()->canvas_item_set_visible(canvas_item, is_visible_in_tree()); // The visibility of the parent may change.
@ -403,6 +408,7 @@ void CanvasItem::set_as_top_level(bool p_top_level) {
if (!is_inside_tree()) { if (!is_inside_tree()) {
top_level = p_top_level; top_level = p_top_level;
propagate_call(SNAME("_invalidate_global_transform"));
return; return;
} }
@ -950,6 +956,7 @@ void CanvasItem::_validate_property(PropertyInfo &p_property) const {
void CanvasItem::_bind_methods() { void CanvasItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("_top_level_raise_self"), &CanvasItem::_top_level_raise_self); ClassDB::bind_method(D_METHOD("_top_level_raise_self"), &CanvasItem::_top_level_raise_self);
ClassDB::bind_method(D_METHOD("_invalidate_global_transform"), &CanvasItem::_invalidate_global_transform);
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
ClassDB::bind_method(D_METHOD("_edit_set_state", "state"), &CanvasItem::_edit_set_state); ClassDB::bind_method(D_METHOD("_edit_set_state", "state"), &CanvasItem::_edit_set_state);

View file

@ -129,6 +129,7 @@ private:
virtual void _top_level_changed_on_parent(); virtual void _top_level_changed_on_parent();
void _redraw_callback(); void _redraw_callback();
void _invalidate_global_transform();
void _enter_canvas(); void _enter_canvas();
void _exit_canvas(); void _exit_canvas();