Browse Source

Fix canvas size having a 1-frame delay in Multiple resolutions (#819)

Hugo Locurcio 2 years ago
parent
commit
470464518b

+ 6 - 6
gui/multiple_resolutions/main.gd

@@ -27,11 +27,11 @@ func _ready():
 	# is resized whenever the window size changes. This is because the root Control node
 	# is resized whenever the window size changes. This is because the root Control node
 	# uses a Full Rect anchor, so its size will always be equal to the window size.
 	# uses a Full Rect anchor, so its size will always be equal to the window size.
 	resized.connect(self._on_resized)
 	resized.connect(self._on_resized)
-	update_container()
+	call_deferred("update_container")
 
 
 
 
 func update_container():
 func update_container():
-	# The code within this function needs to be run twice to work around an issue with containers
+	# The code within this function needs to be run deferred to work around an issue with containers
 	# having a 1-frame delay with updates.
 	# having a 1-frame delay with updates.
 	# Otherwise, `panel.size` returns a value of the previous frame, which results in incorrect
 	# Otherwise, `panel.size` returns a value of the previous frame, which results in incorrect
 	# sizing of the inner AspectRatioContainer when using the Fit to Window setting.
 	# sizing of the inner AspectRatioContainer when using the Fit to Window setting.
@@ -75,17 +75,17 @@ func _on_gui_aspect_ratio_item_selected(index):
 		6:  # 21:9
 		6:  # 21:9
 			gui_aspect_ratio = 21.0 / 9.0
 			gui_aspect_ratio = 21.0 / 9.0
 
 
-	update_container()
+	call_deferred("update_container")
 
 
 
 
 func _on_resized():
 func _on_resized():
-	update_container()
+	call_deferred("update_container")
 
 
 
 
 func _on_gui_margin_drag_ended(_value_changed):
 func _on_gui_margin_drag_ended(_value_changed):
 	gui_margin = $"Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin/HSlider".value
 	gui_margin = $"Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin/HSlider".value
 	$"Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin/Value".text = str(gui_margin)
 	$"Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin/Value".text = str(gui_margin)
-	update_container()
+	call_deferred("update_container")
 
 
 
 
 func _on_window_base_size_item_selected(index):
 func _on_window_base_size_item_selected(index):
@@ -108,7 +108,7 @@ func _on_window_base_size_item_selected(index):
 			base_window_size = Vector2(1680, 720)
 			base_window_size = Vector2(1680, 720)
 
 
 	get_viewport().content_scale_size = base_window_size
 	get_viewport().content_scale_size = base_window_size
-	update_container()
+	call_deferred("update_container")
 
 
 
 
 func _on_window_stretch_mode_item_selected(index):
 func _on_window_stretch_mode_item_selected(index):

+ 45 - 80
gui/multiple_resolutions/main.tscn

@@ -19,12 +19,15 @@ border_width_bottom = 8
 border_color = Color(0.25, 0.38, 0.8, 0.5)
 border_color = Color(0.25, 0.38, 0.8, 0.5)
 
 
 [node name="Main" type="Control"]
 [node name="Main" type="Control"]
+layout_mode = 3
+anchors_preset = 15
 anchor_right = 1.0
 anchor_right = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
-script = ExtResource( "1" )
+script = ExtResource("1")
 
 
 [node name="OuterSideLabel" type="Label" parent="."]
 [node name="OuterSideLabel" type="Label" parent="."]
 modulate = Color(1, 1, 1, 0.627451)
 modulate = Color(1, 1, 1, 0.627451)
+layout_mode = 0
 offset_left = 8.0
 offset_left = 8.0
 offset_top = 8.0
 offset_top = 8.0
 offset_right = 165.0
 offset_right = 165.0
@@ -35,12 +38,16 @@ metadata/_edit_layout_mode = 1
 metadata/_edit_use_custom_anchors = false
 metadata/_edit_use_custom_anchors = false
 
 
 [node name="Panel" type="Panel" parent="."]
 [node name="Panel" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = 15
 anchor_right = 1.0
 anchor_right = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
-theme_override_styles/panel = SubResource( "StyleBoxFlat_vvbdh" )
+theme_override_styles/panel = SubResource("StyleBoxFlat_vvbdh")
 
 
 [node name="InnerSideLabel" type="Label" parent="Panel"]
 [node name="InnerSideLabel" type="Label" parent="Panel"]
 modulate = Color(0.666667, 1, 0.501961, 1)
 modulate = Color(0.666667, 1, 0.501961, 1)
+layout_mode = 1
+anchors_preset = 2
 anchor_top = 1.0
 anchor_top = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
 offset_left = 8.0
 offset_left = 8.0
@@ -54,29 +61,36 @@ metadata/_edit_layout_mode = 1
 metadata/_edit_use_custom_anchors = false
 metadata/_edit_use_custom_anchors = false
 
 
 [node name="AspectRatioContainer" type="AspectRatioContainer" parent="Panel"]
 [node name="AspectRatioContainer" type="AspectRatioContainer" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
 anchor_right = 1.0
 anchor_right = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
 
 
 [node name="Panel" type="Panel" parent="Panel/AspectRatioContainer"]
 [node name="Panel" type="Panel" parent="Panel/AspectRatioContainer"]
-offset_left = 212.0
-offset_right = 812.0
-offset_bottom = 600.0
-theme_override_styles/panel = SubResource( "StyleBoxFlat_dyby4" )
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_dyby4")
 
 
 [node name="TopLeft" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
 [node name="TopLeft" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
+layout_mode = 0
 color = Color(1, 1, 1, 0.25098)
 color = Color(1, 1, 1, 0.25098)
 
 
 [node name="TopRight" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
 [node name="TopRight" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
+layout_mode = 1
+anchors_preset = 1
 anchor_left = 1.0
 anchor_left = 1.0
 anchor_right = 1.0
 anchor_right = 1.0
 color = Color(1, 1, 1, 0.25098)
 color = Color(1, 1, 1, 0.25098)
 
 
 [node name="BottomLeft" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
 [node name="BottomLeft" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
+layout_mode = 1
+anchors_preset = 2
 anchor_top = 1.0
 anchor_top = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
 color = Color(1, 1, 1, 0.25098)
 color = Color(1, 1, 1, 0.25098)
 
 
 [node name="BottomRight" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
 [node name="BottomRight" type="ColorRect" parent="Panel/AspectRatioContainer/Panel"]
+layout_mode = 1
+anchors_preset = 3
 anchor_left = 1.0
 anchor_left = 1.0
 anchor_top = 1.0
 anchor_top = 1.0
 anchor_right = 1.0
 anchor_right = 1.0
@@ -84,41 +98,31 @@ anchor_bottom = 1.0
 color = Color(1, 1, 1, 0.25098)
 color = Color(1, 1, 1, 0.25098)
 
 
 [node name="CenterContainer" type="CenterContainer" parent="Panel/AspectRatioContainer/Panel"]
 [node name="CenterContainer" type="CenterContainer" parent="Panel/AspectRatioContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
 anchor_right = 1.0
 anchor_right = 1.0
 anchor_bottom = 1.0
 anchor_bottom = 1.0
 
 
 [node name="Options" type="VBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer"]
 [node name="Options" type="VBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer"]
-offset_left = 112.0
-offset_top = 152.0
-offset_right = 488.0
-offset_bottom = 447.0
+layout_mode = 2
 theme_override_constants/separation = 10
 theme_override_constants/separation = 10
 
 
 [node name="Title" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="Title" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-minimum_size = Vector2(0, 45)
-offset_right = 376.0
-offset_bottom = 45.0
+layout_mode = 2
 theme_override_colors/font_color = Color(1, 0.87, 0.62, 1)
 theme_override_colors/font_color = Color(1, 0.87, 0.62, 1)
 theme_override_font_sizes/font_size = 24
 theme_override_font_sizes/font_size = 24
 text = "Options"
 text = "Options"
 horizontal_alignment = 1
 horizontal_alignment = 1
 
 
 [node name="WindowBaseSize" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="WindowBaseSize" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 55.0
-offset_right = 376.0
-offset_bottom = 86.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowBaseSize"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowBaseSize"]
-minimum_size = Vector2(190, 0)
-offset_top = 2.0
-offset_right = 190.0
-offset_bottom = 28.0
+layout_mode = 2
 text = "Window Base Size"
 text = "Window Base Size"
 
 
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowBaseSize"]
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowBaseSize"]
-offset_left = 194.0
-offset_right = 376.0
-offset_bottom = 31.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 item_count = 8
 item_count = 8
 selected = 0
 selected = 0
@@ -140,21 +144,14 @@ popup/item_7/text = "1680×720 (21:9)"
 popup/item_7/id = 7
 popup/item_7/id = 7
 
 
 [node name="WindowStretchMode" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="WindowStretchMode" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 96.0
-offset_right = 376.0
-offset_bottom = 127.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchMode"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchMode"]
-minimum_size = Vector2(190, 0)
-offset_top = 2.0
-offset_right = 190.0
-offset_bottom = 28.0
+layout_mode = 2
 text = "Window Stretch Mode"
 text = "Window Stretch Mode"
 
 
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchMode"]
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchMode"]
-offset_left = 194.0
-offset_right = 376.0
-offset_bottom = 31.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 item_count = 3
 item_count = 3
 selected = 1
 selected = 1
@@ -166,21 +163,14 @@ popup/item_2/text = "Viewport"
 popup/item_2/id = 2
 popup/item_2/id = 2
 
 
 [node name="WindowStretchAspect" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="WindowStretchAspect" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 137.0
-offset_right = 376.0
-offset_bottom = 168.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchAspect"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchAspect"]
-minimum_size = Vector2(190, 0)
-offset_top = 2.0
-offset_right = 190.0
-offset_bottom = 28.0
+layout_mode = 2
 text = "Window Stretch Aspect"
 text = "Window Stretch Aspect"
 
 
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchAspect"]
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowStretchAspect"]
-offset_left = 194.0
-offset_right = 376.0
-offset_bottom = 31.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 item_count = 5
 item_count = 5
 selected = 4
 selected = 4
@@ -196,20 +186,14 @@ popup/item_4/text = "Expand"
 popup/item_4/id = 4
 popup/item_4/id = 4
 
 
 [node name="WindowScaleFactor" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="WindowScaleFactor" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 178.0
-offset_right = 376.0
-offset_bottom = 204.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
-minimum_size = Vector2(190, 0)
-offset_right = 190.0
-offset_bottom = 26.0
+layout_mode = 2
 text = "Window Scale Factor"
 text = "Window Scale Factor"
 
 
 [node name="HSlider" type="HSlider" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
 [node name="HSlider" type="HSlider" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
-offset_left = 194.0
-offset_right = 330.0
-offset_bottom = 16.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 size_flags_stretch_ratio = 100.0
 size_flags_stretch_ratio = 100.0
 min_value = 0.75
 min_value = 0.75
@@ -218,33 +202,22 @@ step = 0.01
 value = 1.0
 value = 1.0
 
 
 [node name="Value" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
 [node name="Value" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/WindowScaleFactor"]
-offset_left = 334.0
-offset_right = 376.0
-offset_bottom = 26.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 text = "100%"
 text = "100%"
 
 
 [node name="HSeparator" type="HSeparator" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="HSeparator" type="HSeparator" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 214.0
-offset_right = 376.0
-offset_bottom = 218.0
+layout_mode = 2
 
 
 [node name="GUIMaxAspectRatio" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="GUIMaxAspectRatio" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 228.0
-offset_right = 376.0
-offset_bottom = 259.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMaxAspectRatio"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMaxAspectRatio"]
-minimum_size = Vector2(190, 0)
-offset_top = 2.0
-offset_right = 190.0
-offset_bottom = 28.0
+layout_mode = 2
 text = "GUI Max Aspect Ratio"
 text = "GUI Max Aspect Ratio"
 
 
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMaxAspectRatio"]
 [node name="OptionButton" type="OptionButton" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMaxAspectRatio"]
-offset_left = 194.0
-offset_right = 376.0
-offset_bottom = 31.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 item_count = 7
 item_count = 7
 selected = 0
 selected = 0
@@ -264,28 +237,20 @@ popup/item_6/text = "21:9"
 popup/item_6/id = 6
 popup/item_6/id = 6
 
 
 [node name="GUIMargin" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
 [node name="GUIMargin" type="HBoxContainer" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options"]
-offset_top = 269.0
-offset_right = 376.0
-offset_bottom = 295.0
+layout_mode = 2
 
 
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
 [node name="Label" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
-minimum_size = Vector2(190, 0)
-offset_right = 190.0
-offset_bottom = 26.0
+layout_mode = 2
 text = "GUI Margin"
 text = "GUI Margin"
 
 
 [node name="HSlider" type="HSlider" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
 [node name="HSlider" type="HSlider" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
-offset_left = 194.0
-offset_right = 362.0
-offset_bottom = 16.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 size_flags_stretch_ratio = 100.0
 size_flags_stretch_ratio = 100.0
 max_value = 50.0
 max_value = 50.0
 
 
 [node name="Value" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
 [node name="Value" type="Label" parent="Panel/AspectRatioContainer/Panel/CenterContainer/Options/GUIMargin"]
-offset_left = 366.0
-offset_right = 376.0
-offset_bottom = 26.0
+layout_mode = 2
 size_flags_horizontal = 3
 size_flags_horizontal = 3
 text = "0"
 text = "0"
 
 

+ 3 - 4
gui/multiple_resolutions/project.godot

@@ -28,17 +28,16 @@ with an overscan area to prevent GUI elements from being cut off.
 This can also improve the gameplay experience on large monitors
 This can also improve the gameplay experience on large monitors
 by bringing HUD elements closer to the center of the screen."
 by bringing HUD elements closer to the center of the screen."
 run/main_scene="res://main.tscn"
 run/main_scene="res://main.tscn"
+config/features=PackedStringArray("4.0")
 run/low_processor_mode=true
 run/low_processor_mode=true
 config/icon="res://icon.png"
 config/icon="res://icon.png"
-config/features=PackedStringArray("4.0")
 
 
 [display]
 [display]
 
 
+window/size/viewport_width=648
 window/handheld/orientation="sensor"
 window/handheld/orientation="sensor"
 window/stretch/mode="canvas_items"
 window/stretch/mode="canvas_items"
 window/stretch/aspect="expand"
 window/stretch/aspect="expand"
-window/size/viewport_width=648
-window/size/viewport_height=648
 window/size/test_width=1152
 window/size/test_width=1152
 window/size/test_height=648
 window/size/test_height=648
 
 
@@ -48,6 +47,6 @@ theme/default_font_multichannel_signed_distance_field=true
 
 
 [rendering]
 [rendering]
 
 
-vulkan/rendering/back_end=1
 environment/defaults/default_clear_color=Color(0.133333, 0.133333, 0.2, 1)
 environment/defaults/default_clear_color=Color(0.133333, 0.133333, 0.2, 1)
+vulkan/rendering/back_end=1
 quality/driver/driver_name="GLES2"
 quality/driver/driver_name="GLES2"