From 3161c06382202054d2bc5a8d2f77e166af1c78d3 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Wed, 3 Jul 2024 15:59:37 +0100 Subject: [PATCH] Add wireframe shader and use it for a new target info view --- LICENSE.md | 1 + fx/wireframe.gdshader | 30 +++++++ gui/hud/images/target_info/bar_empty.png | Bin 0 -> 1094 bytes .../images/target_info/bar_empty.png.import | 34 ++++++++ gui/hud/images/target_info/heading_border.png | Bin 0 -> 1275 bytes .../target_info/heading_border.png.import | 34 ++++++++ gui/hud/images/target_info/hull_fill.png | Bin 0 -> 1350 bytes .../images/target_info/hull_fill.png.import | 34 ++++++++ gui/hud/images/target_info/shields_fill.png | Bin 0 -> 1347 bytes .../target_info/shields_fill.png.import | 34 ++++++++ gui/hud/images/target_info/target_bg.png | Bin 0 -> 24551 bytes .../images/target_info/target_bg.png.import | 34 ++++++++ gui/hud/target_fill_bar.gd | 36 ++++++++ gui/hud/target_fill_bar.tscn | 42 +++++++++ gui/hud/target_view.tscn | 34 ++++++++ main/game.tscn | 80 +++++++++++++++++- project.godot | 6 +- 17 files changed, 393 insertions(+), 6 deletions(-) create mode 100644 fx/wireframe.gdshader create mode 100644 gui/hud/images/target_info/bar_empty.png create mode 100644 gui/hud/images/target_info/bar_empty.png.import create mode 100644 gui/hud/images/target_info/heading_border.png create mode 100644 gui/hud/images/target_info/heading_border.png.import create mode 100644 gui/hud/images/target_info/hull_fill.png create mode 100644 gui/hud/images/target_info/hull_fill.png.import create mode 100644 gui/hud/images/target_info/shields_fill.png create mode 100644 gui/hud/images/target_info/shields_fill.png.import create mode 100644 gui/hud/images/target_info/target_bg.png create mode 100644 gui/hud/images/target_info/target_bg.png.import create mode 100644 gui/hud/target_fill_bar.gd create mode 100644 gui/hud/target_fill_bar.tscn create mode 100644 gui/hud/target_view.tscn diff --git a/LICENSE.md b/LICENSE.md index 9bba6f8a..0dcca539 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -118,6 +118,7 @@ SOFTWARE. - dropdown - radar - radio +- target_info --- diff --git a/fx/wireframe.gdshader b/fx/wireframe.gdshader new file mode 100644 index 00000000..c54c6a87 --- /dev/null +++ b/fx/wireframe.gdshader @@ -0,0 +1,30 @@ +shader_type spatial; + +render_mode unshaded, wireframe; + +uniform vec4 wireframe_color : source_color = vec4(0.0, 0.0, 0.0, 1.0); +uniform float wireframe_thickness : hint_range(0.0, 10.0) = 1.0; +uniform float wireframe_smoothness : hint_range(0.0, 10.0) = 1.0; + +varying vec3 barycentric_coords; + +void vertex() { + // Calculate barycentric coordinates + float base = float(VERTEX_ID % 3); + barycentric_coords = vec3(0.0); + barycentric_coords[int(base)] = 1.0; +} + +void fragment() { + // Calculate the minimum distance to an edge + vec3 deltas = fwidth(barycentric_coords); + vec3 smoothing = deltas * wireframe_smoothness; + vec3 thickness = deltas * wireframe_thickness; + + vec3 barycentric = smoothstep(thickness, thickness + smoothing, barycentric_coords); + float min_distance = min(min(barycentric.x, barycentric.y), barycentric.z); + + // Mix the wireframe color with transparency based on the distance + ALBEDO = wireframe_color.rgb; + ALPHA = 1.0 - min_distance; +} diff --git a/gui/hud/images/target_info/bar_empty.png b/gui/hud/images/target_info/bar_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..f9fbcefec60139a0da948c12f18e837ed1facd61 GIT binary patch literal 1094 zcmaJ=TWHik6dfOxQe7-k(TYfn-~-%EvXAU0Hm&Vu*G8IB*2S(=#Wb1ShBld)Ox^7w z1z(6&)Pf+0U;d~dA_`VeRMZa@#UByzMSXrLeu(IYpp)9Iez@jia%VW_+;i{TIndR) zE>O3q4ge5P+T{!Y)BJdL?JTnHAHV&S{2Fm8hc}=+E^00Wtp@6alwxTGn1PxxwEZ4z z0$|2+Gn>OXwL{dA71Df6sAM^W4M0;%$jC@Y4;)Z|B#Y_5?PGje(|7uiX4AI6Tz zFvVgqRE&g>TVOar5EwShgu_9C2zo;{)=EL!TUJq!p{Kj1gH2>pzM|HP2C+mFr@u?E zoGDq`n`{$l7*o<5h6}NNNfn@~{vT>tQ)mxo;2*#L6!x-14rDUWLxZkPE-t^!PvwY7 z7it)}S%d~EUF_;Z7@L4{Np#69p4C7z!Uzc4uA`|3?Q=>~ZQ^OB!GVv}M?e^v$7s#`? ztjMj|(zB1xxVl?w>-W7@UTkia&owmd*>`;G%beXC={NJAs3$iS*tU_y<3Gno>6Z;h z26miydp1hXGi$*0^22S)*817%Y2{cAU=EBe?_b}L`gUc@+y}F6J}qBe(_`LQuvdEj z_1cTZ0JyaIQ~XsxINZ264m!+LwcyM1>EJ^{>d{KjapvXGcg4WG76wqc_~V|rJ!kF? x2W~B?0i!>qk)3VtQ&&YGO)d;mK4R1_oxe%#etZ2wxwonUy@&(kzb(T>?C(@k!!*?;n1d(XtPS^wp1#L7I4k3P0H_MBC|Q(JN3N?T^znX_y4rpqum%&$6G zEk9{i?fS?Nqs`K-M`iDB?qCRzn{wq||7lOlw2wa~%@><2=grO#>gbuHG;;#4rMmyq zRW{jXcQ)5u@D-k}x<;0vhr_F*bH2~Ar)zQ|ee$0EyE?o2(r4$gL(|f8+gw>1<~wq- zZ>Xy_R;^XL_Oz{L%51SoITgD%Z$6>KW9H%F$($x80e@bXPR|n4}?NLtu;Z%{$wSZx>zP=2)kcDJ;zJBR`-juRv60-oyBf`}4{e7)~`! n+I{e*hfLoOTLuT!`%F9xSB%5v9nFZ92Ng%2u6{1-oD!M-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uEi)vdB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!drklMPKw70fO5 z49$#9EG=~uj0_Ad^bIWZ4UKgT&8$oetc;8lpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+UU-@r)U$VeBcLbtdwuOzWTH?LS3W`avKTB%1XJkii(hGOE?jkSNl+@ny;uz{ z4yi0i)elN7&Mz%W21Z<(GRUd|E9aur#FG4?ko^1{SSSW${tsimu%ikrMZl!}%479I zU_RUC>EaktaqG<-N3Wv>0uJhb8NWZ`joDeMdoPy%!L_O80^glxdw6Re*f#c|%^kVrhJ0d1} zX;0ueaKmV0;0e{TB}Q)ruWVJ5VA$ceGow?b)c4#EUp=$rjZPmAolanQV0AQUY0;67 zzqdD?EYno!i_lYB6T^_evr~pCGNfW=Z^XtcON74fP!Mi-cp>hD*2WE=EH}-#-*Yrg z{+Hv&j}Lz~mvb}B+W!4|wX(=te#_0rmA2oXZ@gZJA#7jXyG4a9_lj>CO)| z7UdbGhxYtm>mtj|uqG~o`|&f|Ns~9`KuwxY!F=fD0kwLSs`m8HbvUsWG~t!nP9WAV~fA}?%6v6eR+c3y;Hk7z2*Hzh90%4 zvl622r)nBaQ+V1QJ%N*9(n?RaCB?gTs*1NTG3+dg-;$jEss0y3g3n2jKO6=OI#&*E UKGtw~Kd5B$boFyt=akR{0HPq`3jhEB literal 0 HcmV?d00001 diff --git a/gui/hud/images/target_info/hull_fill.png.import b/gui/hud/images/target_info/hull_fill.png.import new file mode 100644 index 00000000..c42c357c --- /dev/null +++ b/gui/hud/images/target_info/hull_fill.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e8r1y25pox5u" +path="res://.godot/imported/hull_fill.png-555f5f5b083a2023ff49c2a7584268d1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://gui/hud/images/target_info/hull_fill.png" +dest_files=["res://.godot/imported/hull_fill.png-555f5f5b083a2023ff49c2a7584268d1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/gui/hud/images/target_info/shields_fill.png b/gui/hud/images/target_info/shields_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..cec7f2fec84940bc46d54212067e5de0077d745f GIT binary patch literal 1347 zcmeAS@N?(olHy`uVBq!ia0y~yU=#zg#W~o3-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@uEi)vdB*NFnDmgz_FA=0huOhbqsGEVo#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRzL%C zQ%e#RDspr3imfVamB8j&0ofp7eI*63l9Fs&C5WRUd;=7m^NUgyO!drklMPKw70fO5 z49$#9EG=~uj0_Ad^bIWZ4UKgT&8$oetc;8lpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pF zzr4I$uiRKKzbIYb(9+UU-@r)U$VeBcLbtdwuOzWTH?LS3W`avKTB%1XJkii(hGOE?jkSNl+@ny;uz{ z4yi0i)elN7&Mz%W21Z<(GRUd|E9aur#FG4?ko^1{SSSW$krMZlzO_{`!S zFrRJqba4!+xbW#gm-*IjBWLYsRYtEBGTqaK+% zWr_3B>Y^gQ!>3)Q@5gFw?J!82wL ztNyHYk>zH{iMzq|c%8e7dh*TNamOYtiDhtps(WCLx7_+qWu=>@WofFcQnn0=Y~Ad{ zVC;4Dwvwmr%7~3Ao9j05KPfRjP?IG1a(-T!dEw$&5=-vg^2TnG+Pqgr PpkmF_)z4*}Q$iB}gjd+% literal 0 HcmV?d00001 diff --git a/gui/hud/images/target_info/shields_fill.png.import b/gui/hud/images/target_info/shields_fill.png.import new file mode 100644 index 00000000..6033712d --- /dev/null +++ b/gui/hud/images/target_info/shields_fill.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsf3tqgocto7h" +path="res://.godot/imported/shields_fill.png-9eebbd928584a892ac05d44c6835b499.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://gui/hud/images/target_info/shields_fill.png" +dest_files=["res://.godot/imported/shields_fill.png-9eebbd928584a892ac05d44c6835b499.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/gui/hud/images/target_info/target_bg.png b/gui/hud/images/target_info/target_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4c72e046c22582ef3f6af1d091eddde93d8b9697 GIT binary patch literal 24551 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 void: + self._update() + +func _update() -> void: + if self.fill_rect == null: + return + + var percentage := 0.0 if is_zero_approx(self.max_value) else clampf(self.value / self.max_value, 0.0, 1.0) + + self.fill_rect.visible = not is_zero_approx(percentage) + self.fill_rect.size.x = (self.max_width - self.min_width) * percentage + self.min_width diff --git a/gui/hud/target_fill_bar.tscn b/gui/hud/target_fill_bar.tscn new file mode 100644 index 00000000..ff49ea63 --- /dev/null +++ b/gui/hud/target_fill_bar.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=4 format=3 uid="uid://bpav2va7o5qt4"] + +[ext_resource type="Script" path="res://gui/hud/target_fill_bar.gd" id="1_q2o4q"] +[ext_resource type="Texture2D" uid="uid://cwdmvrqg25666" path="res://gui/hud/images/target_info/bar_empty.png" id="1_slxrs"] +[ext_resource type="Texture2D" uid="uid://e8r1y25pox5u" path="res://gui/hud/images/target_info/hull_fill.png" id="2_gshbn"] + +[node name="TargetFillBar" type="Control" node_paths=PackedStringArray("fill_rect")] +custom_minimum_size = Vector2(100, 11) +layout_mode = 3 +anchors_preset = 0 +mouse_filter = 1 +script = ExtResource("1_q2o4q") +max_value = 10.0 +value = 7.0 +fill_rect = NodePath("NinePatchRect") +max_width = 184.0 +min_width = 16.0 + +[node name="Background" type="TextureRect" parent="."] +custom_minimum_size = Vector2(100, 11) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("1_slxrs") +expand_mode = 1 + +[node name="NinePatchRect" type="NinePatchRect" parent="."] +layout_mode = 0 +offset_left = -7.0 +offset_top = -6.0 +offset_right = 107.0 +offset_bottom = 17.0 +texture = ExtResource("2_gshbn") +region_rect = Rect2(2.08165e-12, 2.08165e-12, 278, 23) +patch_margin_left = 8 +patch_margin_top = 8 +patch_margin_right = 8 +patch_margin_bottom = 8 diff --git a/gui/hud/target_view.tscn b/gui/hud/target_view.tscn new file mode 100644 index 00000000..76cd8605 --- /dev/null +++ b/gui/hud/target_view.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=5 format=3 uid="uid://boit6owlfi3h"] + +[ext_resource type="ArrayMesh" uid="uid://c2y60nf8m25ka" path="res://ships/frigate03/frigate03_mesh.tres" id="1_a2vil"] +[ext_resource type="Shader" path="res://fx/wireframe.gdshader" id="2_uts7q"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_yvqgq"] +render_priority = 0 +shader = ExtResource("2_uts7q") +shader_parameter/wireframe_color = Color(0.65098, 0.831373, 1, 1) +shader_parameter/wireframe_thickness = 1.0 +shader_parameter/wireframe_smoothness = 1.0 + +[sub_resource type="Environment" id="Environment_n1lj7"] +ambient_light_color = Color(1, 1, 1, 1) +reflected_light_source = 1 + +[node name="TargetView" type="Node3D"] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0) +shadow_enabled = true + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = ExtResource("1_a2vil") +surface_material_override/0 = SubResource("ShaderMaterial_yvqgq") + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(0.707107, 0.5, -0.5, 2.4663e-16, 0.707107, 0.707107, 0.707107, -0.5, 0.5, -2, 2, 2) +current = true +near = 1.0 +far = 10.0 + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +environment = SubResource("Environment_n1lj7") diff --git a/main/game.tscn b/main/game.tscn index c0d756fd..7465e3cd 100644 --- a/main/game.tscn +++ b/main/game.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=44 format=3 uid="uid://sunhu71swcs2"] +[gd_scene load_steps=50 format=3 uid="uid://sunhu71swcs2"] [ext_resource type="Script" path="res://utils/shader_precompiler.gd" id="1_kgmvv"] [ext_resource type="Script" path="res://main/hyperspace_controller.gd" id="2_5gj7y"] @@ -33,6 +33,11 @@ [ext_resource type="Texture2D" uid="uid://dif27wf74itjw" path="res://gui/hud/images/IconEnergy.png" id="24_iwm5p"] [ext_resource type="PackedScene" uid="uid://dl3xau7i06twf" path="res://gui/hud/vitals_fill_bar.tscn" id="25_qonn8"] [ext_resource type="PackedScene" uid="uid://kqong7nrl4p2" path="res://galaxy/map/galaxy_map.tscn" id="28_oyaod"] +[ext_resource type="Texture2D" uid="uid://s173r8o180gv" path="res://gui/hud/images/target_info/target_bg.png" id="31_s52vq"] +[ext_resource type="Texture2D" uid="uid://dcg5m8doqdfc" path="res://gui/hud/images/target_info/heading_border.png" id="32_h7f2h"] +[ext_resource type="PackedScene" uid="uid://bpav2va7o5qt4" path="res://gui/hud/target_fill_bar.tscn" id="33_oq34c"] +[ext_resource type="PackedScene" uid="uid://boit6owlfi3h" path="res://gui/hud/target_view.tscn" id="33_v8kjk"] +[ext_resource type="Texture2D" uid="uid://bsf3tqgocto7h" path="res://gui/hud/images/target_info/shields_fill.png" id="34_ajn47"] [sub_resource type="World3D" id="World3D_pvg5q"] environment = ExtResource("6_srnxb") @@ -83,6 +88,13 @@ content_margin_bottom = 12.0 texture = ExtResource("21_jwbi2") region_rect = Rect2(0, 0, 157, 161) +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_lc8il"] +texture = ExtResource("31_s52vq") +texture_margin_left = 14.0 +texture_margin_top = 10.0 +texture_margin_right = 15.0 +texture_margin_bottom = 10.0 + [node name="Game" type="Node3D"] [node name="ShaderPrecompiler" type="SubViewport" parent="."] @@ -224,9 +236,9 @@ layout_mode = 2 tooltip_text = "Control scheme" item_count = 2 selected = 0 -popup/item_0/text = "Relative" +popup/item_0/text = "Relative controls" popup/item_0/id = 0 -popup/item_1/text = "Absolute" +popup/item_1/text = "Absolute controls" popup/item_1/id = 1 script = ExtResource("12_ti545") @@ -361,7 +373,6 @@ text_overrun_behavior = 3 uppercase = true [node name="TargetVitals" type="GridContainer" parent="HUD/Sidebar/TargetInfo"] -visible = false layout_mode = 2 columns = 2 @@ -405,6 +416,66 @@ size_flags_horizontal = 3 mouse_filter = 2 step = 2.08165e-12 +[node name="TargetInfoContainer" type="PanelContainer" parent="HUD/Sidebar"] +custom_minimum_size = Vector2(200, 194) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_lc8il") + +[node name="VBoxContainer" type="VBoxContainer" parent="HUD/Sidebar/TargetInfoContainer"] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="HBoxContainer" type="HBoxContainer" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 0 + +[node name="Label" type="Label" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_type_variation = &"HUDLabel" +theme_override_colors/font_color = Color(0.454902, 0.729412, 0.984314, 1) +text = "Target:" +uppercase = true + +[node name="TargetedShipLabel" type="Label" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"HUDLabel" +text = "none" +text_overrun_behavior = 3 +uppercase = true + +[node name="TextureRect" type="TextureRect" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer"] +layout_mode = 2 +texture = ExtResource("32_h7f2h") +expand_mode = 5 + +[node name="SubViewportContainer" type="SubViewportContainer" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +stretch = true + +[node name="SubViewport" type="SubViewport" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer/SubViewportContainer"] +own_world_3d = true +transparent_bg = true +handle_input_locally = false +msaa_3d = 2 +gui_disable_input = true +size = Vector2i(171, 118) +render_target_update_mode = 4 + +[node name="TargetView" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer/SubViewportContainer/SubViewport" instance=ExtResource("33_v8kjk")] + +[node name="ShieldBar" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer" instance=ExtResource("33_oq34c")] +layout_mode = 2 +size_flags_vertical = 8 + +[node name="NinePatchRect" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer/ShieldBar" index="1"] +offset_right = 89.0 +texture = ExtResource("34_ajn47") + +[node name="HullBar" parent="HUD/Sidebar/TargetInfoContainer/VBoxContainer" instance=ExtResource("33_oq34c")] +layout_mode = 2 + [node name="GameOverDialog" type="AcceptDialog" parent="HUD"] scaling_3d_scale = 2.0 title = "Game Over" @@ -472,3 +543,4 @@ galaxy = ExtResource("3_j76v0") [connection signal="close_requested" from="HUD/GalaxyMapWindow" to="HUD/GalaxyMapWindow/SubViewportContainer/SubViewport/GalaxyMap" method="_on_window_close_requested"] [editable path="Player"] +[editable path="HUD/Sidebar/TargetInfoContainer/VBoxContainer/ShieldBar"] diff --git a/project.godot b/project.godot index e7c061ef..c26c9962 100644 --- a/project.godot +++ b/project.godot @@ -25,10 +25,12 @@ MathUtils="*res://utils/math_utils.gd" [display] -window/size/viewport_width=3072 -window/size/viewport_height=1728 +window/size/viewport_width=3840 +window/size/viewport_height=2160 +window/size/mode=3 window/stretch/mode="canvas_items" window/stretch/aspect="expand" +window/stretch/scale=2.0 [filesystem]