Merge pull request #80965 from Calinou/viewport-add-get-stretch-scale-factor

Add a Viewport method to get automatically computed 2D stretch transform
This commit is contained in:
Thaddeus Crews
2024-11-27 10:47:12 -06:00
4 changed files with 14 additions and 1 deletions

View File

@ -104,6 +104,13 @@
Returns the transform from the Viewport's coordinates to the screen coordinates of the containing window manager window. Returns the transform from the Viewport's coordinates to the screen coordinates of the containing window manager window.
</description> </description>
</method> </method>
<method name="get_stretch_transform" qualifiers="const">
<return type="Transform2D" />
<description>
Returns the automatically computed 2D stretch transform, taking the [Viewport]'s stretch settings into account. The final value is multiplied by [member Window.content_scale_factor], but only for the root viewport. If this method is called on a [SubViewport] (e.g., in a scene tree with [SubViewportContainer] and [SubViewport]), the scale factor of the root window will not be applied. Using [method Transform2D.get_scale] on the returned value, this can be used to compensate for scaling when zooming a [Camera2D] node, or to scale down a [TextureRect] to be pixel-perfect regardless of the automatically computed scale factor.
[b]Note:[/b] Due to how pixel scaling works, the transform's X scale value may differ slightly from the Y scale, even when [member Window.content_scale_aspect] is set to a mode that preserves pixel aspect ratio. If [member Window.content_scale_aspect] is [constant Window.CONTENT_SCALE_ASPECT_IGNORE], the X value may differ [i]significantly[/i] from Y due to differences between the original aspect ratio and the window aspect ratio.
</description>
</method>
<method name="get_texture" qualifiers="const"> <method name="get_texture" qualifiers="const">
<return type="ViewportTexture" /> <return type="ViewportTexture" />
<description> <description>

View File

@ -572,7 +572,7 @@
Specifies how the content's aspect behaves when the [Window] is resized. The base aspect is determined by [member content_scale_size]. Specifies how the content's aspect behaves when the [Window] is resized. The base aspect is determined by [member content_scale_size].
</member> </member>
<member name="content_scale_factor" type="float" setter="set_content_scale_factor" getter="get_content_scale_factor" default="1.0"> <member name="content_scale_factor" type="float" setter="set_content_scale_factor" getter="get_content_scale_factor" default="1.0">
Specifies the base scale of [Window]'s content when its [member size] is equal to [member content_scale_size]. Specifies the base scale of [Window]'s content when its [member size] is equal to [member content_scale_size]. See also [method Viewport.get_stretch_transform].
</member> </member>
<member name="content_scale_mode" type="int" setter="set_content_scale_mode" getter="get_content_scale_mode" enum="Window.ContentScaleMode" default="0"> <member name="content_scale_mode" type="int" setter="set_content_scale_mode" getter="get_content_scale_mode" enum="Window.ContentScaleMode" default="0">
Specifies how the content is scaled when the [Window] is resized. Specifies how the content is scaled when the [Window] is resized.

View File

@ -1254,6 +1254,10 @@ Ref<World2D> Viewport::get_world_2d() const {
return world_2d; return world_2d;
} }
Transform2D Viewport::get_stretch_transform() const {
return stretch_transform;
}
Transform2D Viewport::get_final_transform() const { Transform2D Viewport::get_final_transform() const {
ERR_READ_THREAD_GUARD_V(Transform2D()); ERR_READ_THREAD_GUARD_V(Transform2D());
return stretch_transform * global_canvas_transform; return stretch_transform * global_canvas_transform;
@ -4636,6 +4640,7 @@ void Viewport::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_global_canvas_transform", "xform"), &Viewport::set_global_canvas_transform); ClassDB::bind_method(D_METHOD("set_global_canvas_transform", "xform"), &Viewport::set_global_canvas_transform);
ClassDB::bind_method(D_METHOD("get_global_canvas_transform"), &Viewport::get_global_canvas_transform); ClassDB::bind_method(D_METHOD("get_global_canvas_transform"), &Viewport::get_global_canvas_transform);
ClassDB::bind_method(D_METHOD("get_stretch_transform"), &Viewport::get_stretch_transform);
ClassDB::bind_method(D_METHOD("get_final_transform"), &Viewport::get_final_transform); ClassDB::bind_method(D_METHOD("get_final_transform"), &Viewport::get_final_transform);
ClassDB::bind_method(D_METHOD("get_screen_transform"), &Viewport::get_screen_transform); ClassDB::bind_method(D_METHOD("get_screen_transform"), &Viewport::get_screen_transform);

View File

@ -515,6 +515,7 @@ public:
void set_global_canvas_transform(const Transform2D &p_transform); void set_global_canvas_transform(const Transform2D &p_transform);
Transform2D get_global_canvas_transform() const; Transform2D get_global_canvas_transform() const;
Transform2D get_stretch_transform() const;
virtual Transform2D get_final_transform() const; virtual Transform2D get_final_transform() const;
void gui_set_root_order_dirty(); void gui_set_root_order_dirty();