mirror of
https://github.com/godotengine/godot
synced 2024-09-16 02:27:37 +00:00
Merge pull request #59682 from Sauermann/fix-following-viewport-transform
Include the follow-viewport-transform into CanvasLayer transform calculations
This commit is contained in:
commit
f29f3db419
|
@ -404,7 +404,7 @@
|
||||||
<method name="get_canvas_transform" qualifiers="const">
|
<method name="get_canvas_transform" qualifiers="const">
|
||||||
<return type="Transform2D" />
|
<return type="Transform2D" />
|
||||||
<description>
|
<description>
|
||||||
Returns the transform matrix of this item's canvas.
|
Returns the transform from the coordinate system of the canvas, this item is in, to the [Viewport]s coordinate system.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_global_mouse_position" qualifiers="const">
|
<method name="get_global_mouse_position" qualifiers="const">
|
||||||
|
@ -422,7 +422,7 @@
|
||||||
<method name="get_global_transform_with_canvas" qualifiers="const">
|
<method name="get_global_transform_with_canvas" qualifiers="const">
|
||||||
<return type="Transform2D" />
|
<return type="Transform2D" />
|
||||||
<description>
|
<description>
|
||||||
Returns the global transform matrix of this item in relation to the canvas.
|
Returns the transform from the local coordinate system of this [CanvasItem] to the [Viewport]s coordinate system.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_local_mouse_position" qualifiers="const">
|
<method name="get_local_mouse_position" qualifiers="const">
|
||||||
|
@ -453,7 +453,7 @@
|
||||||
<method name="get_viewport_transform" qualifiers="const">
|
<method name="get_viewport_transform" qualifiers="const">
|
||||||
<return type="Transform2D" />
|
<return type="Transform2D" />
|
||||||
<description>
|
<description>
|
||||||
Returns this item's transform in relation to the viewport.
|
Returns the transform from the coordinate system of the canvas, this item is in, to the [Viewport]s embedders coordinate system.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="get_visibility_layer_bit" qualifiers="const">
|
<method name="get_visibility_layer_bit" qualifiers="const">
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
Returns the RID of the canvas used by this layer.
|
Returns the RID of the canvas used by this layer.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="get_final_transform" qualifiers="const">
|
||||||
|
<return type="Transform2D" />
|
||||||
|
<description>
|
||||||
|
Returns the transform from the [CanvasLayer]s coordinate system to the [Viewport]s coordinate system.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="hide">
|
<method name="hide">
|
||||||
<return type="void" />
|
<return type="void" />
|
||||||
<description>
|
<description>
|
||||||
|
|
|
@ -144,7 +144,7 @@ void CanvasItem::_redraw_callback() {
|
||||||
|
|
||||||
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_transform() * get_global_transform();
|
return canvas_layer->get_final_transform() * get_global_transform();
|
||||||
} else if (is_inside_tree()) {
|
} else if (is_inside_tree()) {
|
||||||
return get_viewport()->get_canvas_transform() * get_global_transform();
|
return get_viewport()->get_canvas_transform() * get_global_transform();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1099,7 +1099,7 @@ Transform2D CanvasItem::get_canvas_transform() const {
|
||||||
ERR_FAIL_COND_V(!is_inside_tree(), Transform2D());
|
ERR_FAIL_COND_V(!is_inside_tree(), Transform2D());
|
||||||
|
|
||||||
if (canvas_layer) {
|
if (canvas_layer) {
|
||||||
return canvas_layer->get_transform();
|
return canvas_layer->get_final_transform();
|
||||||
} else if (Object::cast_to<CanvasItem>(get_parent())) {
|
} else if (Object::cast_to<CanvasItem>(get_parent())) {
|
||||||
return Object::cast_to<CanvasItem>(get_parent())->get_canvas_transform();
|
return Object::cast_to<CanvasItem>(get_parent())->get_canvas_transform();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1111,7 +1111,7 @@ Transform2D CanvasItem::get_viewport_transform() const {
|
||||||
ERR_FAIL_COND_V(!is_inside_tree(), Transform2D());
|
ERR_FAIL_COND_V(!is_inside_tree(), Transform2D());
|
||||||
|
|
||||||
if (canvas_layer) {
|
if (canvas_layer) {
|
||||||
return get_viewport()->get_final_transform() * canvas_layer->get_transform();
|
return get_viewport()->get_final_transform() * canvas_layer->get_final_transform();
|
||||||
} else {
|
} else {
|
||||||
return get_viewport()->get_final_transform() * get_viewport()->get_canvas_transform();
|
return get_viewport()->get_final_transform() * get_viewport()->get_canvas_transform();
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,18 @@ Transform2D CanvasLayer::get_transform() const {
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Transform2D CanvasLayer::get_final_transform() const {
|
||||||
|
if (is_following_viewport()) {
|
||||||
|
Transform2D follow;
|
||||||
|
follow.scale(Vector2(get_follow_viewport_scale(), get_follow_viewport_scale()));
|
||||||
|
if (vp) {
|
||||||
|
follow = vp->get_canvas_transform() * follow;
|
||||||
|
}
|
||||||
|
return follow * transform;
|
||||||
|
}
|
||||||
|
return transform;
|
||||||
|
}
|
||||||
|
|
||||||
void CanvasLayer::_update_xform() {
|
void CanvasLayer::_update_xform() {
|
||||||
transform.set_rotation_and_scale(rot, scale);
|
transform.set_rotation_and_scale(rot, scale);
|
||||||
transform.set_origin(ofs);
|
transform.set_origin(ofs);
|
||||||
|
@ -304,6 +316,7 @@ void CanvasLayer::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_transform", "transform"), &CanvasLayer::set_transform);
|
ClassDB::bind_method(D_METHOD("set_transform", "transform"), &CanvasLayer::set_transform);
|
||||||
ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform);
|
ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_final_transform"), &CanvasLayer::get_final_transform);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_offset", "offset"), &CanvasLayer::set_offset);
|
ClassDB::bind_method(D_METHOD("set_offset", "offset"), &CanvasLayer::set_offset);
|
||||||
ClassDB::bind_method(D_METHOD("get_offset"), &CanvasLayer::get_offset);
|
ClassDB::bind_method(D_METHOD("get_offset"), &CanvasLayer::get_offset);
|
||||||
|
|
|
@ -77,6 +77,7 @@ public:
|
||||||
|
|
||||||
void set_transform(const Transform2D &p_xform);
|
void set_transform(const Transform2D &p_xform);
|
||||||
Transform2D get_transform() const;
|
Transform2D get_transform() const;
|
||||||
|
Transform2D get_final_transform() const;
|
||||||
|
|
||||||
void set_offset(const Vector2 &p_offset);
|
void set_offset(const Vector2 &p_offset);
|
||||||
Vector2 get_offset() const;
|
Vector2 get_offset() const;
|
||||||
|
|
|
@ -642,7 +642,7 @@ void Viewport::_process_picking() {
|
||||||
ObjectID canvas_layer_id;
|
ObjectID canvas_layer_id;
|
||||||
if (E) {
|
if (E) {
|
||||||
// A descendant CanvasLayer.
|
// A descendant CanvasLayer.
|
||||||
canvas_layer_transform = E->get_transform();
|
canvas_layer_transform = E->get_final_transform();
|
||||||
canvas_layer_id = E->get_instance_id();
|
canvas_layer_id = E->get_instance_id();
|
||||||
} else {
|
} else {
|
||||||
// This Viewport's builtin canvas.
|
// This Viewport's builtin canvas.
|
||||||
|
|
Loading…
Reference in a new issue