├── .gitattributes ├── .github ├── actions │ ├── build │ │ └── action.yml │ └── sign │ │ └── action.yml └── workflows │ └── builds.yml ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── SConstruct ├── build.py ├── project ├── addons │ └── libm8gd │ │ ├── libm8gd.gdextension │ │ └── libm8gd.gdextension.uid ├── assets │ ├── ambientcg │ │ ├── asphalt010.tres │ │ ├── asphalt010 │ │ │ ├── Asphalt010_2K-JPG_Color.jpg │ │ │ ├── Asphalt010_2K-JPG_Color.jpg.import │ │ │ ├── Asphalt010_2K-JPG_Displacement.jpg │ │ │ ├── Asphalt010_2K-JPG_Displacement.jpg.import │ │ │ ├── Asphalt010_2K-JPG_NormalDX.jpg │ │ │ ├── Asphalt010_2K-JPG_NormalDX.jpg.import │ │ │ ├── Asphalt010_2K-JPG_NormalGL.jpg │ │ │ ├── Asphalt010_2K-JPG_NormalGL.jpg.import │ │ │ ├── Asphalt010_2K-JPG_Opacity.jpg │ │ │ ├── Asphalt010_2K-JPG_Opacity.jpg.import │ │ │ ├── Asphalt010_2K-JPG_Roughness.jpg │ │ │ └── Asphalt010_2K-JPG_Roughness.jpg.import │ │ ├── wood026.tres │ │ ├── wood026 │ │ │ ├── Wood026.png.import │ │ │ ├── Wood026_2K-PNG_Color.png │ │ │ ├── Wood026_2K-PNG_Color.png.import │ │ │ ├── Wood026_2K-PNG_Displacement.png │ │ │ ├── Wood026_2K-PNG_Displacement.png.import │ │ │ ├── Wood026_2K-PNG_NormalGL.png │ │ │ ├── Wood026_2K-PNG_NormalGL.png.import │ │ │ ├── Wood026_2K-PNG_Roughness.png │ │ │ └── Wood026_2K-PNG_Roughness.png.import │ │ ├── wood051.tres │ │ └── wood051 │ │ │ ├── Wood051_2K-JPG_Color.jpg │ │ │ ├── Wood051_2K-JPG_Color.jpg.import │ │ │ ├── Wood051_2K-JPG_Displacement.jpg │ │ │ ├── Wood051_2K-JPG_Displacement.jpg.import │ │ │ ├── Wood051_2K-JPG_NormalGL.jpg │ │ │ ├── Wood051_2K-JPG_NormalGL.jpg.import │ │ │ ├── Wood051_2K-JPG_Roughness.jpg │ │ │ └── Wood051_2K-JPG_Roughness.jpg.import │ ├── grid_overlay.tres │ ├── icon │ │ ├── Add.png │ │ ├── Add.png.import │ │ ├── Close.png │ │ ├── Close.png.import │ │ ├── Label.png │ │ ├── Label.png.import │ │ ├── Left.png │ │ ├── Left.png.import │ │ ├── Load.png │ │ ├── Load.png.import │ │ ├── Right.png │ │ ├── Right.png.import │ │ ├── TripleBar.png │ │ ├── TripleBar.png.import │ │ ├── m8_emoji.png │ │ └── m8_emoji.png.import │ ├── m8_fonts │ │ ├── 10_10.bmp │ │ ├── 10_10.bmp.import │ │ ├── 12_12.bmp │ │ ├── 12_12.bmp.import │ │ ├── 5_7.bmp │ │ ├── 5_7.bmp.import │ │ ├── 8_9.bmp │ │ ├── 8_9.bmp.import │ │ ├── 9_9.bmp │ │ └── 9_9.bmp.import │ ├── m8_screen_placeholder.png │ ├── m8_screen_placeholder.png.import │ ├── m8_tracker │ │ ├── license.txt │ │ ├── m8_model.blend │ │ ├── m8_model.glb │ │ ├── m8_model.glb.import │ │ ├── m8_model.glb.unwrap_cache │ │ ├── m8_model_1.png │ │ ├── m8_model_1.png.import │ │ ├── m8_model_labels_02.png │ │ ├── m8_model_labels_02.png.import │ │ ├── m8_model_m8_screen_placeholder.png │ │ ├── m8_model_m8_screen_placeholder.png.import │ │ ├── m8_model_screen_placeholder_01.png │ │ ├── m8_model_screen_placeholder_01.png.import │ │ ├── m8_model_screen_placeholder_02.png │ │ ├── m8_model_screen_placeholder_02.png.import │ │ ├── scene.bin │ │ └── textures │ │ │ ├── labels_01.png │ │ │ ├── labels_01.png.import │ │ │ ├── labels_02.png │ │ │ ├── labels_02.png.import │ │ │ ├── screen_placeholder_01.png │ │ │ ├── screen_placeholder_01.png.import │ │ │ ├── screen_placeholder_02.png │ │ │ └── screen_placeholder_02.png.import │ ├── noise.png │ ├── noise.png.import │ ├── succulent_plants │ │ ├── green-eda.tres │ │ ├── green_dram_kuki.tres │ │ ├── license.txt │ │ ├── material.tres │ │ ├── scene.bin │ │ ├── scene.gltf │ │ ├── scene.gltf.import │ │ ├── scene_0.png │ │ ├── scene_0.png.import │ │ ├── scene_1.png │ │ ├── scene_1.png.import │ │ ├── syna.tres │ │ ├── taniku01-tex.005.tres │ │ ├── taniku01-tex.007.tres │ │ ├── taniku01-tex.tres │ │ └── textures │ │ │ ├── taniku01-tex.005_baseColor.png │ │ │ ├── taniku01-tex.005_baseColor.png.import │ │ │ ├── taniku01-tex_baseColor.png │ │ │ └── taniku01-tex_baseColor.png.import │ ├── texture_02.png │ ├── texture_02.png.import │ ├── texture_04.png │ ├── texture_04.png.import │ ├── texture_06.png │ ├── texture_06.png.import │ ├── texture_07.png │ └── texture_07.png.import ├── config_file.gd ├── config_file.gd.uid ├── crt_light_3d.gd ├── crt_light_3d.gd.uid ├── default_bus_layout.tres ├── export_presets.cfg ├── grass_area.gd ├── grass_area.gd.uid ├── grass_area.gdshader ├── grass_area.gdshader.uid ├── grass_area.tscn ├── m8_scene.gd ├── m8_scene.gd.uid ├── main.gd ├── main.gd.uid ├── main.tscn ├── main_menu.gd ├── main_menu.gd.uid ├── main_menu.tscn ├── menu_overlay.gd ├── menu_overlay.gd.uid ├── menu_overlay.tscn ├── menu_utils.gd ├── menu_utils.gd.uid ├── models │ ├── m8_model.gd │ ├── m8_model.gd.uid │ ├── m8_model.tscn │ ├── material_body_01.tres │ ├── material_body_02.tres │ ├── material_m8_glass.tres │ ├── material_m8_keycap.tres │ ├── material_m8_keycap_highlight.tres │ ├── material_m8_labels.tres │ ├── material_m8_rim.tres │ ├── material_m8_screen.tres │ ├── material_m8_screen_bezel.tres │ ├── material_m8_screen_black.tres │ ├── material_m8_screw.tres │ ├── material_noise.tres │ ├── noise_normal.tres │ ├── plant_model.gd │ ├── plant_model.gd.uid │ └── plant_model.tscn ├── overlays │ ├── audio_spectrum.gdshader │ ├── audio_spectrum.gdshader.uid │ ├── overlay.gd │ ├── overlay.gd.uid │ ├── overlay_audio_spectrum.gd │ ├── overlay_audio_spectrum.gd.uid │ ├── overlay_audio_spectrum.tscn │ ├── overlay_audio_waveform.gd │ ├── overlay_audio_waveform.gd.uid │ ├── overlay_audio_waveform.tscn │ ├── overlay_display_panel.gd │ ├── overlay_display_panel.gd.uid │ ├── overlay_display_panel.tres │ ├── overlay_display_panel.tscn │ ├── overlay_keys.gd │ ├── overlay_keys.gd.uid │ ├── overlay_keys.tscn │ ├── overlay_keys_item.gd │ ├── overlay_keys_item.gd.uid │ └── overlay_keys_item.tscn ├── project.godot ├── scene_camera_3d.gd ├── scene_camera_3d.gd.uid ├── scene_camera_3d.tscn ├── scene_camera_menu.gd ├── scene_camera_menu.gd.uid ├── scene_camera_menu.tscn ├── scene_menu.gd ├── scene_menu.gd.uid ├── scene_menu.tscn ├── scenes │ ├── desktop_scene.gd │ ├── desktop_scene.gd.uid │ ├── desktop_scene.tscn │ ├── fancy_display_scene.gd │ ├── fancy_display_scene.gd.uid │ ├── fancy_display_scene.tscn │ ├── fast_display_scene.gd │ ├── fast_display_scene.gd.uid │ ├── fast_display_scene.tscn │ ├── floating_scene.gd │ ├── floating_scene.gd.uid │ ├── floating_scene.tscn │ ├── scalable_sub_viewport.gd │ └── scalable_sub_viewport.gd.uid ├── shaders │ ├── crt.gdshader │ ├── crt.gdshader.uid │ ├── crt_screen.gdshader │ ├── crt_screen.gdshader.uid │ ├── device_screen.gdshader │ ├── device_screen.gdshader.uid │ ├── device_screen_glass.gdshader │ ├── device_screen_glass.gdshader.uid │ ├── kaleidoscope.gdshader │ ├── kaleidoscope.gdshader.uid │ ├── noise.gdshader │ ├── noise.gdshader.uid │ ├── panel_blur.gdshader │ ├── panel_blur.gdshader.uid │ ├── post_process.gdshader │ ├── post_process.gdshader.uid │ ├── screen_blur.gdshader │ ├── screen_blur.gdshader.uid │ ├── vhs.gdshader │ ├── vhs.gdshader.uid │ ├── vhs2.gdshader │ ├── vhs2.gdshader.uid │ ├── vhs3.gdshader │ └── vhs3.gdshader.uid └── ui │ ├── label_header.gd │ ├── label_header.gd.uid │ ├── label_header.tscn │ ├── menu_theme.tres │ ├── setting_base.gd │ ├── setting_base.gd.uid │ ├── setting_bool.gd │ ├── setting_bool.gd.uid │ ├── setting_bool.tscn │ ├── setting_color.gd │ ├── setting_color.gd.uid │ ├── setting_color.tscn │ ├── setting_file.gd │ ├── setting_file.gd.uid │ ├── setting_file.tscn │ ├── setting_number.gd │ ├── setting_number.gd.uid │ ├── setting_number.tscn │ ├── setting_options.gd │ ├── setting_options.gd.uid │ ├── setting_options.tscn │ ├── setting_string.gd │ ├── setting_string.gd.uid │ ├── setting_string.tscn │ ├── setting_vec2.gd │ ├── setting_vec2.gd.uid │ ├── setting_vec2.tscn │ ├── setting_vec2i.gd │ ├── setting_vec2i.gd.uid │ ├── setting_vec2i.tscn │ ├── setting_vec3.gd │ ├── setting_vec3.gd.uid │ └── setting_vec3.tscn ├── screenshot.png └── src ├── display_buffer.cpp ├── display_buffer.hpp ├── gdm8.cpp ├── gdm8.hpp ├── libm8.cpp ├── libm8.hpp ├── register_types.cpp ├── register_types.h └── utilities.hpp /.gitattributes: -------------------------------------------------------------------------------- 1 | # Normalize EOL for all files that Git considers text files. 2 | * text=auto eol=lf 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Godot 4+ specific ignores 2 | .godot/ 3 | 4 | /build/ 5 | 6 | # library/object/executable files 7 | *.dll 8 | *.a 9 | *.so 10 | *.framework 11 | *.o 12 | *.os 13 | *.exe 14 | *.x86_64 15 | 16 | # tmp files 17 | *.tmp 18 | 19 | # vscode files 20 | .vscode 21 | 22 | # scons cache 23 | .sconsign.dblite 24 | /.scons_cache/ 25 | 26 | thirdparty/*/** 27 | 28 | # 3d modeling files 29 | *.blend 30 | *.blend1 31 | 32 | # image editing files 33 | *.kra 34 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "thirdparty/godot-cpp"] 2 | path = thirdparty/godot-cpp 3 | url = https://github.com/godotengine/godot-cpp 4 | branch = 4.3 5 | ignore = untracked 6 | [submodule "thirdparty/libserialport"] 7 | path = thirdparty/libserialport 8 | url = https://github.com/sigrokproject/libserialport 9 | ignore = untracked 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Branden Akana 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /SConstruct: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | from glob import glob 4 | from pathlib import Path 5 | 6 | env = SConscript("thirdparty/godot-cpp/SConstruct") 7 | 8 | # add sources 9 | env.Append(CPPPATH=["src/"]) 10 | sources = Glob("src/*.cpp") 11 | 12 | # link libserialport (statically) 13 | env.Append(CPPPATH=["thirdparty/libserialport"]) 14 | env.Append(LIBS=File("thirdparty/libserialport/.libs/libserialport.a")) 15 | if env["platform"] == "windows": 16 | env.Append(LIBS=["setupapi"]) 17 | 18 | # # find pkg-config command 19 | # if env["platform"] == "macos" and "OSXCROSS_ROOT" in os.environ: 20 | # pkg_config = "x86_64-apple-%s-pkg-config" % env["osxcross_sdk"] 21 | # else: 22 | # pkg_config = "pkg-config" 23 | 24 | # # link libserialport (shared) 25 | # env.ParseConfig(f"{pkg_config} libserialport --cflags --libs --static") 26 | 27 | # find extension path 28 | (extension_path,) = glob("project/addons/*/*.gdextension") 29 | addon_path = Path(extension_path).parent 30 | project_name = Path(extension_path).stem 31 | 32 | # scons cache 33 | scons_cache_path = os.environ.get("SCONS_CACHE") 34 | if scons_cache_path: 35 | CacheDir(scons_cache_path) 36 | else: 37 | CacheDir(".scons_cache/%s_%s_%s" % (env["platform"], env["arch"], env["target"])) 38 | 39 | # create library target 40 | debug_or_release = "release" if env["target"] == "template_release" else "debug" 41 | if env["platform"] == "macos": 42 | library = env.SharedLibrary( 43 | "{0}/bin/{1}.{2}.{3}.framework/{1}.{2}.{3}".format( 44 | addon_path, project_name, env["platform"], debug_or_release 45 | ), 46 | source=sources, 47 | ) 48 | else: 49 | library = env.SharedLibrary( 50 | "{}/bin/{}.{}.{}.{}{}".format( 51 | addon_path, 52 | project_name, 53 | env["platform"], 54 | debug_or_release, 55 | env["arch"], 56 | env["SHLIBSUFFIX"], 57 | ), 58 | source=sources, 59 | ) 60 | 61 | Default(library) 62 | -------------------------------------------------------------------------------- /project/addons/libm8gd/libm8gd.gdextension: -------------------------------------------------------------------------------- 1 | [configuration] 2 | 3 | entry_symbol = "libm8gd_init" 4 | compatibility_minimum = 4.3 5 | 6 | [libraries] 7 | 8 | macos.debug = "res://addons/libm8gd/bin/libm8gd.macos.debug.framework/libm8gd.macos.debug" 9 | macos.release = "res://addons/libm8gd/bin/libm8gd.macos.release.framework/libm8gd.macos.release" 10 | 11 | windows.debug.x86_64 = "res://addons/libm8gd/bin/libm8gd.windows.debug.x86_64.dll" 12 | windows.release.x86_64 = "res://addons/libm8gd/bin/libm8gd.windows.release.x86_64.dll" 13 | 14 | linux.debug.x86_64 = "res://addons/libm8gd/bin/libm8gd.linux.debug.x86_64.so" 15 | linux.release.x86_64 = "res://addons/libm8gd/bin/libm8gd.linux.release.x86_64.so" 16 | -------------------------------------------------------------------------------- /project/addons/libm8gd/libm8gd.gdextension.uid: -------------------------------------------------------------------------------- 1 | uid://g0t5nxmbwumi 2 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=5 format=3 uid="uid://1qarqvu22e2"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dv11e5vjgmjl6" path="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Color.jpg" id="1_kam1q"] 4 | [ext_resource type="Texture2D" uid="uid://c2lmoussricp2" path="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Displacement.jpg" id="2_vx812"] 5 | [ext_resource type="Texture2D" uid="uid://vjh43e67xd15" path="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg" id="3_u4u7q"] 6 | [ext_resource type="Texture2D" uid="uid://bgt4n4pn63np7" path="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Roughness.jpg" id="4_p5gpn"] 7 | 8 | [resource] 9 | albedo_texture = ExtResource("1_kam1q") 10 | roughness_texture = ExtResource("4_p5gpn") 11 | normal_enabled = true 12 | normal_texture = ExtResource("3_u4u7q") 13 | heightmap_texture = ExtResource("2_vx812") 14 | uv1_scale = Vector3(0.125, 0.125, 0.125) 15 | uv1_triplanar = true 16 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Color.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Color.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Color.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dv11e5vjgmjl6" 6 | path.s3tc="res://.godot/imported/Asphalt010_2K-JPG_Color.jpg-b750f9cd4b9f6447e15e12564d429a81.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Asphalt010_2K-JPG_Color.jpg-b750f9cd4b9f6447e15e12564d429a81.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Color.jpg" 16 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_Color.jpg-b750f9cd4b9f6447e15e12564d429a81.s3tc.ctex", "res://.godot/imported/Asphalt010_2K-JPG_Color.jpg-b750f9cd4b9f6447e15e12564d429a81.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Displacement.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Displacement.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Displacement.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c2lmoussricp2" 6 | path.s3tc="res://.godot/imported/Asphalt010_2K-JPG_Displacement.jpg-4824fc52730c7bf0ee2051b5361e2dd0.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Asphalt010_2K-JPG_Displacement.jpg-4824fc52730c7bf0ee2051b5361e2dd0.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Displacement.jpg" 16 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_Displacement.jpg-4824fc52730c7bf0ee2051b5361e2dd0.s3tc.ctex", "res://.godot/imported/Asphalt010_2K-JPG_Displacement.jpg-4824fc52730c7bf0ee2051b5361e2dd0.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://vjh43e67xd15" 6 | path.s3tc="res://.godot/imported/Asphalt010_2K-JPG_NormalDX.jpg-686d96df6bae4676b8f320f15c3b1360.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Asphalt010_2K-JPG_NormalDX.jpg-686d96df6bae4676b8f320f15c3b1360.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg" 16 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_NormalDX.jpg-686d96df6bae4676b8f320f15c3b1360.s3tc.ctex", "res://.godot/imported/Asphalt010_2K-JPG_NormalDX.jpg-686d96df6bae4676b8f320f15c3b1360.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=1 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=1 29 | roughness/src_normal="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalDX.jpg" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalGL.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalGL.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalGL.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dtijcaphfssft" 6 | path="res://.godot/imported/Asphalt010_2K-JPG_NormalGL.jpg-2e128fff716c10a55ae2410f5331d7ca.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_NormalGL.jpg" 14 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_NormalGL.jpg-2e128fff716c10a55ae2410f5331d7ca.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Opacity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Opacity.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Opacity.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://crq5eubhiltkj" 6 | path="res://.godot/imported/Asphalt010_2K-JPG_Opacity.jpg-bc09b48d361eb462567adde857ca0216.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Opacity.jpg" 14 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_Opacity.jpg-bc09b48d361eb462567adde857ca0216.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Roughness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Roughness.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Roughness.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bgt4n4pn63np7" 6 | path.s3tc="res://.godot/imported/Asphalt010_2K-JPG_Roughness.jpg-3dded605ca74d86567510dec219498b6.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Asphalt010_2K-JPG_Roughness.jpg-3dded605ca74d86567510dec219498b6.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/asphalt010/Asphalt010_2K-JPG_Roughness.jpg" 16 | dest_files=["res://.godot/imported/Asphalt010_2K-JPG_Roughness.jpg-3dded605ca74d86567510dec219498b6.s3tc.ctex", "res://.godot/imported/Asphalt010_2K-JPG_Roughness.jpg-3dded605ca74d86567510dec219498b6.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=5 format=3 uid="uid://fw3dc6yci24n"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dx1tsgvprh32b" path="res://assets/ambientcg/wood026/Wood026_2K-PNG_Color.png" id="1_pvm8u"] 4 | [ext_resource type="Texture2D" uid="uid://dvja6xjn0kmb7" path="res://assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png" id="2_vovhs"] 5 | [ext_resource type="Texture2D" uid="uid://blpgniahalmfb" path="res://assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png" id="3_gau4u"] 6 | [ext_resource type="Texture2D" uid="uid://cxt64ybuxcu34" path="res://assets/ambientcg/wood026/Wood026_2K-PNG_Roughness.png" id="4_rob52"] 7 | 8 | [resource] 9 | albedo_texture = ExtResource("1_pvm8u") 10 | roughness_texture = ExtResource("4_rob52") 11 | normal_enabled = true 12 | normal_texture = ExtResource("3_gau4u") 13 | heightmap_texture = ExtResource("2_vovhs") 14 | uv1_scale = Vector3(0.125, 0.125, 0.125) 15 | uv1_triplanar = true 16 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://decohjkctsvm0" 6 | path="res://.godot/imported/Wood026.png-a60afca5efd253fcfde7468e040193a9.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/ambientcg/wood026/Wood026.png" 14 | dest_files=["res://.godot/imported/Wood026.png-a60afca5efd253fcfde7468e040193a9.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood026/Wood026_2K-PNG_Color.png -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Color.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dx1tsgvprh32b" 6 | path.s3tc="res://.godot/imported/Wood026_2K-PNG_Color.png-4ff8db3f29f8453fe854a6710afed103.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood026_2K-PNG_Color.png-4ff8db3f29f8453fe854a6710afed103.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood026/Wood026_2K-PNG_Color.png" 16 | dest_files=["res://.godot/imported/Wood026_2K-PNG_Color.png-4ff8db3f29f8453fe854a6710afed103.s3tc.ctex", "res://.godot/imported/Wood026_2K-PNG_Color.png-4ff8db3f29f8453fe854a6710afed103.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dvja6xjn0kmb7" 6 | path.s3tc="res://.godot/imported/Wood026_2K-PNG_Displacement.png-3b5255dea2879c6d7b2727ff9346c536.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood026_2K-PNG_Displacement.png-3b5255dea2879c6d7b2727ff9346c536.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png" 16 | dest_files=["res://.godot/imported/Wood026_2K-PNG_Displacement.png-3b5255dea2879c6d7b2727ff9346c536.s3tc.ctex", "res://.godot/imported/Wood026_2K-PNG_Displacement.png-3b5255dea2879c6d7b2727ff9346c536.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://blpgniahalmfb" 6 | path.s3tc="res://.godot/imported/Wood026_2K-PNG_NormalGL.png-9f5d3014bb95d1c9e4b0a2f5081e679a.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood026_2K-PNG_NormalGL.png-9f5d3014bb95d1c9e4b0a2f5081e679a.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png" 16 | dest_files=["res://.godot/imported/Wood026_2K-PNG_NormalGL.png-9f5d3014bb95d1c9e4b0a2f5081e679a.s3tc.ctex", "res://.godot/imported/Wood026_2K-PNG_NormalGL.png-9f5d3014bb95d1c9e4b0a2f5081e679a.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=1 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=1 29 | roughness/src_normal="res://assets/ambientcg/wood026/Wood026_2K-PNG_NormalGL.png" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Roughness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood026/Wood026_2K-PNG_Roughness.png -------------------------------------------------------------------------------- /project/assets/ambientcg/wood026/Wood026_2K-PNG_Roughness.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cxt64ybuxcu34" 6 | path.s3tc="res://.godot/imported/Wood026_2K-PNG_Roughness.png-ced86a8a41d362436a2956dea05bec19.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood026_2K-PNG_Roughness.png-ced86a8a41d362436a2956dea05bec19.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood026/Wood026_2K-PNG_Roughness.png" 16 | dest_files=["res://.godot/imported/Wood026_2K-PNG_Roughness.png-ced86a8a41d362436a2956dea05bec19.s3tc.ctex", "res://.godot/imported/Wood026_2K-PNG_Roughness.png-ced86a8a41d362436a2956dea05bec19.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=5 format=3 uid="uid://bu1juf7h2qb8m"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://df83dpsuk3nfa" path="res://assets/ambientcg/wood051/Wood051_2K-JPG_Color.jpg" id="1_ptwql"] 4 | [ext_resource type="Texture2D" uid="uid://dvja6xjn0kmb7" path="res://assets/ambientcg/wood026/Wood026_2K-PNG_Displacement.png" id="2_kbay2"] 5 | [ext_resource type="Texture2D" uid="uid://c6wjw5gd3iuun" path="res://assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg" id="3_5xaap"] 6 | [ext_resource type="Texture2D" uid="uid://cxdx0j5nwqpeg" path="res://assets/ambientcg/wood051/Wood051_2K-JPG_Roughness.jpg" id="4_4wc6g"] 7 | 8 | [resource] 9 | albedo_texture = ExtResource("1_ptwql") 10 | roughness_texture = ExtResource("4_4wc6g") 11 | normal_enabled = true 12 | normal_texture = ExtResource("3_5xaap") 13 | heightmap_texture = ExtResource("2_kbay2") 14 | uv1_scale = Vector3(0.125, 0.125, 0.125) 15 | uv1_triplanar = true 16 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Color.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood051/Wood051_2K-JPG_Color.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Color.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://df83dpsuk3nfa" 6 | path.s3tc="res://.godot/imported/Wood051_2K-JPG_Color.jpg-32720c5ad2580844c486a841a96f9873.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood051_2K-JPG_Color.jpg-32720c5ad2580844c486a841a96f9873.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood051/Wood051_2K-JPG_Color.jpg" 16 | dest_files=["res://.godot/imported/Wood051_2K-JPG_Color.jpg-32720c5ad2580844c486a841a96f9873.s3tc.ctex", "res://.godot/imported/Wood051_2K-JPG_Color.jpg-32720c5ad2580844c486a841a96f9873.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Displacement.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood051/Wood051_2K-JPG_Displacement.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Displacement.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cxb0wdwhwl6nl" 6 | path="res://.godot/imported/Wood051_2K-JPG_Displacement.jpg-06ac057fa5b08eeff88c7839fe84e29d.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/ambientcg/wood051/Wood051_2K-JPG_Displacement.jpg" 14 | dest_files=["res://.godot/imported/Wood051_2K-JPG_Displacement.jpg-06ac057fa5b08eeff88c7839fe84e29d.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c6wjw5gd3iuun" 6 | path.s3tc="res://.godot/imported/Wood051_2K-JPG_NormalGL.jpg-543b71aba7a25106810637f294700141.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood051_2K-JPG_NormalGL.jpg-543b71aba7a25106810637f294700141.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg" 16 | dest_files=["res://.godot/imported/Wood051_2K-JPG_NormalGL.jpg-543b71aba7a25106810637f294700141.s3tc.ctex", "res://.godot/imported/Wood051_2K-JPG_NormalGL.jpg-543b71aba7a25106810637f294700141.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=1 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=1 29 | roughness/src_normal="res://assets/ambientcg/wood051/Wood051_2K-JPG_NormalGL.jpg" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Roughness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/ambientcg/wood051/Wood051_2K-JPG_Roughness.jpg -------------------------------------------------------------------------------- /project/assets/ambientcg/wood051/Wood051_2K-JPG_Roughness.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cxdx0j5nwqpeg" 6 | path.s3tc="res://.godot/imported/Wood051_2K-JPG_Roughness.jpg-9df1c8bf3b98bc816e134103d0eb16bd.s3tc.ctex" 7 | path.etc2="res://.godot/imported/Wood051_2K-JPG_Roughness.jpg-9df1c8bf3b98bc816e134103d0eb16bd.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/ambientcg/wood051/Wood051_2K-JPG_Roughness.jpg" 16 | dest_files=["res://.godot/imported/Wood051_2K-JPG_Roughness.jpg-9df1c8bf3b98bc816e134103d0eb16bd.s3tc.ctex", "res://.godot/imported/Wood051_2K-JPG_Roughness.jpg-9df1c8bf3b98bc816e134103d0eb16bd.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/grid_overlay.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://dv1jtj3wvh678"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_q2w33"] 4 | interpolation_mode = 1 5 | colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1) 6 | 7 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_dvp85"] 8 | gradient = SubResource("Gradient_q2w33") 9 | fill = 2 10 | 11 | [resource] 12 | transparency = 1 13 | albedo_texture = SubResource("GradientTexture2D_dvp85") 14 | uv1_triplanar = true 15 | -------------------------------------------------------------------------------- /project/assets/icon/Add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Add.png -------------------------------------------------------------------------------- /project/assets/icon/Add.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d1o5ho1s6e3vr" 6 | path="res://.godot/imported/Add.png-af0cafde57924bc773996ac3b53ddf0f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Add.png" 14 | dest_files=["res://.godot/imported/Add.png-af0cafde57924bc773996ac3b53ddf0f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/Close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Close.png -------------------------------------------------------------------------------- /project/assets/icon/Close.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bmg26rkxtqtso" 6 | path="res://.godot/imported/Close.png-b828e0b9142114623c8f4c534db3edc8.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Close.png" 14 | dest_files=["res://.godot/imported/Close.png-b828e0b9142114623c8f4c534db3edc8.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/Label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Label.png -------------------------------------------------------------------------------- /project/assets/icon/Label.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bbbsalgb2gtfs" 6 | path="res://.godot/imported/Label.png-38b99b92dd72c67accdafdd5f8ecea07.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Label.png" 14 | dest_files=["res://.godot/imported/Label.png-38b99b92dd72c67accdafdd5f8ecea07.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/Left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Left.png -------------------------------------------------------------------------------- /project/assets/icon/Left.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://berrl0h2qkkl1" 6 | path="res://.godot/imported/Left.png-46dabf03524d609c8a511b4f43061e96.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Left.png" 14 | dest_files=["res://.godot/imported/Left.png-46dabf03524d609c8a511b4f43061e96.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/Load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Load.png -------------------------------------------------------------------------------- /project/assets/icon/Load.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://58ird2h11kc6" 6 | path="res://.godot/imported/Load.png-6afa4c5542a834e12996094fb9055947.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Load.png" 14 | dest_files=["res://.godot/imported/Load.png-6afa4c5542a834e12996094fb9055947.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/Right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/Right.png -------------------------------------------------------------------------------- /project/assets/icon/Right.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cy2a8jk77wcps" 6 | path="res://.godot/imported/Right.png-fe50ffa1be3c6222d6e03af28e96f644.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/Right.png" 14 | dest_files=["res://.godot/imported/Right.png-fe50ffa1be3c6222d6e03af28e96f644.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/TripleBar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/TripleBar.png -------------------------------------------------------------------------------- /project/assets/icon/TripleBar.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bnktl64c363mh" 6 | path="res://.godot/imported/TripleBar.png-067a757462d7bc568a8a240fe6277ee9.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/TripleBar.png" 14 | dest_files=["res://.godot/imported/TripleBar.png-067a757462d7bc568a8a240fe6277ee9.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/icon/m8_emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/icon/m8_emoji.png -------------------------------------------------------------------------------- /project/assets/icon/m8_emoji.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://x366o15t1j3g" 6 | path="res://.godot/imported/m8_emoji.png-4d92e1d736f608a06cdd3cece5ba422f.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/icon/m8_emoji.png" 14 | dest_files=["res://.godot/imported/m8_emoji.png-4d92e1d736f608a06cdd3cece5ba422f.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/m8_fonts/10_10.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_fonts/10_10.bmp -------------------------------------------------------------------------------- /project/assets/m8_fonts/10_10.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | uid="uid://cqnshs33imc1a" 6 | path="res://.godot/imported/10_10.bmp-6c4a664bcfde819a298a1909180b1851.res" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/m8_fonts/10_10.bmp" 11 | dest_files=["res://.godot/imported/10_10.bmp-6c4a664bcfde819a298a1909180b1851.res"] 12 | 13 | [params] 14 | 15 | create_from=0 16 | threshold=0.5 17 | -------------------------------------------------------------------------------- /project/assets/m8_fonts/12_12.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_fonts/12_12.bmp -------------------------------------------------------------------------------- /project/assets/m8_fonts/12_12.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | uid="uid://bmqw2oskov6l7" 6 | path="res://.godot/imported/12_12.bmp-7bb17f5a23c01563f0a34bbe97d4247a.res" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/m8_fonts/12_12.bmp" 11 | dest_files=["res://.godot/imported/12_12.bmp-7bb17f5a23c01563f0a34bbe97d4247a.res"] 12 | 13 | [params] 14 | 15 | create_from=0 16 | threshold=0.5 17 | -------------------------------------------------------------------------------- /project/assets/m8_fonts/5_7.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_fonts/5_7.bmp -------------------------------------------------------------------------------- /project/assets/m8_fonts/5_7.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | uid="uid://clfoot57bhfj0" 6 | path="res://.godot/imported/5_7.bmp-a72d4d5021d2696747dd22c20b0200c2.res" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/m8_fonts/5_7.bmp" 11 | dest_files=["res://.godot/imported/5_7.bmp-a72d4d5021d2696747dd22c20b0200c2.res"] 12 | 13 | [params] 14 | 15 | create_from=0 16 | threshold=0.5 17 | -------------------------------------------------------------------------------- /project/assets/m8_fonts/8_9.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_fonts/8_9.bmp -------------------------------------------------------------------------------- /project/assets/m8_fonts/8_9.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | uid="uid://botpclf0ncph7" 6 | path="res://.godot/imported/8_9.bmp-1f19b40b2e90fee2a8557d5645416235.res" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/m8_fonts/8_9.bmp" 11 | dest_files=["res://.godot/imported/8_9.bmp-1f19b40b2e90fee2a8557d5645416235.res"] 12 | 13 | [params] 14 | 15 | create_from=0 16 | threshold=0.5 17 | -------------------------------------------------------------------------------- /project/assets/m8_fonts/9_9.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_fonts/9_9.bmp -------------------------------------------------------------------------------- /project/assets/m8_fonts/9_9.bmp.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="bitmap" 4 | type="BitMap" 5 | uid="uid://uockd5u0fxv6" 6 | path="res://.godot/imported/9_9.bmp-96143e2b050ac50cbff70f2b6979fe02.res" 7 | 8 | [deps] 9 | 10 | source_file="res://assets/m8_fonts/9_9.bmp" 11 | dest_files=["res://.godot/imported/9_9.bmp-96143e2b050ac50cbff70f2b6979fe02.res"] 12 | 13 | [params] 14 | 15 | create_from=0 16 | threshold=0.5 17 | -------------------------------------------------------------------------------- /project/assets/m8_screen_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_screen_placeholder.png -------------------------------------------------------------------------------- /project/assets/m8_screen_placeholder.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ras5y3yqijkx" 6 | path.s3tc="res://.godot/imported/m8_screen_placeholder.png-7c950a0db3cda8d86a1534f8a4c4e3b4.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_screen_placeholder.png-7c950a0db3cda8d86a1534f8a4c4e3b4.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/m8_screen_placeholder.png" 16 | dest_files=["res://.godot/imported/m8_screen_placeholder.png-7c950a0db3cda8d86a1534f8a4c4e3b4.s3tc.ctex", "res://.godot/imported/m8_screen_placeholder.png-7c950a0db3cda8d86a1534f8a4c4e3b4.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/license.txt: -------------------------------------------------------------------------------- 1 | Model Information: 2 | * title: Dirtywave M8 Tracker 3 | * source: https://sketchfab.com/3d-models/dirtywave-m8-tracker-05ba530f902e4474b0e01ae2750eec3c 4 | * author: David Junghanns (https://sketchfab.com/davidju) 5 | 6 | Model License: 7 | * license type: SKETCHFAB Standard (https://sketchfab.com/licenses) 8 | * requirements: Under basic restrictions, use worldwide, on all types of media, commercially or not, and in all types of derivative works 9 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model.blend -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model.glb -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model.glb.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="scene" 4 | importer_version=1 5 | type="PackedScene" 6 | uid="uid://cbuqy2oe67w1h" 7 | path="res://.godot/imported/m8_model.glb-e80df07ceba913815e0304a57ce90676.scn" 8 | 9 | [deps] 10 | 11 | source_file="res://assets/m8_tracker/m8_model.glb" 12 | dest_files=["res://.godot/imported/m8_model.glb-e80df07ceba913815e0304a57ce90676.scn"] 13 | 14 | [params] 15 | 16 | nodes/root_type="StaticBody3D" 17 | nodes/root_name="" 18 | nodes/apply_root_scale=true 19 | nodes/root_scale=1.0 20 | nodes/import_as_skeleton_bones=false 21 | nodes/use_node_type_suffixes=true 22 | meshes/ensure_tangents=true 23 | meshes/generate_lods=true 24 | meshes/create_shadow_meshes=true 25 | meshes/light_baking=2 26 | meshes/lightmap_texel_size=0.2 27 | meshes/force_disable_compression=false 28 | skins/use_named_skins=true 29 | animation/import=true 30 | animation/fps=30 31 | animation/trimming=false 32 | animation/remove_immutable_tracks=true 33 | animation/import_rest_as_RESET=false 34 | import_script/path="" 35 | _subresources={} 36 | gltf/naming_version=1 37 | gltf/embedded_image_handling=1 38 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model.glb.unwrap_cache: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model.glb.unwrap_cache -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model_1.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://010cmx7j748e" 6 | path.s3tc="res://.godot/imported/m8_model_1.png-35b9ab7fb5c1bd83af4d66285cb989d1.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_model_1.png-35b9ab7fb5c1bd83af4d66285cb989d1.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "d9f136b14228e019987af4f524f47e77" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/m8_model_1.png" 19 | dest_files=["res://.godot/imported/m8_model_1.png-35b9ab7fb5c1bd83af4d66285cb989d1.s3tc.ctex", "res://.godot/imported/m8_model_1.png-35b9ab7fb5c1bd83af4d66285cb989d1.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_labels_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model_labels_02.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_labels_02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dhjv453vn7f1a" 6 | path.s3tc="res://.godot/imported/m8_model_labels_02.png-d71edc100d87e0eb138e0a14ed0194b7.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_model_labels_02.png-d71edc100d87e0eb138e0a14ed0194b7.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "54b13dbdd254d587cb02e9b90b25a290" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/m8_model_labels_02.png" 19 | dest_files=["res://.godot/imported/m8_model_labels_02.png-d71edc100d87e0eb138e0a14ed0194b7.s3tc.ctex", "res://.godot/imported/m8_model_labels_02.png-d71edc100d87e0eb138e0a14ed0194b7.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_m8_screen_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model_m8_screen_placeholder.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_m8_screen_placeholder.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d2ttyhyyesw0k" 6 | path.s3tc="res://.godot/imported/m8_model_m8_screen_placeholder.png-260d9834e2e7c029c5e2889aa515b960.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_model_m8_screen_placeholder.png-260d9834e2e7c029c5e2889aa515b960.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "f46d0ed2f9eb531324737617e16d08e7" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/m8_model_m8_screen_placeholder.png" 19 | dest_files=["res://.godot/imported/m8_model_m8_screen_placeholder.png-260d9834e2e7c029c5e2889aa515b960.s3tc.ctex", "res://.godot/imported/m8_model_m8_screen_placeholder.png-260d9834e2e7c029c5e2889aa515b960.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_screen_placeholder_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model_screen_placeholder_01.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_screen_placeholder_01.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bl3v8loshs2pg" 6 | path.s3tc="res://.godot/imported/m8_model_screen_placeholder_01.png-4383acd57ee72fe7522f78e1ffe1296f.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_model_screen_placeholder_01.png-4383acd57ee72fe7522f78e1ffe1296f.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "f46d0ed2f9eb531324737617e16d08e7" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/m8_model_screen_placeholder_01.png" 19 | dest_files=["res://.godot/imported/m8_model_screen_placeholder_01.png-4383acd57ee72fe7522f78e1ffe1296f.s3tc.ctex", "res://.godot/imported/m8_model_screen_placeholder_01.png-4383acd57ee72fe7522f78e1ffe1296f.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_screen_placeholder_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/m8_model_screen_placeholder_02.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/m8_model_screen_placeholder_02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://ctmenab88t3xs" 6 | path.s3tc="res://.godot/imported/m8_model_screen_placeholder_02.png-6966e3e6690d4b24e21ab8174f663b32.s3tc.ctex" 7 | path.etc2="res://.godot/imported/m8_model_screen_placeholder_02.png-6966e3e6690d4b24e21ab8174f663b32.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "d9f136b14228e019987af4f524f47e77" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/m8_model_screen_placeholder_02.png" 19 | dest_files=["res://.godot/imported/m8_model_screen_placeholder_02.png-6966e3e6690d4b24e21ab8174f663b32.s3tc.ctex", "res://.godot/imported/m8_model_screen_placeholder_02.png-6966e3e6690d4b24e21ab8174f663b32.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/scene.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/scene.bin -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/labels_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/textures/labels_01.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/labels_01.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://dkluilk4o0r7l" 6 | path.s3tc="res://.godot/imported/labels_01.png-aa1f3ebabd09bd0ed8df542113269af9.s3tc.ctex" 7 | path.etc2="res://.godot/imported/labels_01.png-aa1f3ebabd09bd0ed8df542113269af9.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/m8_tracker/textures/labels_01.png" 16 | dest_files=["res://.godot/imported/labels_01.png-aa1f3ebabd09bd0ed8df542113269af9.s3tc.ctex", "res://.godot/imported/labels_01.png-aa1f3ebabd09bd0ed8df542113269af9.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/labels_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/textures/labels_02.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/labels_02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cm84lsw54cq8t" 6 | path.s3tc="res://.godot/imported/labels_02.png-505a24e7b32a472edbd39fde2362f91d.s3tc.ctex" 7 | path.etc2="res://.godot/imported/labels_02.png-505a24e7b32a472edbd39fde2362f91d.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "1b4dcf55b851208e43ed2dbd8d2afe24" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/textures/labels_02.png" 19 | dest_files=["res://.godot/imported/labels_02.png-505a24e7b32a472edbd39fde2362f91d.s3tc.ctex", "res://.godot/imported/labels_02.png-505a24e7b32a472edbd39fde2362f91d.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/screen_placeholder_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/textures/screen_placeholder_01.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/screen_placeholder_01.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cjl3jjrkkbnwm" 6 | path.s3tc="res://.godot/imported/screen_placeholder_01.png-5cd303d0efc059cfa6c6f4ef3fa5867e.s3tc.ctex" 7 | path.etc2="res://.godot/imported/screen_placeholder_01.png-5cd303d0efc059cfa6c6f4ef3fa5867e.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "f46d0ed2f9eb531324737617e16d08e7" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/textures/screen_placeholder_01.png" 19 | dest_files=["res://.godot/imported/screen_placeholder_01.png-5cd303d0efc059cfa6c6f4ef3fa5867e.s3tc.ctex", "res://.godot/imported/screen_placeholder_01.png-5cd303d0efc059cfa6c6f4ef3fa5867e.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/screen_placeholder_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/m8_tracker/textures/screen_placeholder_02.png -------------------------------------------------------------------------------- /project/assets/m8_tracker/textures/screen_placeholder_02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://buirq0yn6xw8c" 6 | path.s3tc="res://.godot/imported/screen_placeholder_02.png-5e03e5b8c421962efafe17732d915604.s3tc.ctex" 7 | path.etc2="res://.godot/imported/screen_placeholder_02.png-5e03e5b8c421962efafe17732d915604.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | generator_parameters={ 13 | "md5": "d9f136b14228e019987af4f524f47e77" 14 | } 15 | 16 | [deps] 17 | 18 | source_file="res://assets/m8_tracker/textures/screen_placeholder_02.png" 19 | dest_files=["res://.godot/imported/screen_placeholder_02.png-5e03e5b8c421962efafe17732d915604.s3tc.ctex", "res://.godot/imported/screen_placeholder_02.png-5e03e5b8c421962efafe17732d915604.etc2.ctex"] 20 | 21 | [params] 22 | 23 | compress/mode=2 24 | compress/high_quality=false 25 | compress/lossy_quality=0.7 26 | compress/hdr_compression=1 27 | compress/normal_map=0 28 | compress/channel_pack=0 29 | mipmaps/generate=true 30 | mipmaps/limit=-1 31 | roughness/mode=0 32 | roughness/src_normal="" 33 | process/fix_alpha_border=true 34 | process/premult_alpha=false 35 | process/normal_map_invert_y=false 36 | process/hdr_as_srgb=false 37 | process/hdr_clamp_exposure=false 38 | process/size_limit=0 39 | detect_3d/compress_to=0 40 | -------------------------------------------------------------------------------- /project/assets/noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/noise.png -------------------------------------------------------------------------------- /project/assets/noise.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://7y0rs0v6d4nk" 6 | path="res://.godot/imported/noise.png-c29f7e52963a096aeaf0c1efd1a79456.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | 11 | [deps] 12 | 13 | source_file="res://assets/noise.png" 14 | dest_files=["res://.godot/imported/noise.png-c29f7e52963a096aeaf0c1efd1a79456.ctex"] 15 | 16 | [params] 17 | 18 | compress/mode=0 19 | compress/high_quality=false 20 | compress/lossy_quality=0.7 21 | compress/hdr_compression=1 22 | compress/normal_map=0 23 | compress/channel_pack=0 24 | mipmaps/generate=false 25 | mipmaps/limit=-1 26 | roughness/mode=0 27 | roughness/src_normal="" 28 | process/fix_alpha_border=true 29 | process/premult_alpha=false 30 | process/normal_map_invert_y=false 31 | process/hdr_as_srgb=false 32 | process/hdr_clamp_exposure=false 33 | process/size_limit=0 34 | detect_3d/compress_to=1 35 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/green-eda.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://cvxgd6fhsw2a5"] 2 | 3 | [resource] 4 | resource_name = "green-eda" 5 | albedo_color = Color(0.379992, 0.716814, 0.336205, 1) 6 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/green_dram_kuki.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://nqslr6d6ha2f"] 2 | 3 | [resource] 4 | resource_name = "green_dram_kuki" 5 | albedo_color = Color(0.389381, 0.778761, 0.416947, 1) 6 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/license.txt: -------------------------------------------------------------------------------- 1 | Model Information: 2 | * title: Succulent plants 3 | * source: https://sketchfab.com/3d-models/succulent-plants-ea9a2df2a598410f9f63ba9380795f92 4 | * author: uniko (https://sketchfab.com/uniko) 5 | 6 | Model License: 7 | * license type: CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) 8 | * requirements: Author must be credited. Commercial use is allowed. 9 | 10 | If you use this 3D model in your project be sure to copy paste this credit wherever you share it: 11 | This work is based on "Succulent plants" (https://sketchfab.com/3d-models/succulent-plants-ea9a2df2a598410f9f63ba9380795f92) by uniko (https://sketchfab.com/uniko) licensed under CC-BY-4.0 (http://creativecommons.org/licenses/by/4.0/) -------------------------------------------------------------------------------- /project/assets/succulent_plants/material.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://phjkra7mlyxk"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_gj5lc"] 4 | interpolation_color_space = 1 5 | offsets = PackedFloat32Array(0.141304, 1) 6 | 7 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_lis1f"] 8 | gradient = SubResource("Gradient_gj5lc") 9 | fill_from = Vector2(0, 1) 10 | fill_to = Vector2(0, 0) 11 | 12 | [resource] 13 | resource_name = "material" 14 | albedo_texture = SubResource("GradientTexture2D_lis1f") 15 | subsurf_scatter_enabled = true 16 | subsurf_scatter_strength = 0.1 17 | uv1_scale = Vector3(1, 0.5, -0.01) 18 | uv1_offset = Vector3(0, 0, -0.505) 19 | uv1_triplanar = true 20 | uv1_world_triplanar = true 21 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/succulent_plants/scene.bin -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene.gltf.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="scene" 4 | importer_version=1 5 | type="PackedScene" 6 | uid="uid://d2812ej708k17" 7 | path="res://.godot/imported/scene.gltf-1c5603917938f1e11041ec6a17213767.scn" 8 | 9 | [deps] 10 | 11 | source_file="res://assets/succulent_plants/scene.gltf" 12 | dest_files=["res://.godot/imported/scene.gltf-1c5603917938f1e11041ec6a17213767.scn"] 13 | 14 | [params] 15 | 16 | nodes/root_type="" 17 | nodes/root_name="" 18 | nodes/apply_root_scale=true 19 | nodes/root_scale=1.0 20 | nodes/import_as_skeleton_bones=false 21 | nodes/use_node_type_suffixes=true 22 | meshes/ensure_tangents=true 23 | meshes/generate_lods=true 24 | meshes/create_shadow_meshes=true 25 | meshes/light_baking=0 26 | meshes/lightmap_texel_size=0.2 27 | meshes/force_disable_compression=false 28 | skins/use_named_skins=true 29 | animation/import=false 30 | animation/fps=30 31 | animation/trimming=false 32 | animation/remove_immutable_tracks=true 33 | animation/import_rest_as_RESET=false 34 | import_script/path="" 35 | _subresources={ 36 | "materials": { 37 | "green-eda": { 38 | "use_external/enabled": true, 39 | "use_external/path": "res://assets/succulent_plants/green-eda.tres" 40 | }, 41 | "green_dram_kuki": { 42 | "use_external/enabled": true, 43 | "use_external/path": "res://assets/succulent_plants/green_dram_kuki.tres" 44 | }, 45 | "material": { 46 | "use_external/enabled": true, 47 | "use_external/path": "res://assets/succulent_plants/material.tres" 48 | }, 49 | "syna": { 50 | "use_external/enabled": true, 51 | "use_external/path": "res://assets/succulent_plants/syna.tres" 52 | }, 53 | "taniku01-tex": { 54 | "use_external/enabled": true, 55 | "use_external/path": "res://assets/succulent_plants/taniku01-tex.tres" 56 | }, 57 | "taniku01-tex.005": { 58 | "use_external/enabled": true, 59 | "use_external/path": "res://assets/succulent_plants/taniku01-tex.005.tres" 60 | }, 61 | "taniku01-tex.007": { 62 | "use_external/enabled": true, 63 | "use_external/path": "res://assets/succulent_plants/taniku01-tex.007.tres" 64 | } 65 | }, 66 | "nodes": { 67 | "PATH:Sketchfab_model/Root/Pot001/Pot001_0": { 68 | "import/skip_import": true 69 | }, 70 | "PATH:Sketchfab_model/Root/Pot001/Pot001_1": { 71 | "import/skip_import": true 72 | }, 73 | "PATH:Sketchfab_model/Root/Pot003/Pot003_0": { 74 | "import/skip_import": true 75 | }, 76 | "PATH:Sketchfab_model/Root/Pot003/Pot003_1": { 77 | "import/skip_import": true 78 | }, 79 | "PATH:Sketchfab_model/Root/Pot004/Pot004_0": { 80 | "import/skip_import": true 81 | }, 82 | "PATH:Sketchfab_model/Root/Pot004/Pot004_1": { 83 | "import/skip_import": true 84 | }, 85 | "PATH:Sketchfab_model/Root/Pot005/Pot005_0": { 86 | "import/skip_import": true 87 | }, 88 | "PATH:Sketchfab_model/Root/Pot005/Pot005_1": { 89 | "import/skip_import": true 90 | }, 91 | "PATH:Sketchfab_model/Root/Pot006/Pot006_0": { 92 | "import/skip_import": true 93 | }, 94 | "PATH:Sketchfab_model/Root/Pot006/Pot006_1": { 95 | "import/skip_import": true 96 | }, 97 | "PATH:Sketchfab_model/Root/Pot007/Pot007_0": { 98 | "import/skip_import": true 99 | }, 100 | "PATH:Sketchfab_model/Root/Pot007/Pot007_1": { 101 | "import/skip_import": true 102 | }, 103 | "PATH:Sketchfab_model/Root/Pot008/Pot008_0": { 104 | "import/skip_import": true 105 | }, 106 | "PATH:Sketchfab_model/Root/Pot008/Pot008_1": { 107 | "import/skip_import": true 108 | }, 109 | "PATH:Sketchfab_model/Root/Pot009/Pot009_0": { 110 | "import/skip_import": true 111 | }, 112 | "PATH:Sketchfab_model/Root/Pot009/Pot009_1": { 113 | "import/skip_import": true 114 | }, 115 | "PATH:Sketchfab_model/Root/Pot010/Pot010_0": { 116 | "import/skip_import": true 117 | }, 118 | "PATH:Sketchfab_model/Root/Pot010/Pot010_1": { 119 | "import/skip_import": true 120 | }, 121 | "PATH:Sketchfab_model/Root/������": { 122 | "import/skip_import": true 123 | } 124 | } 125 | } 126 | gltf/naming_version=1 127 | gltf/embedded_image_handling=1 128 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/succulent_plants/scene_0.png -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene_0.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bclhtncu85c8w" 6 | path="res://.godot/imported/scene_0.png-5ef371d1f2d600959c50d9efbc4e6421.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | generator_parameters={ 11 | "md5": "408d352dbe7414d128f98c9840f400d8" 12 | } 13 | 14 | [deps] 15 | 16 | source_file="res://assets/succulent_plants/scene_0.png" 17 | dest_files=["res://.godot/imported/scene_0.png-5ef371d1f2d600959c50d9efbc4e6421.ctex"] 18 | 19 | [params] 20 | 21 | compress/mode=0 22 | compress/high_quality=false 23 | compress/lossy_quality=0.7 24 | compress/hdr_compression=1 25 | compress/normal_map=0 26 | compress/channel_pack=0 27 | mipmaps/generate=true 28 | mipmaps/limit=-1 29 | roughness/mode=0 30 | roughness/src_normal="" 31 | process/fix_alpha_border=true 32 | process/premult_alpha=false 33 | process/normal_map_invert_y=false 34 | process/hdr_as_srgb=false 35 | process/hdr_clamp_exposure=false 36 | process/size_limit=0 37 | detect_3d/compress_to=1 38 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/succulent_plants/scene_1.png -------------------------------------------------------------------------------- /project/assets/succulent_plants/scene_1.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bqt4no0mnj6db" 6 | path="res://.godot/imported/scene_1.png-6277dac6b27ce548d50fc314f118c0c0.ctex" 7 | metadata={ 8 | "vram_texture": false 9 | } 10 | generator_parameters={ 11 | "md5": "70a1b2a93cb48538f0d0e8daaf7aae42" 12 | } 13 | 14 | [deps] 15 | 16 | source_file="res://assets/succulent_plants/scene_1.png" 17 | dest_files=["res://.godot/imported/scene_1.png-6277dac6b27ce548d50fc314f118c0c0.ctex"] 18 | 19 | [params] 20 | 21 | compress/mode=0 22 | compress/high_quality=false 23 | compress/lossy_quality=0.7 24 | compress/hdr_compression=1 25 | compress/normal_map=0 26 | compress/channel_pack=0 27 | mipmaps/generate=true 28 | mipmaps/limit=-1 29 | roughness/mode=0 30 | roughness/src_normal="" 31 | process/fix_alpha_border=true 32 | process/premult_alpha=false 33 | process/normal_map_invert_y=false 34 | process/hdr_as_srgb=false 35 | process/hdr_clamp_exposure=false 36 | process/size_limit=0 37 | detect_3d/compress_to=1 38 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/syna.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://d2oyaa5lu3per"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_bj3gf"] 4 | interpolation_color_space = 1 5 | offsets = PackedFloat32Array(0, 0.451449, 0.535507, 0.981884, 1) 6 | colors = PackedColorArray(0.265118, 0.265118, 0.265118, 1, 1, 1, 1, 1, 0.951904, 0.951904, 0.951904, 1, 0.219715, 0.219715, 0.219715, 1, 0.19, 0.19, 0.19, 1) 7 | 8 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_s6hft"] 9 | gradient = SubResource("Gradient_bj3gf") 10 | fill = 1 11 | fill_from = Vector2(0.5, 0.5) 12 | metadata/_snap_enabled = true 13 | 14 | [resource] 15 | resource_name = "syna" 16 | albedo_color = Color(0.31, 0.25141, 0.1798, 1) 17 | albedo_texture = SubResource("GradientTexture2D_s6hft") 18 | uv1_scale = Vector3(1.765, 1.99, 1) 19 | uv1_offset = Vector3(0.505, 0.505, 0) 20 | uv1_triplanar = true 21 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/taniku01-tex.005.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://1dv2wtsflstw"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://c3tgp2f7xe2td" path="res://assets/succulent_plants/textures/taniku01-tex.005_baseColor.png" id="1_sttnd"] 4 | 5 | [resource] 6 | resource_name = "taniku01-tex.005" 7 | albedo_texture = ExtResource("1_sttnd") 8 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/taniku01-tex.007.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dkdc34hs8mjw5"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://c3tgp2f7xe2td" path="res://assets/succulent_plants/textures/taniku01-tex.005_baseColor.png" id="1_yto7u"] 4 | 5 | [resource] 6 | resource_name = "taniku01-tex.007" 7 | albedo_texture = ExtResource("1_yto7u") 8 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/taniku01-tex.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://veb2g6vptu67"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://sw144ksus5yx" path="res://assets/succulent_plants/textures/taniku01-tex_baseColor.png" id="1_73kmh"] 4 | 5 | [resource] 6 | resource_name = "taniku01-tex" 7 | albedo_texture = ExtResource("1_73kmh") 8 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/textures/taniku01-tex.005_baseColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/succulent_plants/textures/taniku01-tex.005_baseColor.png -------------------------------------------------------------------------------- /project/assets/succulent_plants/textures/taniku01-tex.005_baseColor.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://c3tgp2f7xe2td" 6 | path.s3tc="res://.godot/imported/taniku01-tex.005_baseColor.png-4d6f814f78281772bf74b1528266b87a.s3tc.ctex" 7 | path.etc2="res://.godot/imported/taniku01-tex.005_baseColor.png-4d6f814f78281772bf74b1528266b87a.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/succulent_plants/textures/taniku01-tex.005_baseColor.png" 16 | dest_files=["res://.godot/imported/taniku01-tex.005_baseColor.png-4d6f814f78281772bf74b1528266b87a.s3tc.ctex", "res://.godot/imported/taniku01-tex.005_baseColor.png-4d6f814f78281772bf74b1528266b87a.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/succulent_plants/textures/taniku01-tex_baseColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/succulent_plants/textures/taniku01-tex_baseColor.png -------------------------------------------------------------------------------- /project/assets/succulent_plants/textures/taniku01-tex_baseColor.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://sw144ksus5yx" 6 | path.s3tc="res://.godot/imported/taniku01-tex_baseColor.png-7671304c80a6df5944462a3a66f1da1f.s3tc.ctex" 7 | path.etc2="res://.godot/imported/taniku01-tex_baseColor.png-7671304c80a6df5944462a3a66f1da1f.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/succulent_plants/textures/taniku01-tex_baseColor.png" 16 | dest_files=["res://.godot/imported/taniku01-tex_baseColor.png-7671304c80a6df5944462a3a66f1da1f.s3tc.ctex", "res://.godot/imported/taniku01-tex_baseColor.png-7671304c80a6df5944462a3a66f1da1f.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/texture_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/texture_02.png -------------------------------------------------------------------------------- /project/assets/texture_02.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cio5q050fmvf1" 6 | path.s3tc="res://.godot/imported/texture_02.png-0cc8871ab36835d5b36c188c99b69477.s3tc.ctex" 7 | path.etc2="res://.godot/imported/texture_02.png-0cc8871ab36835d5b36c188c99b69477.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/texture_02.png" 16 | dest_files=["res://.godot/imported/texture_02.png-0cc8871ab36835d5b36c188c99b69477.s3tc.ctex", "res://.godot/imported/texture_02.png-0cc8871ab36835d5b36c188c99b69477.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/texture_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/texture_04.png -------------------------------------------------------------------------------- /project/assets/texture_04.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://cby2najbsa01x" 6 | path.s3tc="res://.godot/imported/texture_04.png-9a9368317797b106fa5a268674c2de37.s3tc.ctex" 7 | path.etc2="res://.godot/imported/texture_04.png-9a9368317797b106fa5a268674c2de37.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/texture_04.png" 16 | dest_files=["res://.godot/imported/texture_04.png-9a9368317797b106fa5a268674c2de37.s3tc.ctex", "res://.godot/imported/texture_04.png-9a9368317797b106fa5a268674c2de37.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/texture_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/texture_06.png -------------------------------------------------------------------------------- /project/assets/texture_06.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://bbeh1e40ob3nd" 6 | path.s3tc="res://.godot/imported/texture_06.png-961f8e3c140a6796031f8e8a2f5238eb.s3tc.ctex" 7 | path.etc2="res://.godot/imported/texture_06.png-961f8e3c140a6796031f8e8a2f5238eb.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/texture_06.png" 16 | dest_files=["res://.godot/imported/texture_06.png-961f8e3c140a6796031f8e8a2f5238eb.s3tc.ctex", "res://.godot/imported/texture_06.png-961f8e3c140a6796031f8e8a2f5238eb.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/assets/texture_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/project/assets/texture_07.png -------------------------------------------------------------------------------- /project/assets/texture_07.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="CompressedTexture2D" 5 | uid="uid://d01h4xbn66tpi" 6 | path.s3tc="res://.godot/imported/texture_07.png-65d7708dcf7cae789a0ea395cb7cc8ff.s3tc.ctex" 7 | path.etc2="res://.godot/imported/texture_07.png-65d7708dcf7cae789a0ea395cb7cc8ff.etc2.ctex" 8 | metadata={ 9 | "imported_formats": ["s3tc_bptc", "etc2_astc"], 10 | "vram_texture": true 11 | } 12 | 13 | [deps] 14 | 15 | source_file="res://assets/texture_07.png" 16 | dest_files=["res://.godot/imported/texture_07.png-65d7708dcf7cae789a0ea395cb7cc8ff.s3tc.ctex", "res://.godot/imported/texture_07.png-65d7708dcf7cae789a0ea395cb7cc8ff.etc2.ctex"] 17 | 18 | [params] 19 | 20 | compress/mode=2 21 | compress/high_quality=false 22 | compress/lossy_quality=0.7 23 | compress/hdr_compression=1 24 | compress/normal_map=0 25 | compress/channel_pack=0 26 | mipmaps/generate=true 27 | mipmaps/limit=-1 28 | roughness/mode=0 29 | roughness/src_normal="" 30 | process/fix_alpha_border=true 31 | process/premult_alpha=false 32 | process/normal_map_invert_y=false 33 | process/hdr_as_srgb=false 34 | process/hdr_clamp_exposure=false 35 | process/size_limit=0 36 | detect_3d/compress_to=0 37 | -------------------------------------------------------------------------------- /project/config_file.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cnx3xfme1yxqn 2 | -------------------------------------------------------------------------------- /project/crt_light_3d.gd: -------------------------------------------------------------------------------- 1 | extends OmniLight3D 2 | 3 | @export var viewport_texture: ViewportTexture 4 | 5 | const COLOR_SAMPLE_POINT_1 := Vector2i(0, 0) 6 | const COLOR_SAMPLE_POINT_2 := Vector2i(19, 66) 7 | 8 | func _ready() -> void: 9 | _update() 10 | 11 | func _physics_process(_delta: float) -> void: 12 | _update() 13 | 14 | func _update() -> void: 15 | #var texture = light_projector 16 | #light_projector = null 17 | #light_projector = texture 18 | if viewport_texture != null: 19 | 20 | var image := viewport_texture.get_image() 21 | if image != null: 22 | var color_1 := image.get_pixelv(COLOR_SAMPLE_POINT_1) 23 | var color_2 := image.get_pixelv(COLOR_SAMPLE_POINT_2) 24 | light_color = color_1.lerp(color_2, 0.25).lightened(0.25) 25 | -------------------------------------------------------------------------------- /project/crt_light_3d.gd.uid: -------------------------------------------------------------------------------- 1 | uid://no24tndd3x3 2 | -------------------------------------------------------------------------------- /project/default_bus_layout.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="AudioBusLayout" load_steps=2 format=3 uid="uid://dbuaji3p66l62"] 2 | 3 | [sub_resource type="AudioEffectSpectrumAnalyzer" id="AudioEffectSpectrumAnalyzer_e5840"] 4 | resource_name = "SpectrumAnalyzer" 5 | 6 | [resource] 7 | bus/0/effect/0/effect = SubResource("AudioEffectSpectrumAnalyzer_e5840") 8 | bus/0/effect/0/enabled = false 9 | -------------------------------------------------------------------------------- /project/grass_area.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends MultiMeshInstance3D 3 | 4 | @export var extents := Vector3(10, 0, 10) 5 | @export var grass_mesh: Mesh 6 | @export var num_meshes := 1000 7 | 8 | @export var editor_generate := false: 9 | set(value): 10 | if value: 11 | generate() 12 | 13 | func _ready() -> void: 14 | if !Engine.is_editor_hint(): 15 | generate() 16 | 17 | func generate() -> void: 18 | multimesh = MultiMesh.new() 19 | 20 | multimesh.mesh = grass_mesh 21 | multimesh.transform_format = MultiMesh.TRANSFORM_3D 22 | 23 | multimesh.instance_count = num_meshes 24 | multimesh.visible_instance_count = -1 25 | 26 | for i in range(multimesh.instance_count): 27 | var xform := Transform3D() 28 | var shift := Vector3( 29 | randf_range( - extents.x, extents.x), 30 | randf_range( - extents.y, extents.y), 31 | randf_range( - extents.z, extents.z) 32 | ) 33 | 34 | shift.y -= clamp(Vector2(shift.x, shift.z).length() / max(extents.x, extents.z), 0, -1) 35 | 36 | xform = xform.translated(shift) 37 | multimesh.set_instance_transform(i, xform) 38 | -------------------------------------------------------------------------------- /project/grass_area.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cmoiixyatv1mq 2 | -------------------------------------------------------------------------------- /project/grass_area.gdshader: -------------------------------------------------------------------------------- 1 | shader_type spatial; 2 | //render_mode unshaded; 3 | //render_mode depth_draw_always; 4 | render_mode depth_draw_always; 5 | render_mode diffuse_lambert_wrap; 6 | 7 | uniform sampler2D color_ramp: hint_default_white, source_color, repeat_disable; 8 | uniform sampler2D wind_noise: hint_default_white, repeat_enable; 9 | uniform float uv_offset = 0; 10 | uniform vec2 heightmap_offset = vec2(0); 11 | uniform vec2 heightmap_scale = vec2(1); 12 | uniform float heightmap_strength = 1.0; 13 | uniform vec2 wind_dir = vec2(1.0, 1.0); 14 | uniform float wind_strength = 4.0; 15 | uniform float wind_speed = 10; 16 | 17 | uniform sampler2D heightmap: hint_default_black, repeat_enable; 18 | uniform sampler2D heightmap_mask: hint_default_white, repeat_disable; 19 | 20 | uniform sampler2D depth_texture: hint_depth_texture, repeat_enable; 21 | uniform float proximity_fade_distance = 0.0; 22 | uniform float distance_fade_min = 0.0; 23 | uniform float distance_fade_max = 0.0; 24 | 25 | void vertex() { 26 | vec2 nwind_dir = normalize(wind_dir); 27 | vec3 w_vert = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz; 28 | vec2 w_uv = (MODEL_MATRIX * vec4(UV, 0.0, 1.0)).xy; 29 | vec2 uv = (w_vert.xz + nwind_dir * TIME * wind_speed) / 50.0; 30 | float wind = textureLod(wind_noise, uv, 0.0).r - 0.5; 31 | 32 | float displacement = 0.5 - UV.y; 33 | 34 | vec2 wind_wdir = (MODEL_MATRIX * vec4(wind_dir, 0.0, 0.0)).xy; 35 | wind_wdir = normalize(wind_wdir); 36 | 37 | vec3 wind_bump = vec3(wind_wdir.x * wind * wind_strength, 1, wind_wdir.y * wind * wind_strength); 38 | wind_bump = normalize(wind_bump) * vec3(displacement, 0, displacement); 39 | 40 | //VERTEX = (MODELVIEW_MATRIX * vec4(VERTEX, 1.0)).xyz; 41 | 42 | // fixed-y billboard code 43 | MODELVIEW_MATRIX = VIEW_MATRIX * mat4(vec4(normalize(cross(vec3(0.0, 1.0, 0.0), INV_VIEW_MATRIX[2].xyz)), 0.0), vec4(0.0, 1.0, 0.0, 0.0), vec4(normalize(cross(INV_VIEW_MATRIX[0].xyz, vec3(0.0, 1.0, 0.0))), 0.0), MODEL_MATRIX[3]); 44 | 45 | VERTEX += wind_bump; 46 | vec2 heightmap_uv = ((w_vert.xz * heightmap_scale) + heightmap_offset) / 80.0; 47 | float h = texture(heightmap, heightmap_uv).r * texture(heightmap_mask, heightmap_uv).r * heightmap_strength; 48 | VERTEX.y += -0.5 + h; 49 | } 50 | 51 | void fragment() { 52 | vec3 w_uv = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz; 53 | w_uv.y = 0.5 - w_uv.y / 4.0; 54 | //ALBEDO = texture(color_ramp, vec2(w_uv.y, 0)).rgb + (texture(wind_noise, w_uv.xy * 50.0).rgb - 0.5) * 0.02; 55 | 56 | // dither distance fade code 57 | float fade_distance = length(VERTEX); 58 | const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f); 59 | float fade = clamp(smoothstep(distance_fade_min, distance_fade_max, fade_distance), 0.0, 1.0); 60 | if (fade < 0.001 || fade < fract(magic.z * fract(dot(FRAGCOORD.xy, magic.xy)))) { 61 | discard; 62 | } 63 | 64 | // proximity fade code 65 | float depth_tex = textureLod(depth_texture, SCREEN_UV, 0.0).r; 66 | vec4 world_pos = INV_PROJECTION_MATRIX * vec4(SCREEN_UV * 2.0-1.0, depth_tex, 1.0); 67 | world_pos.xyz /= world_pos.w; 68 | float prox_fade = clamp(1.0 - smoothstep(world_pos.z + proximity_fade_distance, world_pos.z, VERTEX.z), 0.0, 1.0); 69 | if (prox_fade < 0.001 || prox_fade < fract(magic.z * fract(dot(FRAGCOORD.xy, magic.xy)))) { 70 | discard; 71 | } 72 | 73 | ALBEDO = texture(color_ramp, vec2(w_uv.y + uv_offset, 0)).rgb; 74 | 75 | ROUGHNESS = 1.0; 76 | METALLIC = 0.0; 77 | SPECULAR = 1.0; 78 | } 79 | -------------------------------------------------------------------------------- /project/grass_area.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://dgk5yk5qsu2d8 2 | -------------------------------------------------------------------------------- /project/m8_scene.gd: -------------------------------------------------------------------------------- 1 | class_name M8Scene extends Node3D 2 | 3 | var main: Main 4 | 5 | func init(p_main: Main) -> void: 6 | main = p_main 7 | 8 | ## 9 | ## Called by the scene menu when it is first opened. 10 | ## Add settings to the menu here. 11 | ## 12 | func init_menu(_menu: SceneMenu) -> void: 13 | pass 14 | 15 | ## 16 | ## Returns true if this scene contains a DeviceModel. 17 | ## 18 | func has_device_model() -> bool: 19 | return has_node("%M8Model") and %M8Model is DeviceModel 20 | 21 | ## 22 | ## Returns the DeviceModel in this scene is there is one. Returns null if not. 23 | ## 24 | func get_device_model() -> DeviceModel: 25 | return %M8Model 26 | 27 | ## 28 | ## Returns true if this scene contains a Camera3D. 29 | ## 30 | func has_3d_camera() -> bool: 31 | return has_node("%Camera3D") and %Camera3D is M8SceneCamera3D 32 | 33 | ## 34 | ## Returns the Camera3D in this scene is there is one. Returns null if not. 35 | ## 36 | func get_3d_camera() -> M8SceneCamera3D: 37 | return %Camera3D if has_node("%Camera3D") else null 38 | 39 | ## 40 | ## Load an image or video and apply its texture to a texture rect, if possible. 41 | ## 42 | func load_media_to_texture_rect(path: String, vsp: VideoStreamPlayer = null) -> Texture2D: 43 | 44 | if is_instance_valid(vsp): 45 | vsp.stop() 46 | 47 | # try to load an image from this path 48 | var ext := path.get_extension() 49 | match ext: 50 | "png", "jpg", "jpeg", "hdr": 51 | print("scene: loading image") 52 | var image := Image.load_from_file(path) 53 | return ImageTexture.create_from_image(image) 54 | "ogv": 55 | if is_instance_valid(vsp): 56 | print("scene: loading video") 57 | vsp.stream = load(path) 58 | vsp.play() 59 | return vsp.get_video_texture() 60 | 61 | return null 62 | 63 | func get_auto_display_integer_scale() -> int: 64 | var window_size: Vector2i = get_viewport().size 65 | var texture: Texture2D = main.m8_client.get_display() 66 | var intscale := 1 67 | while ((intscale + 1) * texture.get_size().x <= window_size.x and (intscale + 1) * texture.get_size().y <= window_size.y): 68 | intscale += 1 69 | return intscale 70 | 71 | func get_setting(setting: String) -> Variant: 72 | return main.config.get_property_scene(setting) -------------------------------------------------------------------------------- /project/m8_scene.gd.uid: -------------------------------------------------------------------------------- 1 | uid://5tkix22fxv40 2 | -------------------------------------------------------------------------------- /project/main.gd.uid: -------------------------------------------------------------------------------- 1 | uid://d0olbd611iax7 2 | -------------------------------------------------------------------------------- /project/main_menu.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bedwwdrrkmvn4 2 | -------------------------------------------------------------------------------- /project/menu_overlay.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | 3 | var main: Main 4 | 5 | ## The overlay element currently being edited. 6 | var overlay_target: Control 7 | 8 | 9 | # disconnect all connections to this signal 10 | func _disconnect_all(sig: Signal) -> void: 11 | for conn: Dictionary in sig.get_connections(): 12 | sig.disconnect(conn.callable) 13 | 14 | ## 15 | ## Called once on initial app startup. 16 | ## 17 | func init(p_main: Main) -> void: 18 | main = p_main 19 | 20 | %ButtonFinish.pressed.connect(func() -> void: 21 | menu_close() 22 | main.menu.visible = true 23 | ) 24 | 25 | ## 26 | ## Called when this menu is opened to edit the given overlay. 27 | ## 28 | func menu_open(overlay: OverlayBase) -> void: 29 | 30 | assert(!visible, "tried to open menu when menu is already open") 31 | visible = true 32 | 33 | overlay_target = overlay 34 | overlay_target.draw_bounds = true 35 | 36 | init_settings(overlay_target) 37 | _populate_overlay_properties() 38 | 39 | func init_settings(overlay: OverlayBase) -> void: 40 | 41 | %Setting_Position.uninit() 42 | %Setting_Anchor.uninit() 43 | %Setting_Size.uninit() 44 | 45 | %Setting_Size.init_config_overlay(main, overlay, "size", func(_value: Vector2) -> void: 46 | %Setting_Anchor.force_update() 47 | ) 48 | %Setting_Anchor.init_config_overlay(main, overlay, "anchors_preset", func(_value: int) -> void: 49 | %Setting_Position.value = Vector2i.ZERO 50 | ) 51 | %Setting_Position.init_config_overlay(main, overlay, "position_offset") 52 | 53 | ## 54 | ## Called when this menu is closed 55 | ## 56 | func menu_close() -> void: 57 | 58 | visible = false 59 | 60 | if overlay_target: 61 | overlay_target.draw_bounds = false 62 | overlay_target = null 63 | 64 | ## 65 | ## Automatically add an overlay's additional properties as UI controls to 66 | ## this menu. 67 | ## The list of properties to add is taken from [overlay.overlay_get_properties()]. 68 | ## 69 | func _populate_overlay_properties() -> void: 70 | # depopulate property container 71 | for child in %ParamContainer.get_children(): 72 | %ParamContainer.remove_child(child) 73 | child.queue_free() 74 | 75 | var props: Array[String] = overlay_target.overlay_get_properties() 76 | var propinfo: Array[Dictionary] = overlay_target.get_property_list() 77 | 78 | for prop in propinfo: 79 | if prop.name not in props: continue 80 | 81 | var property: String = prop.name 82 | var setting := MenuUtils.create_setting_from_property(prop) 83 | 84 | setting.value = overlay_target.get(property) 85 | setting.setting_name = prop.name.capitalize() 86 | %ParamContainer.add_child(setting) 87 | setting.init_config_overlay(main, overlay_target, property) -------------------------------------------------------------------------------- /project/menu_overlay.gd.uid: -------------------------------------------------------------------------------- 1 | uid://fidys4f757e6 2 | -------------------------------------------------------------------------------- /project/menu_utils.gd: -------------------------------------------------------------------------------- 1 | class_name MenuUtils extends Node 2 | 3 | const SETTING_NUMBER := preload("res://ui/setting_number.tscn") 4 | const SETTING_VEC2I := preload("res://ui/setting_vec2i.tscn") 5 | const SETTING_BOOL := preload("res://ui/setting_bool.tscn") 6 | const SETTING_OPTIONS := preload("res://ui/setting_options.tscn") 7 | const SETTING_STRING := preload("res://ui/setting_string.tscn") 8 | const SETTING_COLOR := preload("res://ui/setting_color.tscn") 9 | const SETTING_FILE := preload("res://ui/setting_file.tscn") 10 | 11 | const LABEL_HEADER := preload("res://ui/label_header.tscn") 12 | 13 | 14 | ## 15 | ## Automatically create a Setting from a property dictionary (from [get_property_list()]). 16 | ## 17 | static func create_setting_from_property(prop: Dictionary) -> SettingBase: 18 | var property: String = prop.name 19 | var hint: PropertyHint = prop.hint 20 | var type: PropertyHint = prop.type 21 | var hint_string: String = prop.hint_string 22 | var setting: Node = null 23 | 24 | # print("creating setting: found prop %s, hint = %s, hint_string = %s" % [prop.name, prop.hint, prop.hint_string]) 25 | match hint: 26 | PropertyHint.PROPERTY_HINT_NONE: # prop only has a type 27 | match type: 28 | TYPE_VECTOR2I: 29 | setting = SETTING_VEC2I.instantiate() 30 | setting.min_value = Vector2i(-3000, -3000) 31 | setting.max_value = Vector2i(3000, 3000) 32 | TYPE_BOOL: 33 | setting = SETTING_BOOL.instantiate() 34 | TYPE_INT: 35 | setting = SETTING_NUMBER.instantiate() 36 | setting.format_string = "%d" 37 | TYPE_FLOAT: 38 | setting = SETTING_NUMBER.instantiate() 39 | setting.step = 0.01 40 | TYPE_STRING: 41 | setting = SETTING_STRING.instantiate() 42 | TYPE_COLOR: 43 | setting = SETTING_COLOR.instantiate() 44 | var x: 45 | assert(false, "Unrecognized property type when populating menu: name=%s, hint=%s, hint_string=%s, %s" % [property, hint, x, prop]) 46 | 47 | PropertyHint.PROPERTY_HINT_RANGE: # prop using @export_range 48 | var split := hint_string.split(",") 49 | setting = SETTING_NUMBER.instantiate() 50 | setting.min_value = split[0].to_float() 51 | setting.max_value = split[1].to_float() 52 | if split.size() == 3: setting.step = split[2].to_float() 53 | if is_equal_approx(setting.step, 1): setting.format_string = "%d" 54 | 55 | PropertyHint.PROPERTY_HINT_ENUM: # prop is an enum 56 | setting = SETTING_OPTIONS.instantiate() 57 | for s in hint_string.split(","): 58 | setting.items.append(s.split(":")[0]) 59 | setting.setting_type = 1 60 | 61 | var x: 62 | assert(false, "Unrecognized property hint when populating menu: name=%s, hint=%s, hint_string=%s, %s" % [property, hint, x, prop]) 63 | 64 | return setting 65 | 66 | static func create_setting_options() -> SettingBase: 67 | return SETTING_OPTIONS.instantiate() 68 | 69 | static func create_setting_file() -> SettingFile: 70 | return SETTING_FILE.instantiate() 71 | 72 | static func create_header(text: String) -> Control: 73 | var label := LABEL_HEADER.instantiate() 74 | label.text = text 75 | return label 76 | -------------------------------------------------------------------------------- /project/menu_utils.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dueva7ob1fr6k 2 | -------------------------------------------------------------------------------- /project/models/m8_model.gd.uid: -------------------------------------------------------------------------------- 1 | uid://b3nts52y6tvvc 2 | -------------------------------------------------------------------------------- /project/models/material_body_01.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://g8po1mp7xinq"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dkl4iuf1hg2la" path="res://models/noise_normal.tres" id="2_boms1"] 4 | 5 | [resource] 6 | albedo_color = Color(0.15, 0.15, 0.15, 1) 7 | metallic = 0.9 8 | roughness = 0.6 9 | normal_enabled = true 10 | normal_scale = 1.25 11 | normal_texture = ExtResource("2_boms1") 12 | uv1_triplanar = true 13 | uv1_world_triplanar = true 14 | texture_filter = 2 15 | -------------------------------------------------------------------------------- /project/models/material_body_02.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=5 format=3 uid="uid://ceus1nseg5p1a"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://cm84lsw54cq8t" path="res://assets/m8_tracker/textures/labels_02.png" id="1_dyl76"] 4 | [ext_resource type="Texture2D" uid="uid://cnm2iqhf11y5c" path="res://models/material_noise.tres" id="1_gsvwo"] 5 | [ext_resource type="Texture2D" uid="uid://dkl4iuf1hg2la" path="res://models/noise_normal.tres" id="3_y2xpi"] 6 | 7 | [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ujn6n"] 8 | transparency = 1 9 | albedo_texture = ExtResource("1_dyl76") 10 | metallic = 0.6 11 | roughness = 0.3 12 | emission = Color(1, 1, 1, 1) 13 | emission_energy_multiplier = 0.15 14 | texture_repeat = false 15 | 16 | [resource] 17 | next_pass = SubResource("StandardMaterial3D_ujn6n") 18 | albedo_color = Color(0.15, 0.15, 0.15, 1) 19 | albedo_texture = ExtResource("1_gsvwo") 20 | metallic = 0.8 21 | roughness = 0.4 22 | normal_enabled = true 23 | normal_texture = ExtResource("3_y2xpi") 24 | uv1_scale = Vector3(1.25, 1.25, 1.25) 25 | uv1_triplanar = true 26 | uv1_world_triplanar = true 27 | -------------------------------------------------------------------------------- /project/models/material_m8_glass.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://bx4wimtm1r58y"] 2 | 3 | [ext_resource type="Shader" uid="uid://bpp0n34npuj1s" path="res://shaders/device_screen_glass.gdshader" id="1_4ogah"] 4 | 5 | [resource] 6 | render_priority = 0 7 | shader = ExtResource("1_4ogah") 8 | shader_parameter/albedo = Color(0.25, 0.25, 0.25, 0.00784314) 9 | shader_parameter/roughness = 0.02 10 | shader_parameter/specular = 0.0 11 | shader_parameter/metallic = 30.0 12 | shader_parameter/specular_light_size = 0.05 13 | shader_parameter/specular_light_opacity = 1.0 14 | -------------------------------------------------------------------------------- /project/models/material_m8_keycap.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://bteaijler8fto"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://cnm2iqhf11y5c" path="res://models/material_noise.tres" id="1_i3ir3"] 4 | [ext_resource type="Texture2D" uid="uid://dkl4iuf1hg2la" path="res://models/noise_normal.tres" id="2_y1ht5"] 5 | 6 | [resource] 7 | albedo_color = Color(0.153436, 0.153437, 0.153436, 1) 8 | albedo_texture = ExtResource("1_i3ir3") 9 | metallic = 0.9 10 | roughness = 0.4 11 | normal_enabled = true 12 | normal_scale = 0.8 13 | normal_texture = ExtResource("2_y1ht5") 14 | uv1_scale = Vector3(1.25, 1.25, 1.25) 15 | uv1_triplanar = true 16 | uv1_world_triplanar = true 17 | texture_filter = 2 18 | -------------------------------------------------------------------------------- /project/models/material_m8_keycap_highlight.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://lctfc7euwygw"] 2 | 3 | [resource] 4 | transparency = 1 5 | shading_mode = 0 6 | albedo_color = Color(1, 1, 1, 0) 7 | -------------------------------------------------------------------------------- /project/models/material_m8_labels.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dg5vx4cep1n2d"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dkluilk4o0r7l" path="res://assets/m8_tracker/textures/labels_01.png" id="1_pp58m"] 4 | 5 | [resource] 6 | transparency = 1 7 | albedo_color = Color(1, 1, 1, 0.191) 8 | albedo_texture = ExtResource("1_pp58m") 9 | metallic = 0.3 10 | roughness = 0.5 11 | -------------------------------------------------------------------------------- /project/models/material_m8_rim.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://be3p66xqo7iqm"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dkl4iuf1hg2la" path="res://models/noise_normal.tres" id="1_v4j5g"] 4 | 5 | [resource] 6 | albedo_color = Color(0.1, 0.1, 0.1, 1) 7 | metallic = 0.8 8 | roughness = 0.4 9 | normal_enabled = true 10 | normal_texture = ExtResource("1_v4j5g") 11 | uv1_scale = Vector3(1.2, 1.2, 1.2) 12 | uv1_triplanar = true 13 | uv1_world_triplanar = true 14 | texture_filter = 2 15 | -------------------------------------------------------------------------------- /project/models/material_m8_screen.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="ShaderMaterial" load_steps=3 format=3 uid="uid://catw8vnxgj5jg"] 2 | 3 | [ext_resource type="Shader" uid="uid://2u4wsevt0osc" path="res://shaders/device_screen.gdshader" id="1_7pb8s"] 4 | [ext_resource type="Texture2D" uid="uid://ras5y3yqijkx" path="res://assets/m8_screen_placeholder.png" id="2_imxx7"] 5 | 6 | [resource] 7 | resource_local_to_scene = true 8 | render_priority = 0 9 | shader = ExtResource("1_7pb8s") 10 | shader_parameter/emission_amount = 0.7 11 | shader_parameter/edge_darken = -0.3 12 | shader_parameter/edge_burn = 0.0 13 | shader_parameter/edge_burn_ramp = 10.0 14 | shader_parameter/brightness = 0.0 15 | shader_parameter/texture_linear = ExtResource("2_imxx7") 16 | shader_parameter/texture_nearest = ExtResource("2_imxx7") 17 | shader_parameter/backlight = false 18 | shader_parameter/use_linear_filter = true 19 | -------------------------------------------------------------------------------- /project/models/material_m8_screen_bezel.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://brl2lskfjpwxk"] 2 | 3 | [ext_resource type="Texture2D" uid="uid://dkl4iuf1hg2la" path="res://models/noise_normal.tres" id="1_bxwck"] 4 | 5 | [resource] 6 | albedo_color = Color(0, 0, 0, 1) 7 | metallic = 0.6 8 | roughness = 0.7 9 | normal_enabled = true 10 | normal_scale = 4.0 11 | normal_texture = ExtResource("1_bxwck") 12 | uv1_triplanar = true 13 | uv1_world_triplanar = true 14 | -------------------------------------------------------------------------------- /project/models/material_m8_screen_black.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://di0h5jn753ri3"] 2 | 3 | [resource] 4 | albedo_color = Color(0, 0, 0, 1) 5 | metallic = 1.0 6 | metallic_specular = 0.0 7 | -------------------------------------------------------------------------------- /project/models/material_m8_screw.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="StandardMaterial3D" format=3 uid="uid://bd1asqbjl3odm"] 2 | 3 | [resource] 4 | albedo_color = Color(0.0117647, 0.0117647, 0.0117647, 1) 5 | metallic = 0.8 6 | roughness = 0.35 7 | -------------------------------------------------------------------------------- /project/models/material_noise.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture2D" load_steps=3 format=3 uid="uid://cnm2iqhf11y5c"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_lge21"] 4 | colors = PackedColorArray(0.515603, 0.515603, 0.515603, 1, 1, 1, 1, 1) 5 | 6 | [sub_resource type="FastNoiseLite" id="FastNoiseLite_jvwfx"] 7 | noise_type = 3 8 | frequency = 0.8 9 | 10 | [resource] 11 | width = 2048 12 | height = 2048 13 | normalize = false 14 | color_ramp = SubResource("Gradient_lge21") 15 | noise = SubResource("FastNoiseLite_jvwfx") 16 | -------------------------------------------------------------------------------- /project/models/noise_normal.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="NoiseTexture2D" load_steps=3 format=3 uid="uid://dkl4iuf1hg2la"] 2 | 3 | [sub_resource type="Gradient" id="Gradient_mneab"] 4 | 5 | [sub_resource type="FastNoiseLite" id="FastNoiseLite_axpvc"] 6 | noise_type = 3 7 | seed = 2 8 | frequency = 0.8 9 | domain_warp_enabled = true 10 | 11 | [resource] 12 | width = 1024 13 | height = 1024 14 | as_normal_map = true 15 | bump_strength = 4.0 16 | color_ramp = SubResource("Gradient_mneab") 17 | noise = SubResource("FastNoiseLite_axpvc") 18 | -------------------------------------------------------------------------------- /project/models/plant_model.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name PlantModel extends Node3D 3 | 4 | @onready var plant_nodes: Array[Node3D] = [ 5 | %Pot003, 6 | % "green dram", 7 | %Pot001, 8 | %Pot004, 9 | %Pot005, 10 | %Pot006, 11 | %Pot007, 12 | %Pot008, 13 | %Pot009, 14 | %Pot010, 15 | ] 16 | 17 | enum Type { 18 | TYPE_A, 19 | TYPE_B, 20 | TYPE_C, 21 | TYPE_D, 22 | TYPE_E, # agave 23 | TYPE_F, # haworthia_cooperi 24 | TYPE_G, # sedeveria 25 | TYPE_H, # crassula 26 | TYPE_I, # lithops 27 | TYPE_J, # senecio 28 | } 29 | 30 | @export var type := Type.TYPE_C: 31 | set(value): 32 | type = value 33 | if not is_inside_tree(): return 34 | for node in plant_nodes: 35 | node.visible = false 36 | plant_nodes[type].visible = true 37 | -------------------------------------------------------------------------------- /project/models/plant_model.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dng23ebxkacd5 2 | -------------------------------------------------------------------------------- /project/models/plant_model.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://nepv47umjdf0"] 2 | 3 | [ext_resource type="PackedScene" uid="uid://d2812ej708k17" path="res://assets/succulent_plants/scene.gltf" id="1_8xls6"] 4 | [ext_resource type="Script" uid="uid://dng23ebxkacd5" path="res://models/plant_model.gd" id="2_4nfm1"] 5 | 6 | [node name="PlantModel" instance=ExtResource("1_8xls6")] 7 | transform = Transform3D(0.423425, 0, 0.905931, 0, 1, 0, -0.905931, 0, 0.423425, 0, 0, 0) 8 | script = ExtResource("2_4nfm1") 9 | type = 4 10 | 11 | [node name="Sketchfab_model" parent="." index="0"] 12 | transform = Transform3D(-2.77361, 2.8822, 1.25985e-07, 0, -1.74846e-07, 4, 2.8822, 2.77361, 1.21238e-07, 0, 0, 0) 13 | 14 | [node name="Pot003" parent="Sketchfab_model/Root" index="0"] 15 | unique_name_in_owner = true 16 | transform = Transform3D(0.907675, -0.419674, -1.83446e-08, 0.419674, 0.907675, -4.03567e-09, 1.83446e-08, -4.03567e-09, 1, 0, 0, 0) 17 | visible = false 18 | 19 | [node name="green dram" parent="Sketchfab_model/Root/Pot002" index="2"] 20 | unique_name_in_owner = true 21 | transform = Transform3D(-0.0950257, -0.0983798, -0.0615777, 0.116063, -0.0805563, -0.0504135, -1.73482e-08, -0.07958, 0.12715, -0.0376695, 0.0697476, 0.42577) 22 | visible = false 23 | 24 | [node name="Pot001" parent="Sketchfab_model/Root" index="2"] 25 | unique_name_in_owner = true 26 | transform = Transform3D(-0.00701585, -0.999975, -4.37104e-08, 0.999975, -0.00701585, -4.40181e-08, 4.37104e-08, -4.40182e-08, 1, 0.0326475, -0.0207181, -9.05621e-10) 27 | visible = false 28 | 29 | [node name="Pot004" parent="Sketchfab_model/Root" index="3"] 30 | unique_name_in_owner = true 31 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 32 | visible = false 33 | 34 | [node name="Pot005" parent="Sketchfab_model/Root" index="4"] 35 | unique_name_in_owner = true 36 | transform = Transform3D(0.488149, 0.87276, 3.81496e-08, -0.87276, 0.488149, -2.23738e-08, -3.81497e-08, -2.23737e-08, 1, 0.0100297, 0.00524204, 2.29138e-10) 37 | 38 | [node name="Pot006" parent="Sketchfab_model/Root" index="5"] 39 | unique_name_in_owner = true 40 | transform = Transform3D(1.12, 0, 0, 0, 1.12, 0, 0, 0, 1.12, 0, 0, -0.04) 41 | visible = false 42 | 43 | [node name="Pot007" parent="Sketchfab_model/Root" index="6"] 44 | unique_name_in_owner = true 45 | transform = Transform3D(1.095, 0, 0, 0, 1.095, 0, 0, 0, 1.095, 0, 0, -0.02) 46 | visible = false 47 | 48 | [node name="Pot008" parent="Sketchfab_model/Root" index="7"] 49 | unique_name_in_owner = true 50 | transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 51 | visible = false 52 | 53 | [node name="Pot009" parent="Sketchfab_model/Root" index="8"] 54 | unique_name_in_owner = true 55 | transform = Transform3D(0.134817, -0.99087, -4.33124e-08, 0.99087, 0.134817, -3.78185e-08, 4.33125e-08, -3.78184e-08, 1, 0.0427157, 0.0213961, 3.58563e-07) 56 | visible = false 57 | 58 | [node name="Pot010" parent="Sketchfab_model/Root" index="9"] 59 | unique_name_in_owner = true 60 | transform = Transform3D(0.999444, 0.0333296, 1.45688e-09, -0.0333296, 0.999444, -2.43388e-11, -1.45686e-09, -2.42801e-11, 1, -0.0269476, 0.102779, -2.33926e-07) 61 | visible = false 62 | -------------------------------------------------------------------------------- /project/overlays/audio_spectrum.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture; 4 | 5 | uniform bool blend_soft_light = false; 6 | 7 | 8 | float _blend(float base, float blend) { 9 | // overlay 10 | return base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend)); 11 | 12 | // soft light 13 | //return (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend)); 14 | } 15 | 16 | vec3 soft_light(vec3 a, vec3 b) { 17 | return vec3(_blend(a.r, b.r), _blend(a.g, b.g), _blend(a.b, b.b)); 18 | } 19 | 20 | void fragment() { 21 | vec3 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; 22 | 23 | if(blend_soft_light) { 24 | COLOR.rgb = mix(soft_light(screen_color, COLOR.rgb), COLOR.rgb, COLOR.a); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /project/overlays/audio_spectrum.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://b0bkdr4vq66r3 2 | -------------------------------------------------------------------------------- /project/overlays/overlay.gd: -------------------------------------------------------------------------------- 1 | class_name OverlayBase extends Control 2 | 3 | @export var position_offset := Vector2i.ZERO: 4 | set(value): 5 | position_offset = value 6 | _update() 7 | 8 | @export var draw_bounds := false: 9 | set(value): 10 | draw_bounds = value 11 | _update() 12 | 13 | var main: Main 14 | 15 | func init(p_main: Main) -> void: 16 | main = p_main 17 | 18 | func _update() -> void: 19 | pass 20 | 21 | func overlay_get_properties() -> Array[String]: 22 | return [] 23 | -------------------------------------------------------------------------------- /project/overlays/overlay.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bufvcspv787nk 2 | -------------------------------------------------------------------------------- /project/overlays/overlay_audio_spectrum.gd.uid: -------------------------------------------------------------------------------- 1 | uid://drenfcfnpcacy 2 | -------------------------------------------------------------------------------- /project/overlays/overlay_audio_spectrum.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://263mog4cxgwr"] 2 | 3 | [ext_resource type="Script" uid="uid://drenfcfnpcacy" path="res://overlays/overlay_audio_spectrum.gd" id="1_1v02u"] 4 | [ext_resource type="Shader" uid="uid://b0bkdr4vq66r3" path="res://overlays/audio_spectrum.gdshader" id="1_20qm2"] 5 | 6 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_14ntg"] 7 | shader = ExtResource("1_20qm2") 8 | shader_parameter/blend_soft_light = false 9 | 10 | [node name="AudioSpectrum" type="Control"] 11 | material = SubResource("ShaderMaterial_14ntg") 12 | layout_mode = 3 13 | anchors_preset = 8 14 | anchor_left = 0.5 15 | anchor_top = 0.5 16 | anchor_right = 0.5 17 | anchor_bottom = 0.5 18 | offset_left = -640.0 19 | offset_top = -480.0 20 | offset_right = -320.0 21 | offset_bottom = -240.0 22 | grow_horizontal = 2 23 | grow_vertical = 2 24 | script = ExtResource("1_1v02u") 25 | -------------------------------------------------------------------------------- /project/overlays/overlay_audio_waveform.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cg5u1enpf42y5 2 | -------------------------------------------------------------------------------- /project/overlays/overlay_audio_waveform.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=3 uid="uid://dq6heks88e2ip"] 2 | 3 | [ext_resource type="Script" uid="uid://cg5u1enpf42y5" path="res://overlays/overlay_audio_waveform.gd" id="1_es30f"] 4 | [ext_resource type="Shader" uid="uid://b0bkdr4vq66r3" path="res://overlays/audio_spectrum.gdshader" id="1_xvcfl"] 5 | 6 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_opvfq"] 7 | shader = ExtResource("1_xvcfl") 8 | shader_parameter/blend_soft_light = true 9 | 10 | [node name="AudioWaveform" type="Control"] 11 | material = SubResource("ShaderMaterial_opvfq") 12 | layout_mode = 3 13 | anchors_preset = 0 14 | offset_right = 320.0 15 | offset_bottom = 25.0 16 | script = ExtResource("1_es30f") 17 | -------------------------------------------------------------------------------- /project/overlays/overlay_display_panel.gd: -------------------------------------------------------------------------------- 1 | extends OverlayBase 2 | 3 | 4 | @export_range(1, 4) var integer_scale: int = 1: 5 | set(value): 6 | integer_scale = value 7 | _update() 8 | 9 | @export var padding: Vector2i = Vector2i(16, 16): 10 | set(value): 11 | padding = value 12 | _update() 13 | 14 | @export_range(0, 16) var corner_radius: int = 8: 15 | set(value): 16 | corner_radius = value 17 | _update() 18 | 19 | @export_range(0.0, 1.0, 0.01) var opacity: float = 1.0: 20 | set(value): 21 | opacity = value 22 | _update() 23 | 24 | @export_range(0.0, 8.0, 0.1) var blur_amount: float = 2.0: 25 | set(value): 26 | opacity = value 27 | _update() 28 | 29 | 30 | func init(p_main: Main) -> void: 31 | super(p_main) 32 | 33 | %DisplayTextureRect.texture = main.m8_client.get_display() 34 | 35 | main.m8_theme_changed.connect(func(_colors: PackedColorArray, _complete: bool) -> void: 36 | _update() 37 | ) 38 | 39 | func overlay_get_properties() -> Array[String]: 40 | return ["integer_scale", "opacity", "padding", "corner_radius"] 41 | 42 | func _process(_delta: float) -> void: 43 | queue_redraw() 44 | 45 | func _draw() -> void: 46 | if draw_bounds: 47 | draw_rect(Rect2(position_offset, size), Color.WHITE, false) 48 | 49 | func _update() -> void: 50 | if is_inside_tree(): 51 | # update position 52 | %DisplayPanel.position = position_offset 53 | 54 | # update padding 55 | var stylebox: StyleBox = %DisplayPanel.get_theme_stylebox("panel") 56 | stylebox.content_margin_left = padding.x 57 | stylebox.content_margin_right = padding.x 58 | stylebox.content_margin_top = padding.y 59 | stylebox.content_margin_bottom = padding.y 60 | stylebox.corner_radius_top_left = corner_radius 61 | stylebox.corner_radius_top_right = corner_radius 62 | stylebox.corner_radius_bottom_left = corner_radius 63 | stylebox.corner_radius_bottom_right = corner_radius 64 | 65 | # update shader 66 | %DisplayPanel.material.set_shader_parameter("panel_opacity", opacity) 67 | %DisplayPanel.material.set_shader_parameter("blur_amount", blur_amount) 68 | %DisplayPanel.material.set_shader_parameter("panel_color", main.m8_get_theme_colors()[0]) 69 | 70 | # update size 71 | var display_size := main.m8_client.get_display().get_size() * integer_scale 72 | %DisplayTextureRect.custom_minimum_size = display_size 73 | %DisplayPanel.custom_minimum_size = Vector2.ZERO 74 | %DisplayPanel.size = Vector2.ZERO 75 | size = %DisplayPanel.size 76 | 77 | anchors_preset = anchors_preset # needed for correct anchor to be used 78 | -------------------------------------------------------------------------------- /project/overlays/overlay_display_panel.gd.uid: -------------------------------------------------------------------------------- 1 | uid://d1xt7ep7sa3oc 2 | -------------------------------------------------------------------------------- /project/overlays/overlay_display_panel.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Shader" format=3 uid="uid://df8ql2iwe7kys"] 2 | 3 | [resource] 4 | code = "shader_type canvas_item; 5 | 6 | uniform vec3 panel_color: source_color = vec3(0); 7 | uniform float panel_opacity: hint_range(0.0, 1.0) = 1.0; 8 | 9 | void fragment() { 10 | COLOR = vec4(panel_color, panel_opacity); 11 | }" 12 | -------------------------------------------------------------------------------- /project/overlays/overlay_display_panel.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=7 format=3 uid="uid://bkmg6tijdna2y"] 2 | 3 | [ext_resource type="Shader" uid="uid://df8ql2iwe7kys" path="res://overlays/overlay_display_panel.tres" id="1_hikxj"] 4 | [ext_resource type="Texture2D" uid="uid://ras5y3yqijkx" path="res://assets/m8_screen_placeholder.png" id="2_dqr0t"] 5 | [ext_resource type="Script" uid="uid://d1xt7ep7sa3oc" path="res://overlays/overlay_display_panel.gd" id="2_yhulq"] 6 | 7 | [sub_resource type="ShaderMaterial" id="ShaderMaterial_lw18t"] 8 | shader = ExtResource("1_hikxj") 9 | shader_parameter/panel_color = Color(1, 1, 1, 1) 10 | shader_parameter/panel_opacity = 1.0 11 | 12 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hl16s"] 13 | content_margin_left = 16.0 14 | content_margin_top = 16.0 15 | content_margin_right = 16.0 16 | content_margin_bottom = 16.0 17 | corner_radius_top_left = 8 18 | corner_radius_top_right = 8 19 | corner_radius_bottom_right = 8 20 | corner_radius_bottom_left = 8 21 | corner_detail = 6 22 | anti_aliasing = false 23 | 24 | [sub_resource type="AtlasTexture" id="AtlasTexture_87cwd"] 25 | atlas = ExtResource("2_dqr0t") 26 | region = Rect2(0, 0, 320, 240) 27 | 28 | [node name="Display" type="Control"] 29 | layout_mode = 3 30 | anchors_preset = 0 31 | script = ExtResource("2_yhulq") 32 | 33 | [node name="DisplayPanel" type="PanelContainer" parent="."] 34 | unique_name_in_owner = true 35 | material = SubResource("ShaderMaterial_lw18t") 36 | layout_mode = 0 37 | offset_right = 352.0 38 | offset_bottom = 272.0 39 | theme_override_styles/panel = SubResource("StyleBoxFlat_hl16s") 40 | 41 | [node name="DisplayTextureRect" type="TextureRect" parent="DisplayPanel"] 42 | unique_name_in_owner = true 43 | texture_filter = 1 44 | custom_minimum_size = Vector2(320, 240) 45 | layout_mode = 2 46 | size_flags_horizontal = 4 47 | size_flags_vertical = 4 48 | texture = SubResource("AtlasTexture_87cwd") 49 | expand_mode = 1 50 | stretch_mode = 6 51 | -------------------------------------------------------------------------------- /project/overlays/overlay_keys.gd.uid: -------------------------------------------------------------------------------- 1 | uid://c2udx15le3kvv 2 | -------------------------------------------------------------------------------- /project/overlays/overlay_keys.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://ca2jqh2tc7jix"] 2 | 3 | [ext_resource type="Script" uid="uid://c2udx15le3kvv" path="res://overlays/overlay_keys.gd" id="1_tnj14"] 4 | [ext_resource type="PackedScene" uid="uid://yvgf0ok5tp6r" path="res://overlays/overlay_keys_item.tscn" id="2_yi3d0"] 5 | 6 | [node name="KeyOverlay" type="Control"] 7 | custom_minimum_size = Vector2(320, 320) 8 | layout_mode = 3 9 | anchors_preset = 0 10 | offset_right = 320.0 11 | offset_bottom = 320.0 12 | script = ExtResource("1_tnj14") 13 | 14 | [node name="ControlOffset" type="Control" parent="."] 15 | unique_name_in_owner = true 16 | layout_mode = 1 17 | anchors_preset = 2 18 | anchor_top = 1.0 19 | anchor_bottom = 1.0 20 | offset_top = -320.0 21 | offset_right = 320.0 22 | grow_vertical = 0 23 | 24 | [node name="Control" type="Control" parent="ControlOffset"] 25 | unique_name_in_owner = true 26 | layout_mode = 1 27 | anchors_preset = 2 28 | anchor_top = 1.0 29 | anchor_bottom = 1.0 30 | offset_top = -320.0 31 | grow_vertical = 0 32 | 33 | [node name="VBoxContainer" type="VBoxContainer" parent="ControlOffset/Control"] 34 | unique_name_in_owner = true 35 | layout_mode = 0 36 | offset_right = 320.0 37 | offset_bottom = 320.0 38 | alignment = 2 39 | 40 | [node name="ItemSample1" parent="ControlOffset/Control/VBoxContainer" instance=ExtResource("2_yi3d0")] 41 | unique_name_in_owner = true 42 | visible = false 43 | layout_mode = 2 44 | pressed_u = true 45 | pressed_d = true 46 | pressed_l = true 47 | pressed_r = true 48 | style_padding = Vector2i(8, -1) 49 | 50 | [node name="ItemSample2" parent="ControlOffset/Control/VBoxContainer" instance=ExtResource("2_yi3d0")] 51 | unique_name_in_owner = true 52 | visible = false 53 | layout_mode = 2 54 | pressed_o = true 55 | pressed_e = true 56 | style_padding = Vector2i(8, -1) 57 | 58 | [node name="ItemSample3" parent="ControlOffset/Control/VBoxContainer" instance=ExtResource("2_yi3d0")] 59 | unique_name_in_owner = true 60 | visible = false 61 | layout_mode = 2 62 | pressed_s = true 63 | pressed_p = true 64 | style_padding = Vector2i(8, -1) 65 | -------------------------------------------------------------------------------- /project/overlays/overlay_keys_item.gd.uid: -------------------------------------------------------------------------------- 1 | uid://d2cyloffcnk2m 2 | -------------------------------------------------------------------------------- /project/scene_camera_3d.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cki43uor5p6oe 2 | -------------------------------------------------------------------------------- /project/scene_camera_3d.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bckroenwlecqv"] 2 | 3 | [ext_resource type="Script" uid="uid://cki43uor5p6oe" path="res://scene_camera_3d.gd" id="1_idfgn"] 4 | 5 | [sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_wopxj"] 6 | auto_exposure_scale = 0.02 7 | dof_blur_far_enabled = true 8 | dof_blur_far_distance = 15.5 9 | dof_blur_far_transition = 2.75 10 | dof_blur_near_enabled = true 11 | dof_blur_near_distance = 12.5 12 | dof_blur_near_transition = 2.25 13 | dof_blur_amount = 0.18 14 | 15 | [node name="Camera3D" type="Node3D"] 16 | script = ExtResource("1_idfgn") 17 | 18 | [node name="Camera3D" type="Camera3D" parent="."] 19 | unique_name_in_owner = true 20 | attributes = SubResource("CameraAttributesPractical_wopxj") 21 | current = true 22 | fov = 30.0 23 | size = 8.765 24 | far = 450.0 25 | -------------------------------------------------------------------------------- /project/scene_camera_menu.gd: -------------------------------------------------------------------------------- 1 | extends PanelContainer 2 | 3 | 4 | var main: Main 5 | 6 | ## 7 | ## Called once on initial app startup. 8 | ## 9 | func init(p_main: Main) -> void: 10 | main = p_main 11 | 12 | %Setting_Position.init_config_camera(p_main, "position") 13 | %Setting_Angle.init_config_camera(p_main, "angle", 14 | func(value: Vector2) -> void: 15 | main.get_scene_camera().rotation_degrees = Vector3(value.x, value.y, 0), 16 | func() -> Vector2: 17 | var rot := main.get_scene_camera().rotation_degrees 18 | return Vector2(rot.x, rot.y) 19 | ) 20 | %Setting_Focus.init_config_camera_2(p_main, "dof_focus_distance", "dof_focus_width") 21 | %Setting_Blur.init_config_camera(p_main, "dof_blur_amount") 22 | 23 | %Button_Finish.pressed.connect(main.menu_open) 24 | 25 | main.scene_loaded.connect(func(_scene_path: String, _scene: M8Scene) -> void: 26 | on_scene_loaded() 27 | var camera := main.get_scene_camera() 28 | if camera: 29 | if !camera.camera_updated.is_connected(on_camera_updated): 30 | camera.camera_updated.connect(on_camera_updated) 31 | if !camera.reposition_stopped.is_connected(on_camera_reposition_stopped): 32 | camera.reposition_stopped.connect(on_camera_reposition_stopped) 33 | ) 34 | 35 | ## 36 | ## Called when a scene has been loaded. 37 | ## This will reinit setting values from the config. 38 | ## 39 | func on_scene_loaded() -> void: 40 | var camera := main.get_scene_camera() 41 | if camera: 42 | %Setting_Position.reinit() 43 | %Setting_Angle.reinit() 44 | %Setting_Focus.reinit() 45 | %Setting_Blur.reinit() 46 | camera.set_current_transform_as_base() 47 | # print("camera menu: reinited") 48 | 49 | ## 50 | ## Called when any of the camera's properties have changed. 51 | ## This will change the setting values without saving to the config. 52 | ## 53 | func on_camera_updated() -> void: 54 | var camera := main.get_scene_camera() 55 | if camera: 56 | %Setting_Position.set_value_no_signal(camera.position) 57 | %Setting_Angle.set_value_no_signal(Vector2(camera.rotation_degrees.x, camera.rotation_degrees.y)) 58 | %Setting_Focus.set_value_no_signal(Vector2(camera.dof_focus_distance, camera.dof_focus_width)) 59 | %Setting_Blur.set_value_no_signal(camera.dof_blur_amount) 60 | # print("camera menu: camera updated") 61 | 62 | ## 63 | ## Called when the camera has stopped repositioning. 64 | ## This will save the current setting values to the config. 65 | ## 66 | func on_camera_reposition_stopped() -> void: 67 | var camera := main.get_scene_camera() 68 | if camera: 69 | camera.set_current_transform_as_base() 70 | %Setting_Position.force_update() 71 | %Setting_Angle.force_update() 72 | %Setting_Focus.force_update() 73 | %Setting_Blur.force_update() 74 | # print("camera menu: camera reposition stopped") 75 | 76 | ## 77 | ## Called when this menu is opened. 78 | ## 79 | func menu_open() -> void: 80 | if !visible: 81 | # update_menu() 82 | visible = true 83 | %Button_Finish.visible = true 84 | main.get_scene_camera().set_transform_to_base() 85 | 86 | ## 87 | ## Called when the "small" version of this menu is opened. 88 | ## Used when editing the camera from the scene parameter menu. 89 | ## 90 | func menu_open_as_info() -> void: 91 | # update_menu() 92 | visible = true 93 | %Button_Finish.visible = false 94 | 95 | ## 96 | ## Called when this menu is closed. 97 | ## 98 | func menu_close() -> void: 99 | if visible: 100 | visible = false 101 | main.get_scene_camera().set_current_transform_as_base() -------------------------------------------------------------------------------- /project/scene_camera_menu.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dqpc5hj803f5y 2 | -------------------------------------------------------------------------------- /project/scene_camera_menu.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=3 uid="uid://geilakxinhul"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_2xsvu"] 4 | [ext_resource type="Script" uid="uid://dqpc5hj803f5y" path="res://scene_camera_menu.gd" id="1_hvork"] 5 | [ext_resource type="PackedScene" uid="uid://cr88nkt47umul" path="res://ui/setting_vec3.tscn" id="3_nfeie"] 6 | [ext_resource type="PackedScene" uid="uid://d2wnq8ai2ykus" path="res://ui/setting_vec2.tscn" id="4_tmlck"] 7 | [ext_resource type="PackedScene" uid="uid://b1r8nehsgp111" path="res://ui/setting_number.tscn" id="5_fqmu6"] 8 | 9 | [node name="SceneCameraMenu" type="PanelContainer"] 10 | custom_minimum_size = Vector2(400, 0) 11 | size_flags_horizontal = 0 12 | size_flags_vertical = 8 13 | theme = ExtResource("1_2xsvu") 14 | theme_type_variation = &"SubmenuPanelContainer" 15 | script = ExtResource("1_hvork") 16 | 17 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 18 | layout_mode = 2 19 | 20 | [node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer"] 21 | layout_mode = 2 22 | theme_override_colors/default_color = Color(1, 1, 1, 0.75) 23 | theme_override_constants/line_separation = 8 24 | bbcode_enabled = true 25 | text = "[center][i]Hold RIGHT CLICK to enable WASD/Mouse controls[/i][/center]" 26 | fit_content = true 27 | 28 | [node name="Setting_Position" parent="VBoxContainer" instance=ExtResource("3_nfeie")] 29 | unique_name_in_owner = true 30 | layout_mode = 2 31 | min_value = Vector3(-100, -100, -100) 32 | show_updown_arrows = true 33 | suffix = "m" 34 | setting_name = "Position" 35 | setting_name_min_width = 50 36 | 37 | [node name="Setting_Angle" parent="VBoxContainer" instance=ExtResource("4_tmlck")] 38 | unique_name_in_owner = true 39 | layout_mode = 2 40 | value = Vector2(3.35276e-07, 3.35276e-07) 41 | min_value = Vector2(-360, -360) 42 | max_value = Vector2(360, 360) 43 | show_updown_arrows = true 44 | prefix_x = "P" 45 | prefix_y = "Y" 46 | suffix = "deg" 47 | setting_name = "Angle" 48 | setting_name_min_width = 50 49 | 50 | [node name="Setting_Focus" parent="VBoxContainer" instance=ExtResource("4_tmlck")] 51 | unique_name_in_owner = true 52 | layout_mode = 2 53 | value = Vector2(9.31323e-09, 4.65661e-10) 54 | min_value = Vector2(-10, -0.5) 55 | show_updown_arrows = true 56 | prefix_x = "L" 57 | prefix_y = "W" 58 | suffix = "m" 59 | setting_name = "Focus" 60 | setting_name_min_width = 50 61 | 62 | [node name="Setting_Blur" parent="VBoxContainer" instance=ExtResource("5_fqmu6")] 63 | unique_name_in_owner = true 64 | layout_mode = 2 65 | max_value = 4.0 66 | step = 0.01 67 | setting_name = "Blur" 68 | setting_name_min_width = 50 69 | 70 | [node name="Button_Finish" type="Button" parent="VBoxContainer"] 71 | unique_name_in_owner = true 72 | layout_mode = 2 73 | theme_type_variation = &"ButtonGreen" 74 | text = "Finish" 75 | -------------------------------------------------------------------------------- /project/scene_menu.gd: -------------------------------------------------------------------------------- 1 | class_name SceneMenu extends PanelContainer 2 | 3 | var main: Main 4 | 5 | 6 | func init(p_main: Main) -> void: 7 | main = p_main 8 | 9 | %ButtonFinish.pressed.connect(func() -> void: 10 | visible = false 11 | main.menu.visible = true 12 | ) 13 | 14 | func init_menu() -> void: 15 | assert(main.current_scene, "There is no M8 scene loaded!") 16 | main.current_scene.init_menu(self) 17 | 18 | func clear_params() -> void: 19 | for c in %SceneParamsContainer.get_children(): 20 | c.queue_free() 21 | 22 | func menu_open() -> void: 23 | main.menu_scene.visible = true 24 | 25 | ## 26 | ## Add a control node from a scene's export variable. 27 | ## [property] must match the name of an export var that exists 28 | ## in the current scene. 29 | ## The type of control is chosen automatically based on the type of the property. 30 | ## 31 | func add_auto(property: String, setting_name: String = "") -> SettingBase: 32 | 33 | var regex_int_range := RegEx.new() 34 | var regex_float_range := RegEx.new() 35 | 36 | regex_int_range.compile("^-?\\d+,-?\\d+$") # match "#,#" export_range patterns 37 | regex_float_range.compile("^-?\\d+[.]?\\d*,-?\\d+[.]?\\d*,-?\\d+[.]?\\d*$") # match "#,#,#" export_range patterns 38 | 39 | # add menu items 40 | var scene := main.current_scene 41 | var property_list := scene.get_property_list() 42 | 43 | for prop: Dictionary in property_list: 44 | if prop.name != property: continue 45 | 46 | var setting := MenuUtils.create_setting_from_property(prop) 47 | 48 | setting.setting_name = prop.name.capitalize() if setting_name == "" else setting_name 49 | setting.value = scene.get(property) 50 | 51 | %SceneParamsContainer.add_child(setting) 52 | setting.init_config_scene(main, property) 53 | 54 | return setting 55 | 56 | assert(false, "Unable to create setting, property not found: %s" % property) 57 | return null 58 | 59 | ## 60 | ## Scan and add control nodes for all export variables in the given scene. 61 | ## 62 | func add_auto_all() -> void: 63 | for prop: Dictionary in main.current_scene.get_export_vars(): 64 | add_auto(prop.name) 65 | 66 | ## 67 | ## Add a labled OptionButton to the menu. 68 | ## This creates a drop-down list of items. 69 | ## 70 | func add_option_custom(property: String, default: int, items: Array[String], value_changed_fn: Variant = null) -> SettingBase: 71 | assert(property not in main.current_scene) 72 | 73 | var setting := MenuUtils.create_setting_options() 74 | setting.setting_name = property.capitalize() 75 | setting.setting_type = 1 76 | setting.items = items 77 | setting.value = default 78 | %SceneParamsContainer.add_child(setting) 79 | setting.init_config_scene(main, property, value_changed_fn) 80 | 81 | return setting 82 | 83 | func add_file_custom(property: String, default: String, value_changed_fn: Variant = null) -> SettingBase: 84 | assert(property not in main.current_scene) 85 | 86 | var setting := MenuUtils.create_setting_file() 87 | setting.setting_name = property.capitalize() 88 | setting.value = default 89 | %SceneParamsContainer.add_child(setting) 90 | setting.init_config_scene(main, property, value_changed_fn) 91 | 92 | return setting 93 | 94 | 95 | func add_section(title: String) -> void: 96 | var label := MenuUtils.create_header(title) 97 | %SceneParamsContainer.add_child(label) -------------------------------------------------------------------------------- /project/scene_menu.gd.uid: -------------------------------------------------------------------------------- 1 | uid://xgm5cwsm8r77 2 | -------------------------------------------------------------------------------- /project/scene_menu.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://dv8crbibtrpck"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_pbwtn"] 4 | [ext_resource type="Script" uid="uid://xgm5cwsm8r77" path="res://scene_menu.gd" id="1_x6k17"] 5 | 6 | [node name="SceneMenu" type="PanelContainer"] 7 | custom_minimum_size = Vector2(400, 0) 8 | offset_right = 320.0 9 | offset_bottom = 120.0 10 | size_flags_horizontal = 0 11 | size_flags_vertical = 8 12 | theme = ExtResource("1_pbwtn") 13 | theme_type_variation = &"SubmenuPanelContainer" 14 | script = ExtResource("1_x6k17") 15 | 16 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 17 | layout_mode = 2 18 | theme_override_constants/separation = 8 19 | 20 | [node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] 21 | custom_minimum_size = Vector2(320, 320) 22 | layout_mode = 2 23 | mouse_filter = 2 24 | horizontal_scroll_mode = 0 25 | 26 | [node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/ScrollContainer"] 27 | layout_mode = 2 28 | size_flags_horizontal = 3 29 | size_flags_vertical = 3 30 | 31 | [node name="SceneParamsContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/MarginContainer"] 32 | unique_name_in_owner = true 33 | layout_mode = 2 34 | 35 | [node name="ButtonFinish" type="Button" parent="VBoxContainer"] 36 | unique_name_in_owner = true 37 | custom_minimum_size = Vector2(0, 28) 38 | layout_mode = 2 39 | theme_type_variation = &"ButtonGreen" 40 | text = "Finish" 41 | -------------------------------------------------------------------------------- /project/scenes/desktop_scene.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cg73j23kegkdr 2 | -------------------------------------------------------------------------------- /project/scenes/fancy_display_scene.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cjoo1hy85e5ad 2 | -------------------------------------------------------------------------------- /project/scenes/fast_display_scene.gd: -------------------------------------------------------------------------------- 1 | extends M8Scene 2 | 3 | @export_range(0, 6) var integer_scale: int = 0: 4 | set(value): 5 | integer_scale = value 6 | 7 | func init(p_main: Main) -> void: 8 | super(p_main) 9 | 10 | # %TextureRect.texture = _display.m8_display_texture 11 | %TextureRect.texture = main.m8_client.get_display() 12 | 13 | func init_menu(menu: SceneMenu) -> void: 14 | menu.add_auto("integer_scale") 15 | 16 | func _process(_delta: float) -> void: 17 | 18 | RenderingServer.set_default_clear_color(main.m8_client.get_theme_colors()[0]) 19 | 20 | if integer_scale == 0: 21 | %TextureRect.custom_minimum_size = %TextureRect.texture.get_size() * get_auto_display_integer_scale(); 22 | else: 23 | %TextureRect.custom_minimum_size = %TextureRect.texture.get_size() * integer_scale; 24 | -------------------------------------------------------------------------------- /project/scenes/fast_display_scene.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cxekfeylprcwt 2 | -------------------------------------------------------------------------------- /project/scenes/fast_display_scene.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://dh1klpvygnyuf"] 2 | 3 | [ext_resource type="Script" uid="uid://cxekfeylprcwt" path="res://scenes/fast_display_scene.gd" id="1_edxk2"] 4 | 5 | [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_5kl75"] 6 | 7 | [node name="M8Scene" type="Node3D"] 8 | script = ExtResource("1_edxk2") 9 | metadata/_edit_vertical_guides_ = [640.0] 10 | metadata/_edit_horizontal_guides_ = [480.0] 11 | 12 | [node name="CenterContainer" type="CenterContainer" parent="."] 13 | anchors_preset = 15 14 | anchor_right = 1.0 15 | anchor_bottom = 1.0 16 | grow_horizontal = 2 17 | grow_vertical = 2 18 | 19 | [node name="TextureRect" type="TextureRect" parent="CenterContainer"] 20 | unique_name_in_owner = true 21 | texture_filter = 1 22 | layout_mode = 2 23 | size_flags_horizontal = 4 24 | size_flags_vertical = 4 25 | texture = SubResource("PlaceholderTexture2D_5kl75") 26 | 27 | [node name="Control" type="Control" parent="CenterContainer"] 28 | custom_minimum_size = Vector2(320, 240) 29 | layout_mode = 2 30 | -------------------------------------------------------------------------------- /project/scenes/floating_scene.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bgmr4rdpq5ill 2 | -------------------------------------------------------------------------------- /project/scenes/scalable_sub_viewport.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SubViewport 3 | 4 | @export_range(0, 10) var integer_scale := 0: 5 | set(value): 6 | integer_scale = value 7 | if integer_scale == 0: 8 | size_2d_override_stretch = false 9 | size = size_2d_override 10 | else: 11 | size_2d_override_stretch = true 12 | size = size_2d_override * integer_scale 13 | 14 | @export var integer_size := Vector2i(640, 480): 15 | set(value): 16 | integer_size = value 17 | size_2d_override = integer_size 18 | integer_scale = integer_scale -------------------------------------------------------------------------------- /project/scenes/scalable_sub_viewport.gd.uid: -------------------------------------------------------------------------------- 1 | uid://ctx3fbd4vqf5t 2 | -------------------------------------------------------------------------------- /project/shaders/crt.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://uqrhgh7cj8gu 2 | -------------------------------------------------------------------------------- /project/shaders/crt_screen.gdshader: -------------------------------------------------------------------------------- 1 | shader_type spatial; 2 | 3 | uniform float emission_amount = 1.0; 4 | 5 | uniform float curvature_amount_x = 1.0; 6 | uniform float curvature_amount_y = 1.0; 7 | uniform float curvature_ramp = 2.0; 8 | 9 | uniform float edge_darken = 0.3; 10 | 11 | uniform float edge_burn = 0.8; 12 | uniform float edge_burn_ramp = 10.0; 13 | 14 | uniform float distort_amount = 1.0; 15 | uniform vec2 distort_offset = vec2(0); 16 | 17 | uniform float brightness: hint_range(0.0, 2.0) = 1.0; 18 | uniform float contrast: hint_range(0.0, 2.0) = 1.0; 19 | 20 | uniform sampler2D tex: source_color, filter_linear, repeat_disable; 21 | uniform sampler2D noise_texture: source_color, filter_nearest; 22 | uniform sampler2D distort_texture: source_color, filter_nearest; 23 | 24 | void vertex() { 25 | // Called for every vertex the material is visible on. 26 | VERTEX.y -= pow(abs(UV.x - 0.5), curvature_ramp) * curvature_amount_x; 27 | VERTEX.y -= pow(abs(UV.y - 0.5), curvature_ramp) * curvature_amount_y; 28 | } 29 | 30 | void fragment() { 31 | vec2 distort_uv = vec2(texture(distort_texture, vec2(-TIME * 0.1, UV.y - TIME * 0.7)).x * 0.005, 0.0) * distort_amount + distort_offset; 32 | ALBEDO = texture(tex, UV + distort_uv).rgb; 33 | ALBEDO = mix(vec3(0.0), ALBEDO, brightness); 34 | ALBEDO = mix(vec3(0.5), ALBEDO, contrast); 35 | 36 | ALBEDO -= pow(abs(UV.x - 0.5), 7) * edge_darken; 37 | ALBEDO -= pow(abs(UV.y - 0.5), 6) * edge_darken; 38 | 39 | ALBEDO -= pow(abs(UV.x - 0.5) * 2.0, edge_burn_ramp) * edge_burn; 40 | ALBEDO -= pow(abs(UV.y - 0.5) * 2.0, edge_burn_ramp) * edge_burn; 41 | 42 | ALBEDO *= texture(noise_texture, UV).rgb; 43 | 44 | ALBEDO = clamp(ALBEDO, 0.0, 1.0); 45 | 46 | EMISSION = ALBEDO * emission_amount; 47 | 48 | METALLIC = 0.3; 49 | } -------------------------------------------------------------------------------- /project/shaders/crt_screen.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://6uitgc2tun3a 2 | -------------------------------------------------------------------------------- /project/shaders/device_screen.gdshader: -------------------------------------------------------------------------------- 1 | shader_type spatial; 2 | 3 | uniform float emission_amount = 0.7; 4 | 5 | uniform float edge_darken = -0.3; 6 | 7 | uniform float edge_burn = 0.0; 8 | uniform float edge_burn_ramp = 10.0; 9 | 10 | uniform float brightness = 0.0; 11 | 12 | uniform sampler2D texture_linear: source_color, filter_linear_mipmap_anisotropic, repeat_disable; 13 | uniform sampler2D texture_nearest: source_color, filter_nearest_mipmap_anisotropic, repeat_disable; 14 | uniform bool backlight = true; 15 | uniform bool use_linear_filter = true; 16 | 17 | 18 | void fragment() { 19 | if (use_linear_filter) 20 | { 21 | ALBEDO = texture(texture_linear, UV).rgb; 22 | } 23 | else 24 | { 25 | ALBEDO = texture(texture_nearest, UV).rgb; 26 | } 27 | 28 | if (backlight) 29 | { 30 | ALBEDO = clamp(ALBEDO + brightness, 0.0, 1.0); 31 | 32 | ALBEDO -= pow(abs(UV.x - 0.5), 7) * edge_darken; 33 | ALBEDO -= pow(abs(UV.y - 0.5), 6) * edge_darken; 34 | 35 | ALBEDO -= pow(abs(UV.x - 0.5) * 2.0, edge_burn_ramp) * edge_burn; 36 | ALBEDO -= pow(abs(UV.y - 0.5) * 2.0, edge_burn_ramp) * edge_burn; 37 | 38 | EMISSION = ALBEDO * emission_amount; 39 | } 40 | 41 | METALLIC = 0.3; 42 | } -------------------------------------------------------------------------------- /project/shaders/device_screen.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://2u4wsevt0osc 2 | -------------------------------------------------------------------------------- /project/shaders/device_screen_glass.gdshader: -------------------------------------------------------------------------------- 1 | // NOTE: Shader automatically converted from Godot Engine 4.2.2.stable's StandardMaterial3D. 2 | 3 | shader_type spatial; 4 | render_mode blend_add,depth_draw_opaque,cull_front,diffuse_burley,specular_schlick_ggx; 5 | 6 | uniform vec4 albedo : source_color; 7 | uniform float roughness : hint_range(0,1); 8 | uniform float specular; 9 | uniform float metallic; 10 | uniform float specular_light_size: hint_range(0.0, 1.0) = 0.1; 11 | uniform float specular_light_opacity= 0.975; 12 | 13 | float DistributionGGX(float cos_theta_m, float alpha) 14 | { 15 | float alpha2 = alpha * alpha; 16 | float d = 1.0 + (alpha2 - 1.00) * cos_theta_m * cos_theta_m; 17 | d = d < specular_light_size ? 1.0 - specular_light_opacity : 1.0; 18 | return alpha2 / (PI * d * d); 19 | } 20 | 21 | float GeometryGGX(float NdotL, float NdotV, float alpha) 22 | { 23 | return 0.5 / mix(2.0 * NdotL * NdotV, NdotL + NdotV, alpha); 24 | } 25 | 26 | vec3 SchlickBaseReflectivity(float metallic_, float specular_, vec3 albedo_) 27 | { 28 | float dielectric = 0.1 * specular_ * specular_; 29 | return mix(vec3(dielectric), albedo_, vec3(metallic_)); 30 | } 31 | 32 | float SchlickFresnel(float u) 33 | { 34 | float m = 1.0 - u; 35 | float m2 = m * m; 36 | return m2 * m2 * m; 37 | } 38 | 39 | void fragment() { 40 | ALBEDO = albedo.rgb; 41 | METALLIC = metallic; 42 | ROUGHNESS = roughness; 43 | SPECULAR = specular; 44 | ALPHA *= albedo.a; 45 | } 46 | 47 | void light() { 48 | //SPECULAR_LIGHT = LIGHT_COLOR * SPECULAR_AMOUNT * ATTENUATION; 49 | vec3 half = normalize(VIEW + LIGHT) * 1.0; 50 | float NdotL = max(dot(NORMAL, LIGHT), 0.0); 51 | float NdotV = max(dot(NORMAL, VIEW), 0.0); 52 | float NdotH = max(dot(NORMAL, half), 0.0); 53 | float LdotH = max(dot(LIGHT, half), 0.0); 54 | float ggxAlpha = 0.1 * 1.0; 55 | float D = DistributionGGX(NdotH, ggxAlpha); 56 | float G = GeometryGGX(NdotL, NdotV, ggxAlpha); 57 | vec3 f0 = SchlickBaseReflectivity(METALLIC * 0.001, SPECULAR_AMOUNT, ALBEDO); 58 | float LdotH5 = SchlickFresnel(LdotH); 59 | float f90 = clamp(50.0 * f0.g, 0.0, 1.0); 60 | vec3 F = f0 + (f90 - f0) * LdotH5; 61 | vec3 specularBRDF = clamp(NdotL * D * G * F, 0.0, 1.0); 62 | vec3 light_color = LIGHT_COLOR / length(LIGHT_COLOR); 63 | SPECULAR_LIGHT += specularBRDF * light_color * 1.0; 64 | } 65 | -------------------------------------------------------------------------------- /project/shaders/device_screen_glass.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://bpp0n34npuj1s 2 | -------------------------------------------------------------------------------- /project/shaders/kaleidoscope.gdshader: -------------------------------------------------------------------------------- 1 | shader_type spatial; 2 | render_mode unshaded; 3 | 4 | uniform sampler2D albedo: repeat_enable, filter_nearest, source_color; 5 | uniform vec2 uv_min = vec2(0); 6 | uniform vec2 uv_max = vec2(1); 7 | 8 | uniform vec3 color_bg: source_color = vec3(0); 9 | uniform vec3 color_fg: source_color = vec3(1); 10 | 11 | uniform vec2 polar_offset; 12 | uniform float offset = 0.0; 13 | uniform float scroll = 0.0; 14 | 15 | vec2 rect_to_polar(vec2 p, float o) { 16 | return vec2(length(p), atan(p.y + o, p.x + o)); 17 | } 18 | 19 | vec2 wrap(vec2 vec, vec2 mn, vec2 mx) { 20 | return mn + mod(vec, mx - mn); 21 | } 22 | 23 | void fragment() { 24 | vec2 uv = rect_to_polar(abs(UV + polar_offset), offset) - vec2(scroll); 25 | 26 | vec4 color = texture(albedo, wrap(uv, uv_min, uv_max)); 27 | if (color.a == 1.0) { 28 | ALBEDO = color_fg; 29 | } else { 30 | ALBEDO = color_bg; 31 | } 32 | 33 | //ALPHA = clamp(ALBEDO.r + 0.5, 0.0, 1.0); 34 | } -------------------------------------------------------------------------------- /project/shaders/kaleidoscope.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://b83xmcjonolrn 2 | -------------------------------------------------------------------------------- /project/shaders/noise.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_nearest; 4 | 5 | uniform float noise_offset: hint_range(0.0, 1.0) = 0.5; 6 | uniform float noise_strength = 0.015; 7 | uniform float noise_speed = 10.0; 8 | 9 | float rand(vec2 co) { 10 | return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); 11 | } 12 | 13 | void fragment() { 14 | 15 | //COLOR = mix(COLOR, vec4(vec3(rand(pixel_uv + rand(vec2(TIME)))), 1.0), 0.03); 16 | COLOR = texture(SCREEN_TEXTURE, SCREEN_UV); 17 | 18 | float n = fract(abs(rand(UV + rand(vec2(floor(TIME * noise_speed)))))) - noise_offset; 19 | COLOR = mix(COLOR, COLOR + vec4(vec3(n), 1.0), noise_strength); 20 | } 21 | -------------------------------------------------------------------------------- /project/shaders/noise.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://cou0xf7r66qe1 2 | -------------------------------------------------------------------------------- /project/shaders/panel_blur.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap_anisotropic; 4 | 5 | uniform float blur_amount: hint_range(0.0, 8.0) = 0.0; 6 | 7 | uniform vec3 panel_color: source_color = vec3(0); 8 | uniform float panel_opacity: hint_range(0.0, 1.0) = 1.0; 9 | 10 | uniform sampler2D noise_texture: filter_nearest; 11 | uniform float noise_strength = 0.015; 12 | 13 | float rand(vec2 co) { 14 | return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); 15 | } 16 | 17 | void fragment() { 18 | COLOR = textureLod(SCREEN_TEXTURE, SCREEN_UV, blur_amount); 19 | 20 | COLOR.rgb = mix(COLOR.rgb, panel_color, panel_opacity); 21 | 22 | vec3 noise = texture(noise_texture, SCREEN_UV).rgb - vec3(0.5); 23 | COLOR.rgb = mix(COLOR.rgb, COLOR.rgb + noise, noise_strength); 24 | } -------------------------------------------------------------------------------- /project/shaders/panel_blur.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://egeyyolvm0rs 2 | -------------------------------------------------------------------------------- /project/shaders/post_process.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | group_uniforms Fisheye; 4 | 5 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap, repeat_enable, source_color; 6 | 7 | uniform float effect = -1.0; 8 | uniform float effect_scale = 1.0; 9 | uniform float crop = 1.0; 10 | 11 | uniform float warp_amount = 1.0; 12 | uniform float warp_aspect = 1.0; 13 | 14 | uniform float border_alpha = 1.0; 15 | 16 | group_uniforms Chromatic_Abberation; 17 | 18 | uniform float ca_amount = 1.0; 19 | 20 | 21 | uniform float mirror_blur = 1.0; 22 | uniform float reflection_amount = 0.5; 23 | uniform vec4 mirror_overlay: source_color = vec4(1.0, 1.0, 1.0, 0.05); 24 | 25 | uniform vec3 border_color: source_color = vec3(0.1); 26 | uniform float border_shadow_range = 5.0; 27 | uniform float border_shadow_ramp = 0.5; 28 | 29 | uniform float vignette_ramp = 1.0; 30 | uniform float vignette_range = 0.9; 31 | 32 | //float vignette(vec2 uv){ 33 | //vec2 delta = uv - 0.5; 34 | //float delta2 = dot(delta.xy, delta.xy); 35 | //float delta4 = pow(delta2, vignette_intensity); 36 | //return clamp(1.0 - delta4, 0.0, 1.0); 37 | //} 38 | 39 | vec2 distort(vec2 uv) { 40 | vec2 delta = uv - 0.5; 41 | float delta2 = dot(delta.xy, delta.xy); 42 | float delta4 = delta2 * delta2; 43 | float delta_offset = delta4 * warp_amount; 44 | 45 | return uv + delta * delta_offset; 46 | } 47 | 48 | // Adds a black border to hide stretched pixel created by the warp effect 49 | float border (vec2 uv){ 50 | float radius = 0.00; 51 | radius = max(min(min(abs(radius * 2.0), abs(1.0)), abs(1.0)), 1e-5); 52 | vec2 abs_uv = abs(uv * 2.0 - 1.0) - vec2(1.0, 1.0) + radius; 53 | float dist = length(max(vec2(0.0), abs_uv)) / radius; 54 | float square = smoothstep(0.96, 1.0, dist); 55 | return clamp(1.0 - square, 0.0, 1.0); 56 | } 57 | 58 | vec2 mirror(vec2 uv) { 59 | if (uv.x > 1.0) { uv.x = 2.0 - uv.x; } 60 | else if (uv.x < 0.0) { uv.x = 1.0 - uv.x; } 61 | if (uv.y > 1.0) { uv.y = 2.0 - uv.y; } 62 | else if (uv.y < 0.0) { uv.y = 1.0 - uv.y; } 63 | return uv; 64 | } 65 | 66 | float mirror_lod(vec2 uv) { 67 | if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) { return 0.0; } 68 | else { return mirror_blur; } 69 | } 70 | 71 | bool is_in_mirror(vec2 uv) { 72 | return !(uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0); 73 | } 74 | 75 | void fragment() { 76 | //vec2 uv = SCREEN_UV * 2.0; 77 | //uv.x = uv.x - 1.0; 78 | //uv.y = uv.y - 1.0; 79 | 80 | vec2 uv = distort(SCREEN_UV); 81 | vec2 uv_r = uv + abs(uv.x) * vec2(ca_amount / 100.0, 0.0); 82 | vec2 uv_g = uv; 83 | vec2 uv_b = uv - abs(uv.x) * vec2(ca_amount / 100.0, 0.0); 84 | 85 | COLOR.r = textureLod(SCREEN_TEXTURE, mirror(uv_r), mirror_lod(uv_r)).r; 86 | COLOR.g = textureLod(SCREEN_TEXTURE, mirror(uv_g), mirror_lod(uv_g)).g; 87 | COLOR.b = textureLod(SCREEN_TEXTURE, mirror(uv_b), mirror_lod(uv_b)).b; 88 | 89 | 90 | 91 | 92 | vec2 mirror_uv = mirror(uv); 93 | float border_depth = clamp(max(abs(0.5 - uv.x), abs(0.5 - uv.y)), 0, 1) * 2.0; 94 | float screen_depth = clamp(max(abs(0.5 - mirror_uv.x), abs(0.5 - mirror_uv.y)), 0, 1) * 2.0; 95 | float border_shadow = clamp(pow((border_depth - 1.000) * border_shadow_range, border_shadow_ramp), 0, 1) + 0.1; 96 | 97 | float screen_vignette = 1.0 - clamp(abs(border_depth - 1.95) * vignette_range, 0.0, 1.0); 98 | 99 | 100 | if (is_in_mirror(uv)) { 101 | COLOR.rgb *= reflection_amount * border_shadow; 102 | COLOR.rgb *= mirror_overlay.rgb; 103 | } else { 104 | COLOR.rgb *= 1.0 - vec3(pow(screen_vignette, vignette_ramp)); 105 | } 106 | 107 | if (border_depth > 1.0) { 108 | COLOR.rgb += border_color * border_shadow; 109 | COLOR.rgb = clamp(COLOR.rgb, vec3(0), vec3(1)); 110 | } 111 | 112 | 113 | //COLOR.rgb = texture(SCREEN_TEXTURE, uv).rgb; 114 | //COLOR.rgb *= clamp(border(uv) + border_alpha, 0.0, 1.0); 115 | 116 | //COLOR.rgb *= vignette(uv) * vignette_opacity; 117 | 118 | } -------------------------------------------------------------------------------- /project/shaders/post_process.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://ddeledy6hskpq 2 | -------------------------------------------------------------------------------- /project/shaders/screen_blur.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap_anisotropic; 4 | 5 | uniform float blur_amount = 0.0; 6 | 7 | uniform vec3 tint_color: source_color = vec3(1); 8 | uniform float tint_amount: hint_range(0.0, 1.0) = 1.0; 9 | 10 | uniform float brightness: hint_range(0.0, 2.0) = 1.0; 11 | 12 | uniform sampler2D noise_texture: filter_nearest; 13 | uniform float noise_strength = 0.015; 14 | uniform float noise_speed = 1.0; 15 | 16 | float rand(vec2 co) { 17 | return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); 18 | } 19 | 20 | vec2 uv_rotate(vec2 uv, vec2 pivot, float rotation) { 21 | mat2 rotation_matrix=mat2( 22 | vec2(sin(rotation),-cos(rotation)), 23 | vec2(cos(rotation),sin(rotation)) 24 | ); 25 | uv -= pivot; 26 | uv= uv*rotation_matrix; 27 | uv += pivot; 28 | return uv; 29 | } 30 | 31 | void fragment() { 32 | COLOR = textureLod(SCREEN_TEXTURE, SCREEN_UV, blur_amount); 33 | 34 | COLOR.rgb = mix(COLOR.rgb, tint_color, tint_amount); 35 | 36 | COLOR.rgb = mix(vec3(0), COLOR.rgb, brightness); 37 | vec3 noise = texture(noise_texture, SCREEN_UV + rand((SCREEN_UV + TIME) * noise_speed)).rgb - vec3(0.5); 38 | COLOR.rgb = mix(COLOR.rgb, COLOR.rgb + noise, noise_strength); 39 | } 40 | -------------------------------------------------------------------------------- /project/shaders/screen_blur.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://okxo3d88kn1h 2 | -------------------------------------------------------------------------------- /project/shaders/vhs.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://i526eiqcypjg 2 | -------------------------------------------------------------------------------- /project/shaders/vhs2.gdshader: -------------------------------------------------------------------------------- 1 | shader_type canvas_item; 2 | 3 | group_uniforms Wiggle; 4 | uniform float wiggle : hint_range(0.0, 1.5, 0.01) = 0.03; 5 | uniform float wiggle_speed : hint_range(0.0, 100.0, 1.0) = 25; 6 | group_uniforms Smear; 7 | uniform float smear : hint_range(0.0, 2.0) = 1.0; 8 | 9 | uniform sampler2D Source : hint_screen_texture, filter_linear_mipmap, repeat_disable; 10 | 11 | group_uniforms Blur; 12 | uniform int blur_samples : hint_range(3, 15, 1) = 15; 13 | 14 | float onOff(float a, float b, float c, float framecount) { 15 | return step(c, sin((framecount * 0.001) + a * cos((framecount * 0.001) * b))); 16 | } 17 | 18 | vec2 jumpy(vec2 uv, float framecount) { 19 | vec2 look = uv; 20 | float window = 1.0 / (1.0 + 80.0 * (look.y - mod(framecount / 4.0, 1.0)) * (look.y - mod(framecount / 4.0, 1.0))); 21 | look.x += 0.05 * sin(look.y * 10.0 + framecount) / 20.0 * onOff(4.0, 4.0, 0.3, framecount) * (0.5 + cos(framecount * 20.0)) * window; 22 | float vShift = (0.1 * wiggle) * 0.4 * onOff(2.0, 3.0, 0.9, framecount) * (sin(framecount) * sin(framecount * 20.0) + (0.5 + 0.1 * sin(framecount * 200.0) * cos(framecount))); 23 | look.y = mod(look.y - 0.01 * vShift, 1.0); 24 | return look; 25 | } 26 | 27 | vec2 Circle(float Start, float Points, float Point) { 28 | float Rad = (3.141592 * 2.0 * (1.0 / Points)) * (Point + Start); 29 | return vec2(-(.3 + Rad), cos(Rad)); 30 | } 31 | 32 | vec3 rgb2yiq(vec3 c) { 33 | return vec3( 34 | (0.2989 * c.x + 0.5959 * c.y + 0.2115 * c.z), 35 | (0.5870 * c.x - 0.2744 * c.y - 0.5229 * c.z), 36 | (0.1140 * c.x - 0.3216 * c.y + 0.3114 * c.z) 37 | ); 38 | } 39 | 40 | vec3 yiq2rgb(vec3 c) { 41 | return vec3( 42 | (1.0 * c.x + 1.0 * c.y + 1.0 * c.z), 43 | (0.956 * c.x - 0.2720 * c.y - 1.1060 * c.z), 44 | (0.6210 * c.x - 0.6474 * c.y + 1.7046 * c.z) 45 | ); 46 | } 47 | 48 | vec3 Blur(vec2 uv, float d, int samples) { 49 | vec3 sum = vec3(0.0); 50 | float W = 1.0 / float(samples); 51 | for (int i = 0; i < samples; ++i) { 52 | float t = (sin(TIME * 5.0 + uv.y * 5.0)) / 10.0; 53 | 54 | t = 0.0; 55 | vec2 PixelOffset = vec2(d + 0.0005 * t, 0); 56 | 57 | float Start = 2.0 / float(samples); 58 | vec2 Scale = 0.66 * 4.0 * 2.0 * PixelOffset.xy; 59 | 60 | vec3 N = texture(Source, uv + Circle(Start, float(samples), float(i)) * Scale).rgb; 61 | sum += N * W; 62 | } 63 | return sum; 64 | } 65 | 66 | void fragment() { 67 | vec2 uv = UV; 68 | 69 | float d=0.1-round(mod(TIME/3.0,1.0))*.1;; 70 | uv = jumpy(uv, mod(TIME * wiggle_speed, 7.0)); 71 | 72 | float s = 0.0001 * -d + 0.0001 * wiggle *(sin(TIME * wiggle_speed)); 73 | float e = min(.30,pow(max(0.0,cos(uv.y*4.0+.3)-.75)*(s+0.5)*1.0,3.0))*25.0; 74 | float r = (TIME*(2.0*s)); 75 | uv.x += abs(r*pow(min(.003,(-uv.y+(.01*mod(TIME, 5.0))))*3.0,2.0)) * wiggle; 76 | 77 | d = 0.051+abs(sin(s/4.0)); 78 | float c = max(0.0001,.002*d) * smear; 79 | vec4 final; 80 | 81 | final.rgb = Blur(uv, c + c * uv.x, blur_samples); 82 | float y = rgb2yiq(final.rgb).r; 83 | 84 | uv.x += 0.01 * d; 85 | c *= 6.0; 86 | final.rgb = Blur(uv, c, blur_samples); 87 | float i = rgb2yiq(final.rgb).g; 88 | 89 | uv.x += 0.005 * d; 90 | c *= 2.50; 91 | final.rgb = Blur(uv, c, blur_samples); 92 | float q = rgb2yiq(final.rgb).b; 93 | final.rgb = yiq2rgb(vec3(y, i, q)) - pow(s + e * 2.0, 3.0); 94 | 95 | final.a = 1.0; 96 | 97 | COLOR = final; 98 | } 99 | -------------------------------------------------------------------------------- /project/shaders/vhs2.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://ckswjnsuddnrt 2 | -------------------------------------------------------------------------------- /project/shaders/vhs3.gdshader.uid: -------------------------------------------------------------------------------- 1 | uid://6tp4l6soye54 2 | -------------------------------------------------------------------------------- /project/ui/label_header.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | @icon("res://assets/icon/Label.png") 3 | extends VBoxContainer 4 | 5 | @export var text: String = "": 6 | set(value): 7 | text = value 8 | 9 | if not is_inside_tree(): await ready 10 | 11 | %Label.text = value 12 | %RichTextLabel.text = "[b]%s[/b]" % value 13 | 14 | @export var panel_style: StyleBox = null: 15 | set(value): 16 | panel_style = value 17 | 18 | if not is_inside_tree(): await ready 19 | 20 | %PanelLeft["theme_override_styles/panel"] = value 21 | %PanelRight["theme_override_styles/panel"] = value 22 | 23 | @export var top_spacing := true: 24 | set(value): 25 | top_spacing = value 26 | 27 | if not is_inside_tree(): await ready 28 | 29 | %HSeparator.visible = value 30 | -------------------------------------------------------------------------------- /project/ui/label_header.gd.uid: -------------------------------------------------------------------------------- 1 | uid://ccjoebgdlbm5 2 | -------------------------------------------------------------------------------- /project/ui/label_header.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=3 uid="uid://dsgvm3dda1kjp"] 2 | 3 | [ext_resource type="Script" uid="uid://ccjoebgdlbm5" path="res://ui/label_header.gd" id="1_xttev"] 4 | 5 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g6pka"] 6 | bg_color = Color(0.6, 0.6, 0.6, 0) 7 | border_width_bottom = 1 8 | expand_margin_bottom = 1.0 9 | 10 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_nmg0a"] 11 | 12 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_p4jr5"] 13 | bg_color = Color(1, 1, 1, 0) 14 | border_width_left = 6 15 | border_color = Color(1, 1, 1, 1) 16 | expand_margin_left = 8.0 17 | expand_margin_right = 8.0 18 | 19 | [node name="LabelHeader" type="VBoxContainer"] 20 | offset_right = 99.0 21 | offset_bottom = 23.0 22 | theme_override_constants/separation = 12 23 | script = ExtResource("1_xttev") 24 | panel_style = SubResource("StyleBoxFlat_g6pka") 25 | 26 | [node name="HSeparator" type="HSeparator" parent="."] 27 | unique_name_in_owner = true 28 | layout_mode = 2 29 | theme_override_constants/separation = -1 30 | theme_override_styles/separator = SubResource("StyleBoxEmpty_nmg0a") 31 | 32 | [node name="PanelContainer" type="PanelContainer" parent="."] 33 | custom_minimum_size = Vector2(0, 20) 34 | layout_mode = 2 35 | size_flags_vertical = 4 36 | theme_override_styles/panel = SubResource("StyleBoxFlat_p4jr5") 37 | 38 | [node name="RichTextLabel" type="RichTextLabel" parent="PanelContainer"] 39 | unique_name_in_owner = true 40 | custom_minimum_size = Vector2(0, 20) 41 | layout_mode = 2 42 | size_flags_vertical = 4 43 | theme_override_font_sizes/bold_font_size = 14 44 | bbcode_enabled = true 45 | text = "[center][b][/b][/center]" 46 | scroll_active = false 47 | 48 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 49 | visible = false 50 | layout_mode = 2 51 | 52 | [node name="PanelLeft" type="Panel" parent="HBoxContainer"] 53 | unique_name_in_owner = true 54 | layout_mode = 2 55 | size_flags_horizontal = 3 56 | size_flags_vertical = 4 57 | theme_override_styles/panel = SubResource("StyleBoxFlat_g6pka") 58 | 59 | [node name="Label" type="Label" parent="HBoxContainer"] 60 | unique_name_in_owner = true 61 | layout_mode = 2 62 | size_flags_horizontal = 4 63 | 64 | [node name="PanelRight" type="Panel" parent="HBoxContainer"] 65 | unique_name_in_owner = true 66 | layout_mode = 2 67 | size_flags_horizontal = 3 68 | size_flags_vertical = 4 69 | theme_override_styles/panel = SubResource("StyleBoxFlat_g6pka") 70 | 71 | [node name="HSeparator2" type="HSeparator" parent="."] 72 | layout_mode = 2 73 | theme_override_constants/separation = -1 74 | theme_override_styles/separator = SubResource("StyleBoxEmpty_nmg0a") 75 | -------------------------------------------------------------------------------- /project/ui/setting_base.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cysd8cijvmdp5 2 | -------------------------------------------------------------------------------- /project/ui/setting_bool.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | @export var value := false: 6 | set(p_value): 7 | value = p_value 8 | await _update() 9 | force_update() 10 | 11 | @export var text_true := "On": 12 | set(value): 13 | text_true = value 14 | _update() 15 | 16 | @export var text_false := "Off": 17 | set(value): 18 | text_false = value 19 | _update() 20 | 21 | 22 | func _ready() -> void: 23 | super() 24 | %CheckButton.toggled.connect(func(p_value: bool) -> void: 25 | value = p_value 26 | ) 27 | _update() 28 | 29 | 30 | func _update() -> void: 31 | if not is_inside_tree(): await ready 32 | 33 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 34 | %CheckButton.disabled = !enabled 35 | 36 | if setting_name == "": 37 | %LabelName.visible = false 38 | else: 39 | %LabelName.visible = true 40 | %LabelName.text = setting_name 41 | 42 | %LabelName.custom_minimum_size.x = setting_name_min_width 43 | %HBoxContainer.set("theme_override_constants/separation", setting_name_indent) 44 | 45 | %CheckButton.set_pressed_no_signal(value) 46 | %LabelValue.text = text_true if value else text_false 47 | 48 | 49 | func init(p_value: Variant, changed_fn: Callable) -> void: 50 | assert(p_value is bool) 51 | super(p_value, changed_fn) 52 | -------------------------------------------------------------------------------- /project/ui/setting_bool.gd.uid: -------------------------------------------------------------------------------- 1 | uid://r5juyuukwrew 2 | -------------------------------------------------------------------------------- /project/ui/setting_bool.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=9 format=3 uid="uid://c5kj1uj0ohnmm"] 2 | 3 | [ext_resource type="Script" uid="uid://r5juyuukwrew" path="res://ui/setting_bool.gd" id="1_0smb8"] 4 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_b6avg"] 5 | 6 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_skb08"] 7 | 8 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_c1ghm"] 9 | 10 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_kxv6b"] 11 | 12 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_na5e0"] 13 | 14 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o2jme"] 15 | 16 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_s1diy"] 17 | 18 | [node name="SettingBool" type="PanelContainer"] 19 | offset_right = 132.0 20 | offset_bottom = 27.0 21 | size_flags_horizontal = 3 22 | size_flags_vertical = 4 23 | theme = ExtResource("1_b6avg") 24 | theme_type_variation = &"SettingBackground" 25 | script = ExtResource("1_0smb8") 26 | 27 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 28 | layout_mode = 2 29 | 30 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] 31 | unique_name_in_owner = true 32 | layout_mode = 2 33 | theme_override_constants/separation = 0 34 | 35 | [node name="Control" type="Control" parent="HBoxContainer/HBoxContainer"] 36 | layout_mode = 2 37 | 38 | [node name="LabelName" type="Label" parent="HBoxContainer/HBoxContainer"] 39 | unique_name_in_owner = true 40 | visible = false 41 | custom_minimum_size = Vector2(160, 0) 42 | layout_mode = 2 43 | text = "test" 44 | 45 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 46 | layout_mode = 2 47 | size_flags_horizontal = 3 48 | theme_type_variation = &"SettingControl" 49 | 50 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 51 | layout_mode = 2 52 | size_flags_vertical = 4 53 | theme_override_constants/separation = 8 54 | 55 | [node name="LabelValue" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 56 | unique_name_in_owner = true 57 | custom_minimum_size = Vector2(60, 0) 58 | layout_mode = 2 59 | size_flags_horizontal = 3 60 | text = "Off" 61 | horizontal_alignment = 2 62 | vertical_alignment = 1 63 | autowrap_mode = 1 64 | 65 | [node name="CheckButton" type="CheckButton" parent="HBoxContainer/PanelContainer/HBoxContainer"] 66 | unique_name_in_owner = true 67 | layout_mode = 2 68 | size_flags_horizontal = 4 69 | size_flags_vertical = 4 70 | theme_override_styles/disabled = SubResource("StyleBoxEmpty_skb08") 71 | theme_override_styles/hover_pressed_mirrored = SubResource("StyleBoxEmpty_c1ghm") 72 | theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_kxv6b") 73 | theme_override_styles/hover = SubResource("StyleBoxEmpty_na5e0") 74 | theme_override_styles/pressed = SubResource("StyleBoxEmpty_o2jme") 75 | theme_override_styles/normal = SubResource("StyleBoxEmpty_s1diy") 76 | -------------------------------------------------------------------------------- /project/ui/setting_color.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name SettingColor extends SettingBase 3 | 4 | @onready var reset_value: Color = value 5 | 6 | @export var value := Color.WHITE: 7 | set(p_value): 8 | value = p_value 9 | await _update() 10 | force_update() 11 | 12 | @export var edit_alpha := true: 13 | set(p_value): 14 | edit_alpha = p_value 15 | _update() 16 | 17 | @export var show_html := true: 18 | set(p_value): 19 | show_html = p_value 20 | _update() 21 | 22 | @export var panel_style_value: StyleBox = null: 23 | set(p_value): 24 | panel_style_value = p_value 25 | _update() 26 | 27 | 28 | func _ready() -> void: 29 | super() 30 | %ColorPickerButton.color_changed.connect(func(p_value: Color) -> void: 31 | value = p_value 32 | ) 33 | # reset to default handler 34 | %ColorPickerButton.gui_input.connect(func(event: InputEvent) -> void: 35 | if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT and event.pressed: 36 | %ColorPickerButton.accept_event() 37 | value = reset_value 38 | ) 39 | _update() 40 | 41 | 42 | func _update() -> void: 43 | if not is_inside_tree(): await ready 44 | 45 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 46 | %ColorPickerButton.disabled = !enabled 47 | %ColorPickerButton.edit_alpha = edit_alpha 48 | 49 | if setting_name == "": 50 | %LabelName.visible = false 51 | %HBoxContainer.visible = false 52 | else: 53 | %LabelName.text = setting_name 54 | %LabelName.visible = true 55 | %HBoxContainer.visible = true 56 | 57 | %PanelContainer.set("theme_override_styles/panel", panel_style_value) 58 | 59 | %LabelName.custom_minimum_size.x = setting_name_min_width 60 | %HBoxContainer.set("theme_override_constants/separation", setting_name_indent) 61 | 62 | %ColorPickerButton.color = value 63 | %LabelValue.text = "#%s" % value.to_html(false).to_upper() 64 | %LabelValue.visible = show_html 65 | 66 | 67 | func init(p_value: Variant, changed_fn: Callable) -> void: 68 | assert(p_value is Color) 69 | super(p_value, changed_fn) 70 | 71 | 72 | func get_color_picker() -> ColorPicker: 73 | return %ColorPickerButton.get_picker() 74 | -------------------------------------------------------------------------------- /project/ui/setting_color.gd.uid: -------------------------------------------------------------------------------- 1 | uid://bsnchhhsgn3yl 2 | -------------------------------------------------------------------------------- /project/ui/setting_color.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://b62oydgjq232n"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_2hx14"] 4 | [ext_resource type="Script" uid="uid://bsnchhhsgn3yl" path="res://ui/setting_color.gd" id="2_wkti7"] 5 | 6 | [node name="SettingColor" type="PanelContainer"] 7 | offset_right = 132.0 8 | offset_bottom = 27.0 9 | size_flags_horizontal = 3 10 | size_flags_vertical = 4 11 | theme = ExtResource("1_2hx14") 12 | theme_type_variation = &"SettingBackground" 13 | script = ExtResource("2_wkti7") 14 | 15 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 16 | layout_mode = 2 17 | 18 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] 19 | unique_name_in_owner = true 20 | visible = false 21 | layout_mode = 2 22 | theme_override_constants/separation = 0 23 | 24 | [node name="Control" type="Control" parent="HBoxContainer/HBoxContainer"] 25 | layout_mode = 2 26 | 27 | [node name="LabelName" type="Label" parent="HBoxContainer/HBoxContainer"] 28 | unique_name_in_owner = true 29 | visible = false 30 | custom_minimum_size = Vector2(160, 0) 31 | layout_mode = 2 32 | text = "s" 33 | 34 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 35 | unique_name_in_owner = true 36 | layout_mode = 2 37 | size_flags_horizontal = 3 38 | theme_type_variation = &"SettingControl" 39 | 40 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 41 | layout_mode = 2 42 | theme_override_constants/separation = 8 43 | 44 | [node name="LabelValue" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 45 | unique_name_in_owner = true 46 | custom_minimum_size = Vector2(30, 0) 47 | layout_mode = 2 48 | size_flags_horizontal = 3 49 | text = "#FFFFFF" 50 | horizontal_alignment = 2 51 | vertical_alignment = 1 52 | autowrap_mode = 1 53 | 54 | [node name="ColorPickerButton" type="ColorPickerButton" parent="HBoxContainer/PanelContainer/HBoxContainer"] 55 | unique_name_in_owner = true 56 | layout_mode = 2 57 | size_flags_horizontal = 3 58 | color = Color(1, 1, 1, 1) 59 | -------------------------------------------------------------------------------- /project/ui/setting_file.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | class_name SettingFile extends SettingBase 3 | 4 | @export var value := "": 5 | set(p_value): 6 | value = p_value 7 | await _update() 8 | force_update() 9 | 10 | @export var empty_text := "Open File...": 11 | set(p_value): 12 | empty_text = p_value 13 | _update() 14 | 15 | @export var filters := "*.png, *.jpg, *.jpeg, *.hdr, *.ogv; Supported Filetypes": 16 | set(p_value): 17 | filters = p_value 18 | _update() 19 | 20 | @export var edit_alpha := true: 21 | set(p_value): 22 | edit_alpha = p_value 23 | _update() 24 | 25 | @export var show_html := true: 26 | set(p_value): 27 | show_html = p_value 28 | _update() 29 | 30 | @export var panel_style_value: StyleBox = null: 31 | set(p_value): 32 | panel_style_value = p_value 33 | _update() 34 | 35 | 36 | func _ready() -> void: 37 | super() 38 | _update() 39 | %Button.pressed.connect(open_file_dialog) 40 | %FileDialog.file_selected.connect(on_file_selected) 41 | 42 | func on_file_selected(path: String) -> void: 43 | value = path 44 | 45 | func open_file_dialog() -> void: 46 | # wrap callable as this one will be automatically disconnected 47 | # var callback := func(path: String) -> void: file_selected_fn.call(path) 48 | # %FileDialog.file_selected.connect(callback, CONNECT_ONE_SHOT) 49 | # %FileDialog.canceled.connect(func() -> void: 50 | # %FileDialog.files_selected.disconnect(callback) 51 | # , CONNECT_ONE_SHOT) 52 | %FileDialog.show() 53 | 54 | func _update() -> void: 55 | if not is_inside_tree(): await ready 56 | 57 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 58 | 59 | if setting_name == "": 60 | %LabelName.visible = false 61 | %HBoxContainer.visible = false 62 | else: 63 | %LabelName.text = setting_name 64 | %LabelName.visible = true 65 | %HBoxContainer.visible = true 66 | 67 | %FileDialog.filters = [filters] 68 | 69 | %PanelContainer.set("theme_override_styles/panel", panel_style_value) 70 | 71 | %LabelName.custom_minimum_size.x = setting_name_min_width 72 | %HBoxContainer.set("theme_override_constants/separation", setting_name_indent) 73 | 74 | %Button.text = value.get_file() if value != "" else empty_text 75 | 76 | 77 | func init(p_value: Variant, changed_fn: Callable) -> void: 78 | assert(p_value is String) 79 | super(p_value, changed_fn) 80 | 81 | 82 | func get_color_picker() -> ColorPicker: 83 | return %ColorPickerButton.get_picker() 84 | -------------------------------------------------------------------------------- /project/ui/setting_file.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dnmedvpnmf641 2 | -------------------------------------------------------------------------------- /project/ui/setting_file.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=3 uid="uid://dh6y5qxmki43x"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_8lfnr"] 4 | [ext_resource type="Script" uid="uid://dnmedvpnmf641" path="res://ui/setting_file.gd" id="2_sexd4"] 5 | [ext_resource type="Texture2D" uid="uid://58ird2h11kc6" path="res://assets/icon/Load.png" id="3_lncwf"] 6 | 7 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_1lqcu"] 8 | 9 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_2vtvl"] 10 | 11 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hhnov"] 12 | 13 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ivsvg"] 14 | 15 | [node name="SettingFile" type="PanelContainer"] 16 | offset_right = 132.0 17 | offset_bottom = 27.0 18 | size_flags_horizontal = 3 19 | size_flags_vertical = 4 20 | theme = ExtResource("1_8lfnr") 21 | theme_type_variation = &"SettingBackground" 22 | script = ExtResource("2_sexd4") 23 | 24 | [node name="FileDialog" type="FileDialog" parent="."] 25 | unique_name_in_owner = true 26 | auto_translate_mode = 1 27 | title = "Open a File" 28 | position = Vector2i(0, 36) 29 | size = Vector2i(392, 183) 30 | ok_button_text = "Open" 31 | dialog_hide_on_ok = true 32 | file_mode = 0 33 | access = 2 34 | filters = PackedStringArray("*.png, *.jpg, *.jpeg, *.hdr, *.ogv; Supported Filetypes") 35 | use_native_dialog = true 36 | 37 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 38 | layout_mode = 2 39 | 40 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] 41 | unique_name_in_owner = true 42 | visible = false 43 | layout_mode = 2 44 | theme_override_constants/separation = 0 45 | 46 | [node name="Control" type="Control" parent="HBoxContainer/HBoxContainer"] 47 | layout_mode = 2 48 | 49 | [node name="LabelName" type="Label" parent="HBoxContainer/HBoxContainer"] 50 | unique_name_in_owner = true 51 | visible = false 52 | custom_minimum_size = Vector2(160, 0) 53 | layout_mode = 2 54 | text = "t" 55 | 56 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 57 | unique_name_in_owner = true 58 | layout_mode = 2 59 | size_flags_horizontal = 3 60 | theme_type_variation = &"SettingControl" 61 | 62 | [node name="Button" type="Button" parent="HBoxContainer/PanelContainer"] 63 | unique_name_in_owner = true 64 | layout_mode = 2 65 | theme_override_styles/hover_pressed = SubResource("StyleBoxEmpty_1lqcu") 66 | theme_override_styles/hover = SubResource("StyleBoxEmpty_2vtvl") 67 | theme_override_styles/pressed = SubResource("StyleBoxEmpty_hhnov") 68 | theme_override_styles/normal = SubResource("StyleBoxEmpty_ivsvg") 69 | text = "Open File..." 70 | icon = ExtResource("3_lncwf") 71 | text_overrun_behavior = 3 72 | clip_text = true 73 | -------------------------------------------------------------------------------- /project/ui/setting_number.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | var _is_int_type := false 6 | 7 | @export var setting_value_min_width := 40: 8 | set(p_value): 9 | setting_value_min_width = p_value 10 | _update() 11 | 12 | @export var min_value := 0.0: 13 | set(value): 14 | min_value = value 15 | _update() 16 | 17 | @export var max_value := 100.0: 18 | set(value): 19 | max_value = value 20 | _update() 21 | 22 | @export var step := 1.0: 23 | set(value): 24 | step = value 25 | _update() 26 | 27 | @export var value := 0.0: 28 | set(p_value): 29 | value = p_value 30 | await _update() 31 | value = %HSlider.value 32 | force_update() 33 | 34 | @export var show_ticks := false: 35 | set(p_value): 36 | show_ticks = p_value 37 | _update() 38 | 39 | @export var as_percent := false: 40 | set(p_value): 41 | as_percent = p_value 42 | _update() 43 | 44 | @export var percent_factor := 100.0: 45 | set(p_value): 46 | percent_factor = p_value 47 | _update() 48 | 49 | @export var format_string := "%.2f": 50 | set(p_value): 51 | format_string = p_value 52 | _update() 53 | 54 | func _ready() -> void: 55 | super() 56 | %HSlider.value_changed.connect(func(p_value: float) -> void: 57 | value = p_value 58 | ) 59 | %LineEdit.gui_input.connect(func(event: InputEvent) -> void: 60 | if event is InputEventMouseButton: 61 | if event.button_index == MOUSE_BUTTON_LEFT and event.pressed: 62 | %LineEdit.accept_event() 63 | if _is_int_type: 64 | %LineEdit.text = "%d" % %HSlider.value 65 | else: 66 | %LineEdit.text = "%.2f" % %HSlider.value 67 | %LineEdit.select_all() 68 | ) 69 | 70 | %LineEdit.text_submitted.connect(func(text: String) -> void: 71 | %LineEdit.deselect() 72 | %LineEdit.release_focus() 73 | if _is_int_type and text.is_valid_int(): 74 | value = text.to_int() 75 | elif text.is_valid_float(): 76 | value = text.to_float() 77 | else: 78 | _update() 79 | ) 80 | 81 | _update() 82 | 83 | func _update() -> void: 84 | 85 | if not is_inside_tree(): await ready 86 | 87 | _is_int_type = is_zero_approx(abs(step - int(step))) 88 | 89 | %HSlider.step = step 90 | %HSlider.min_value = min_value 91 | %HSlider.max_value = max_value 92 | %HSlider.value = value 93 | %HSlider.editable = enabled 94 | 95 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 96 | 97 | if setting_name == "": 98 | %LabelName.visible = false 99 | else: 100 | %LabelName.visible = true 101 | %LabelName.text = setting_name 102 | 103 | %LabelName.custom_minimum_size.x = setting_name_min_width 104 | %HBoxContainer.set("theme_override_constants/separation", setting_name_indent) 105 | 106 | var eff_value: float = %HSlider.value * percent_factor if as_percent else %HSlider.value 107 | %LineEdit.text = format_string % eff_value 108 | %LineEdit.custom_minimum_size.x = setting_value_min_width 109 | 110 | if show_ticks and _is_int_type: 111 | %HSlider.tick_count = max_value - min_value + 1 112 | else: 113 | %HSlider.tick_count = 0 114 | 115 | 116 | func init(p_value: Variant, changed_fn: Callable) -> void: 117 | assert(p_value is float or p_value is int) 118 | super(p_value, changed_fn) 119 | -------------------------------------------------------------------------------- /project/ui/setting_number.gd.uid: -------------------------------------------------------------------------------- 1 | uid://l5swq166jqtv 2 | -------------------------------------------------------------------------------- /project/ui/setting_number.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=9 format=3 uid="uid://b1r8nehsgp111"] 2 | 3 | [ext_resource type="Script" uid="uid://l5swq166jqtv" path="res://ui/setting_number.gd" id="1_j8a44"] 4 | 5 | [sub_resource type="Gradient" id="Gradient_ho1ui"] 6 | offsets = PackedFloat32Array(0) 7 | colors = PackedColorArray(1, 1, 1, 0.5) 8 | 9 | [sub_resource type="GradientTexture2D" id="GradientTexture2D_eluto"] 10 | gradient = SubResource("Gradient_ho1ui") 11 | width = 2 12 | height = 8 13 | 14 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_bobr6"] 15 | content_margin_top = 2.0 16 | content_margin_bottom = 5.0 17 | bg_color = Color(1, 1, 1, 1) 18 | border_width_left = 5 19 | border_width_top = 2 20 | border_width_right = 5 21 | border_width_bottom = 1 22 | border_color = Color(1, 1, 1, 0) 23 | 24 | [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_csbp2"] 25 | content_margin_top = 2.0 26 | content_margin_bottom = 5.0 27 | bg_color = Color(1, 1, 1, 0.25) 28 | border_width_left = 5 29 | border_width_top = 2 30 | border_width_right = 5 31 | border_width_bottom = 1 32 | border_color = Color(1, 1, 1, 0) 33 | corner_radius_top_left = 1 34 | corner_radius_top_right = 1 35 | corner_radius_bottom_right = 1 36 | corner_radius_bottom_left = 1 37 | anti_aliasing = false 38 | 39 | [sub_resource type="Theme" id="Theme_86xd2"] 40 | HSlider/constants/center_grabber = 0 41 | HSlider/icons/tick = SubResource("GradientTexture2D_eluto") 42 | HSlider/styles/grabber_area = SubResource("StyleBoxFlat_bobr6") 43 | HSlider/styles/grabber_area_highlight = SubResource("StyleBoxFlat_bobr6") 44 | HSlider/styles/slider = SubResource("StyleBoxFlat_csbp2") 45 | 46 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ch326"] 47 | 48 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4mt0q"] 49 | 50 | [node name="SettingNumber" type="PanelContainer"] 51 | offset_right = 74.0 52 | offset_bottom = 27.0 53 | size_flags_horizontal = 3 54 | size_flags_vertical = 0 55 | theme_type_variation = &"SettingBackground" 56 | script = ExtResource("1_j8a44") 57 | 58 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 59 | layout_mode = 2 60 | 61 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] 62 | unique_name_in_owner = true 63 | layout_mode = 2 64 | theme_override_constants/separation = 0 65 | 66 | [node name="Control" type="Control" parent="HBoxContainer/HBoxContainer"] 67 | layout_mode = 2 68 | 69 | [node name="LabelName" type="Label" parent="HBoxContainer/HBoxContainer"] 70 | unique_name_in_owner = true 71 | visible = false 72 | custom_minimum_size = Vector2(160, 0) 73 | layout_mode = 2 74 | text = "test" 75 | 76 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 77 | layout_mode = 2 78 | size_flags_horizontal = 3 79 | theme_type_variation = &"SettingControl" 80 | 81 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 82 | layout_mode = 2 83 | theme_override_constants/separation = 8 84 | 85 | [node name="HSlider" type="HSlider" parent="HBoxContainer/PanelContainer/HBoxContainer"] 86 | unique_name_in_owner = true 87 | custom_minimum_size = Vector2(40, 0) 88 | layout_mode = 2 89 | size_flags_horizontal = 3 90 | size_flags_vertical = 4 91 | theme = SubResource("Theme_86xd2") 92 | ticks_on_borders = true 93 | 94 | [node name="LineEdit" type="LineEdit" parent="HBoxContainer/PanelContainer/HBoxContainer"] 95 | unique_name_in_owner = true 96 | custom_minimum_size = Vector2(40, 0) 97 | layout_mode = 2 98 | size_flags_horizontal = 0 99 | size_flags_vertical = 4 100 | theme_override_constants/minimum_character_width = 0 101 | theme_override_styles/read_only = SubResource("StyleBoxEmpty_ch326") 102 | theme_override_styles/normal = SubResource("StyleBoxEmpty_4mt0q") 103 | text = "0.00" 104 | flat = true 105 | select_all_on_focus = true 106 | -------------------------------------------------------------------------------- /project/ui/setting_options.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | @export_enum("Arrows", "Dropdown") var setting_type := 0: 6 | set(value): 7 | setting_type = value 8 | _update() 9 | 10 | @export var items: PackedStringArray 11 | 12 | @export var value := -1: 13 | set(p_value): 14 | value = clampi(p_value, 0, items.size() - 1) if items.size() else -1 15 | await _update() 16 | force_update() 17 | 18 | 19 | func _ready() -> void: 20 | super() 21 | %ButtonLeft.pressed.connect(func() -> void: value -= 1) 22 | %ButtonRight.pressed.connect(func() -> void: value += 1) 23 | %OptionButton.item_selected.connect(func(p_value: int) -> void: 24 | value = p_value 25 | ) 26 | _update() 27 | 28 | 29 | func _update() -> void: 30 | 31 | if not is_inside_tree(): await ready 32 | 33 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 34 | 35 | if setting_name == "": 36 | %LabelName.visible = false 37 | else: 38 | %LabelName.visible = true 39 | %LabelName.text = setting_name 40 | 41 | %LabelName.custom_minimum_size.x = setting_name_min_width 42 | 43 | %ButtonLeft.visible = false 44 | %ButtonRight.visible = false 45 | %LabelValue.visible = false 46 | %OptionButton.visible = false 47 | 48 | match setting_type: 49 | 0: # arrows 50 | %ButtonLeft.visible = true 51 | %ButtonLeft.disabled = !enabled or value <= 0 52 | 53 | %ButtonRight.visible = true 54 | %ButtonRight.disabled = !enabled or value >= items.size() - 1 55 | 56 | %LabelValue.visible = true 57 | %LabelValue.text = items[value] if items.size() > 0 else "" 58 | 1: # dropdown 59 | %OptionButton.visible = true 60 | if items.size(): 61 | %OptionButton.clear() 62 | for item: String in items: 63 | %OptionButton.add_item(item) 64 | %OptionButton.selected = value 65 | 66 | 67 | func init(p_value: Variant, changed_fn: Callable) -> void: 68 | assert(p_value is int) 69 | super(p_value, changed_fn) 70 | -------------------------------------------------------------------------------- /project/ui/setting_options.gd.uid: -------------------------------------------------------------------------------- 1 | uid://haaof64iq0x 2 | -------------------------------------------------------------------------------- /project/ui/setting_options.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=11 format=3 uid="uid://bgsxagi62acni"] 2 | 3 | [ext_resource type="Script" uid="uid://haaof64iq0x" path="res://ui/setting_options.gd" id="1_62opn"] 4 | [ext_resource type="Texture2D" uid="uid://berrl0h2qkkl1" path="res://assets/icon/Left.png" id="2_nt80f"] 5 | [ext_resource type="Texture2D" uid="uid://cy2a8jk77wcps" path="res://assets/icon/Right.png" id="3_b0e6p"] 6 | 7 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o323t"] 8 | content_margin_left = 4.0 9 | content_margin_top = 0.0 10 | content_margin_right = 4.0 11 | content_margin_bottom = 0.0 12 | 13 | [sub_resource type="Theme" id="Theme_5snsi"] 14 | Button/styles/disabled = SubResource("StyleBoxEmpty_o323t") 15 | Button/styles/hover = SubResource("StyleBoxEmpty_o323t") 16 | Button/styles/hover_mirrored = SubResource("StyleBoxEmpty_o323t") 17 | Button/styles/hover_pressed = SubResource("StyleBoxEmpty_o323t") 18 | Button/styles/normal = SubResource("StyleBoxEmpty_o323t") 19 | Button/styles/pressed = SubResource("StyleBoxEmpty_o323t") 20 | 21 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4o1pr"] 22 | 23 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_fgopn"] 24 | 25 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o8f60"] 26 | 27 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hvit7"] 28 | 29 | [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_m06sh"] 30 | 31 | [node name="SettingOptions" type="PanelContainer"] 32 | offset_right = 132.0 33 | offset_bottom = 27.0 34 | size_flags_horizontal = 3 35 | size_flags_vertical = 4 36 | theme_type_variation = &"SettingBackground" 37 | script = ExtResource("1_62opn") 38 | 39 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 40 | layout_mode = 2 41 | 42 | [node name="LabelName" type="Label" parent="HBoxContainer"] 43 | unique_name_in_owner = true 44 | visible = false 45 | custom_minimum_size = Vector2(160, 0) 46 | layout_mode = 2 47 | text = "tes" 48 | 49 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 50 | layout_mode = 2 51 | size_flags_horizontal = 3 52 | theme_type_variation = &"SettingControl" 53 | 54 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 55 | layout_mode = 2 56 | size_flags_vertical = 4 57 | theme_override_constants/separation = 8 58 | 59 | [node name="ButtonLeft" type="Button" parent="HBoxContainer/PanelContainer/HBoxContainer"] 60 | unique_name_in_owner = true 61 | layout_mode = 2 62 | size_flags_vertical = 4 63 | theme = SubResource("Theme_5snsi") 64 | disabled = true 65 | icon = ExtResource("2_nt80f") 66 | flat = true 67 | 68 | [node name="LabelValue" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 69 | unique_name_in_owner = true 70 | custom_minimum_size = Vector2(60, 0) 71 | layout_mode = 2 72 | size_flags_horizontal = 3 73 | horizontal_alignment = 1 74 | vertical_alignment = 1 75 | autowrap_mode = 1 76 | 77 | [node name="ButtonRight" type="Button" parent="HBoxContainer/PanelContainer/HBoxContainer"] 78 | unique_name_in_owner = true 79 | layout_mode = 2 80 | size_flags_vertical = 4 81 | theme = SubResource("Theme_5snsi") 82 | disabled = true 83 | icon = ExtResource("3_b0e6p") 84 | flat = true 85 | 86 | [node name="OptionButton" type="OptionButton" parent="HBoxContainer/PanelContainer/HBoxContainer"] 87 | unique_name_in_owner = true 88 | visible = false 89 | layout_mode = 2 90 | size_flags_horizontal = 3 91 | size_flags_vertical = 4 92 | theme_override_styles/focus = SubResource("StyleBoxEmpty_4o1pr") 93 | theme_override_styles/disabled = SubResource("StyleBoxEmpty_fgopn") 94 | theme_override_styles/hover = SubResource("StyleBoxEmpty_o8f60") 95 | theme_override_styles/pressed = SubResource("StyleBoxEmpty_hvit7") 96 | theme_override_styles/normal = SubResource("StyleBoxEmpty_m06sh") 97 | flat = true 98 | alignment = 1 99 | -------------------------------------------------------------------------------- /project/ui/setting_string.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | @export var value := "": 6 | set(p_value): 7 | value = p_value 8 | await _update() 9 | force_update() 10 | 11 | 12 | func _ready() -> void: 13 | super() 14 | %LineEdit.text_changed.connect(func(p_value: String) -> void: 15 | value = p_value 16 | ) 17 | _update() 18 | 19 | 20 | func _update() -> void: 21 | if not is_inside_tree(): await ready 22 | 23 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 24 | %LineEdit.editable = enabled 25 | 26 | if setting_name == "": 27 | %LabelName.visible = false 28 | else: 29 | %LabelName.visible = true 30 | %LabelName.text = setting_name 31 | 32 | %LabelName.custom_minimum_size.x = setting_name_min_width 33 | %HBoxContainer.set("theme_override_constants/separation", setting_name_indent) 34 | 35 | if not %LineEdit.has_focus(): 36 | %LineEdit.text = value 37 | 38 | 39 | func init(p_value: Variant, changed_fn: Callable) -> void: 40 | assert(p_value is bool) 41 | super(p_value, changed_fn) 42 | -------------------------------------------------------------------------------- /project/ui/setting_string.gd.uid: -------------------------------------------------------------------------------- 1 | uid://c7061wpajhuc4 2 | -------------------------------------------------------------------------------- /project/ui/setting_string.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://c5kj6fcv4g2ux"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_7udu3"] 4 | [ext_resource type="Script" uid="uid://c7061wpajhuc4" path="res://ui/setting_string.gd" id="2_jwi12"] 5 | 6 | [node name="SettingString" type="PanelContainer"] 7 | offset_right = 132.0 8 | offset_bottom = 27.0 9 | size_flags_horizontal = 3 10 | size_flags_vertical = 4 11 | theme = ExtResource("1_7udu3") 12 | theme_type_variation = &"SettingBackground" 13 | script = ExtResource("2_jwi12") 14 | 15 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 16 | layout_mode = 2 17 | 18 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] 19 | unique_name_in_owner = true 20 | layout_mode = 2 21 | theme_override_constants/separation = 0 22 | 23 | [node name="Control" type="Control" parent="HBoxContainer/HBoxContainer"] 24 | layout_mode = 2 25 | 26 | [node name="LabelName" type="Label" parent="HBoxContainer/HBoxContainer"] 27 | unique_name_in_owner = true 28 | visible = false 29 | custom_minimum_size = Vector2(160, 0) 30 | layout_mode = 2 31 | text = "t" 32 | 33 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 34 | layout_mode = 2 35 | size_flags_horizontal = 3 36 | theme_type_variation = &"SettingControl" 37 | 38 | [node name="LineEdit" type="LineEdit" parent="HBoxContainer/PanelContainer"] 39 | unique_name_in_owner = true 40 | layout_mode = 2 41 | -------------------------------------------------------------------------------- /project/ui/setting_vec2.gd.uid: -------------------------------------------------------------------------------- 1 | uid://dlkrwb25egyq 2 | -------------------------------------------------------------------------------- /project/ui/setting_vec2.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=3 uid="uid://d2wnq8ai2ykus"] 2 | 3 | [ext_resource type="Script" uid="uid://dlkrwb25egyq" path="res://ui/setting_vec2.gd" id="1_6vysa"] 4 | 5 | [node name="SettingVec2" type="PanelContainer"] 6 | offset_right = 132.0 7 | offset_bottom = 27.0 8 | size_flags_horizontal = 3 9 | size_flags_vertical = 4 10 | theme_type_variation = &"SettingBackground" 11 | script = ExtResource("1_6vysa") 12 | 13 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 14 | layout_mode = 2 15 | 16 | [node name="LabelName" type="Label" parent="HBoxContainer"] 17 | unique_name_in_owner = true 18 | visible = false 19 | custom_minimum_size = Vector2(160, 0) 20 | layout_mode = 2 21 | 22 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 23 | layout_mode = 2 24 | size_flags_horizontal = 3 25 | theme_type_variation = &"SettingControl" 26 | 27 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 28 | layout_mode = 2 29 | size_flags_vertical = 4 30 | theme_override_constants/separation = 8 31 | 32 | [node name="LabelX" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 33 | unique_name_in_owner = true 34 | layout_mode = 2 35 | text = "x" 36 | 37 | [node name="SpinBoxX" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 38 | unique_name_in_owner = true 39 | layout_mode = 2 40 | size_flags_horizontal = 3 41 | theme_type_variation = &"SettingControlVec2SpinBox" 42 | step = 0.01 43 | select_all_on_focus = true 44 | 45 | [node name="LabelY" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 46 | unique_name_in_owner = true 47 | layout_mode = 2 48 | text = "y" 49 | 50 | [node name="SpinBoxY" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 51 | unique_name_in_owner = true 52 | layout_mode = 2 53 | size_flags_horizontal = 3 54 | theme_type_variation = &"SettingControlVec2SpinBox" 55 | step = 0.01 56 | select_all_on_focus = true 57 | -------------------------------------------------------------------------------- /project/ui/setting_vec2i.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | @export var value := Vector2i.ZERO: 6 | set(p_value): 7 | value = p_value.clamp(min_value, max_value) 8 | await _update() 9 | force_update() 10 | 11 | @export var min_value := Vector2i.ZERO: 12 | set(p_value): 13 | min_value = p_value 14 | value = value 15 | 16 | @export var max_value := Vector2i(100, 100): 17 | set(p_value): 18 | max_value = p_value 19 | value = value 20 | 21 | @export var show_updown_arrows := false: 22 | set(p_value): 23 | show_updown_arrows = p_value 24 | _update() 25 | 26 | @export var prefix_x := "x": 27 | set(value): 28 | prefix_x = value 29 | _update() 30 | 31 | @export var prefix_y := "y": 32 | set(value): 33 | prefix_y = value 34 | _update() 35 | 36 | @export var prefix_min_width := 0: 37 | set(value): 38 | prefix_min_width = value 39 | _update() 40 | 41 | 42 | func _ready() -> void: 43 | super() 44 | %SpinBoxX.get_line_edit().theme_type_variation = "SettingControlVec2LineEdit" 45 | %SpinBoxY.get_line_edit().theme_type_variation = "SettingControlVec2LineEdit" 46 | 47 | %SpinBoxX.value_changed.connect(func(p_value: float) -> void: 48 | value = Vector2i(int(p_value), value.y) 49 | ) 50 | %SpinBoxY.value_changed.connect(func(p_value: float) -> void: 51 | value = Vector2i(value.x, int(p_value)) 52 | ) 53 | 54 | _update() 55 | 56 | 57 | func _update() -> void: 58 | 59 | if not is_inside_tree(): await ready 60 | 61 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 62 | %SpinBoxX.editable = enabled 63 | %SpinBoxY.editable = enabled 64 | 65 | %LabelName.visible = setting_name != "" 66 | %LabelName.text = setting_name 67 | %LabelName.custom_minimum_size.x = setting_name_min_width 68 | 69 | %SpinBoxX.theme_type_variation = "" if show_updown_arrows else "SettingControlVec2SpinBox" 70 | %SpinBoxX.min_value = min_value.x 71 | %SpinBoxX.max_value = max_value.x 72 | %SpinBoxX.value = value.x 73 | 74 | %SpinBoxY.theme_type_variation = "" if show_updown_arrows else "SettingControlVec2SpinBox" 75 | %SpinBoxY.min_value = min_value.y 76 | %SpinBoxY.max_value = max_value.y 77 | %SpinBoxY.value = value.y 78 | 79 | %LabelX.custom_minimum_size.x = prefix_min_width 80 | %LabelX.text = prefix_x 81 | 82 | %LabelY.custom_minimum_size.x = prefix_min_width 83 | %LabelY.text = prefix_y 84 | 85 | 86 | func init(p_value: Variant, changed_fn: Callable) -> void: 87 | assert(p_value is Vector2i) 88 | super(p_value, changed_fn) 89 | -------------------------------------------------------------------------------- /project/ui/setting_vec2i.gd.uid: -------------------------------------------------------------------------------- 1 | uid://d28tou0wfook5 2 | -------------------------------------------------------------------------------- /project/ui/setting_vec2i.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://bevoopcdq5dsh"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_0vr4u"] 4 | [ext_resource type="Script" uid="uid://d28tou0wfook5" path="res://ui/setting_vec2i.gd" id="1_uglar"] 5 | 6 | [node name="SettingVec2i" type="PanelContainer"] 7 | offset_right = 132.0 8 | offset_bottom = 27.0 9 | size_flags_horizontal = 3 10 | size_flags_vertical = 4 11 | theme = ExtResource("1_0vr4u") 12 | theme_type_variation = &"SettingBackground" 13 | script = ExtResource("1_uglar") 14 | 15 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 16 | layout_mode = 2 17 | 18 | [node name="LabelName" type="Label" parent="HBoxContainer"] 19 | unique_name_in_owner = true 20 | visible = false 21 | custom_minimum_size = Vector2(160, 0) 22 | layout_mode = 2 23 | 24 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 25 | layout_mode = 2 26 | size_flags_horizontal = 3 27 | theme_type_variation = &"SettingControl" 28 | 29 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 30 | layout_mode = 2 31 | size_flags_vertical = 4 32 | theme_override_constants/separation = 8 33 | 34 | [node name="LabelX" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 35 | unique_name_in_owner = true 36 | layout_mode = 2 37 | text = "x" 38 | horizontal_alignment = 2 39 | 40 | [node name="SpinBoxX" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 41 | unique_name_in_owner = true 42 | layout_mode = 2 43 | size_flags_horizontal = 3 44 | theme_type_variation = &"SettingControlVec2SpinBox" 45 | select_all_on_focus = true 46 | 47 | [node name="LabelY" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 48 | unique_name_in_owner = true 49 | layout_mode = 2 50 | text = "y" 51 | horizontal_alignment = 2 52 | 53 | [node name="SpinBoxY" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 54 | unique_name_in_owner = true 55 | layout_mode = 2 56 | size_flags_horizontal = 3 57 | theme_type_variation = &"SettingControlVec2SpinBox" 58 | select_all_on_focus = true 59 | -------------------------------------------------------------------------------- /project/ui/setting_vec3.gd: -------------------------------------------------------------------------------- 1 | @tool 2 | extends SettingBase 3 | 4 | 5 | @export var value := Vector3.ZERO: 6 | set(p_value): 7 | value = p_value.clamp(min_value, max_value) 8 | await _update() 9 | force_update() 10 | 11 | @export var min_value := Vector3.ZERO: 12 | set(p_value): 13 | min_value = p_value 14 | value = value 15 | _update() 16 | 17 | @export var max_value := Vector3(100, 100, 100): 18 | set(p_value): 19 | max_value = p_value 20 | value = value 21 | _update() 22 | 23 | @export var show_updown_arrows := false: 24 | set(p_value): 25 | show_updown_arrows = p_value 26 | _update() 27 | 28 | @export var prefix_x := "x": 29 | set(value): 30 | prefix_x = value 31 | _update() 32 | 33 | @export var prefix_y := "y": 34 | set(value): 35 | prefix_y = value 36 | _update() 37 | 38 | @export var prefix_z := "z": 39 | set(value): 40 | prefix_z = value 41 | _update() 42 | 43 | @export var suffix := "": 44 | set(value): 45 | suffix = value 46 | _update() 47 | 48 | 49 | func _ready() -> void: 50 | super() 51 | %SpinBoxX.get_line_edit().theme_type_variation = "SettingControlVec2LineEdit" 52 | %SpinBoxY.get_line_edit().theme_type_variation = "SettingControlVec2LineEdit" 53 | %SpinBoxZ.get_line_edit().theme_type_variation = "SettingControlVec2LineEdit" 54 | 55 | %SpinBoxX.value_changed.connect(func(p_value: float) -> void: 56 | value = Vector3(p_value, value.y, value.z) 57 | ) 58 | %SpinBoxY.value_changed.connect(func(p_value: float) -> void: 59 | value = Vector3(value.x, p_value, value.z) 60 | ) 61 | %SpinBoxZ.value_changed.connect(func(p_value: float) -> void: 62 | value = Vector3(value.x, value.y, p_value) 63 | ) 64 | %SpinBoxX.get_line_edit().focus_exited.connect(_update_format) 65 | %SpinBoxY.get_line_edit().focus_exited.connect(_update_format) 66 | %SpinBoxZ.get_line_edit().focus_exited.connect(_update_format) 67 | 68 | _update() 69 | 70 | 71 | func _update() -> void: 72 | 73 | if not is_inside_tree(): await ready 74 | 75 | modulate = Color.WHITE if enabled else Color.from_hsv(0, 0, 0.25) 76 | %SpinBoxX.editable = enabled 77 | %SpinBoxY.editable = enabled 78 | %SpinBoxZ.editable = enabled 79 | 80 | if setting_name == "": 81 | %LabelName.visible = false 82 | else: 83 | %LabelName.visible = true 84 | %LabelName.text = setting_name 85 | 86 | %LabelName.custom_minimum_size.x = setting_name_min_width 87 | 88 | %SpinBoxX.theme_type_variation = "" if show_updown_arrows else "SettingControlVec2SpinBox" 89 | %SpinBoxY.theme_type_variation = "" if show_updown_arrows else "SettingControlVec2SpinBox" 90 | %SpinBoxZ.theme_type_variation = "" if show_updown_arrows else "SettingControlVec2SpinBox" 91 | 92 | %SpinBoxX.min_value = min_value.x 93 | %SpinBoxX.max_value = max_value.x 94 | 95 | %SpinBoxY.min_value = min_value.y 96 | %SpinBoxY.max_value = max_value.y 97 | 98 | %SpinBoxZ.min_value = min_value.z 99 | %SpinBoxZ.max_value = max_value.z 100 | 101 | %SpinBoxX.value = value.x 102 | %SpinBoxY.value = value.y 103 | %SpinBoxZ.value = value.z 104 | 105 | %LabelX.text = prefix_x 106 | %LabelY.text = prefix_y 107 | %LabelZ.text = prefix_z 108 | 109 | call_deferred("_update_format") 110 | 111 | 112 | func init(p_value: Variant, changed_fn: Callable) -> void: 113 | assert(p_value is Vector2i) 114 | super(p_value, changed_fn) 115 | 116 | 117 | func _update_format() -> void: 118 | if is_inside_tree(): await get_tree().process_frame 119 | %SpinBoxX.get_line_edit().text = "%.2f %s" % [value.x, suffix] 120 | %SpinBoxY.get_line_edit().text = "%.2f %s" % [value.y, suffix] 121 | %SpinBoxZ.get_line_edit().text = "%.2f %s" % [value.z, suffix] 122 | -------------------------------------------------------------------------------- /project/ui/setting_vec3.gd.uid: -------------------------------------------------------------------------------- 1 | uid://cunmuvx6l0bqw 2 | -------------------------------------------------------------------------------- /project/ui/setting_vec3.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=3 uid="uid://cr88nkt47umul"] 2 | 3 | [ext_resource type="Theme" uid="uid://c8lf57q2f23tp" path="res://ui/menu_theme.tres" id="1_5h7am"] 4 | [ext_resource type="Script" uid="uid://cunmuvx6l0bqw" path="res://ui/setting_vec3.gd" id="1_v816i"] 5 | 6 | [node name="SettingVec3" type="PanelContainer"] 7 | offset_right = 132.0 8 | offset_bottom = 27.0 9 | size_flags_horizontal = 3 10 | size_flags_vertical = 4 11 | theme = ExtResource("1_5h7am") 12 | theme_type_variation = &"SettingBackground" 13 | script = ExtResource("1_v816i") 14 | 15 | [node name="HBoxContainer" type="HBoxContainer" parent="."] 16 | layout_mode = 2 17 | 18 | [node name="LabelName" type="Label" parent="HBoxContainer"] 19 | unique_name_in_owner = true 20 | visible = false 21 | custom_minimum_size = Vector2(160, 0) 22 | layout_mode = 2 23 | text = "t" 24 | 25 | [node name="PanelContainer" type="PanelContainer" parent="HBoxContainer"] 26 | layout_mode = 2 27 | size_flags_horizontal = 3 28 | theme_type_variation = &"SettingControl" 29 | 30 | [node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/PanelContainer"] 31 | layout_mode = 2 32 | size_flags_vertical = 4 33 | theme_override_constants/separation = 8 34 | 35 | [node name="LabelX" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 36 | unique_name_in_owner = true 37 | layout_mode = 2 38 | text = "x" 39 | 40 | [node name="SpinBoxX" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 41 | unique_name_in_owner = true 42 | layout_mode = 2 43 | size_flags_horizontal = 3 44 | theme_type_variation = &"SettingControlVec2SpinBox" 45 | step = 0.01 46 | select_all_on_focus = true 47 | 48 | [node name="LabelY" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 49 | unique_name_in_owner = true 50 | layout_mode = 2 51 | text = "y" 52 | 53 | [node name="SpinBoxY" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 54 | unique_name_in_owner = true 55 | layout_mode = 2 56 | size_flags_horizontal = 3 57 | theme_type_variation = &"SettingControlVec2SpinBox" 58 | step = 0.01 59 | select_all_on_focus = true 60 | 61 | [node name="LabelZ" type="Label" parent="HBoxContainer/PanelContainer/HBoxContainer"] 62 | unique_name_in_owner = true 63 | layout_mode = 2 64 | text = "z" 65 | 66 | [node name="SpinBoxZ" type="SpinBox" parent="HBoxContainer/PanelContainer/HBoxContainer"] 67 | unique_name_in_owner = true 68 | layout_mode = 2 69 | size_flags_horizontal = 3 70 | theme_type_variation = &"SettingControlVec2SpinBox" 71 | step = 0.01 72 | select_all_on_focus = true 73 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/octoocto/m8gd/903b1f4d7a01021d13544a02b206eec004426b8f/screenshot.png -------------------------------------------------------------------------------- /src/display_buffer.cpp: -------------------------------------------------------------------------------- 1 | #include "display_buffer.hpp" 2 | #include "utilities.hpp" 3 | 4 | #define CHARS_PER_ROW 94 5 | #define CHARS_PER_COL 1 6 | 7 | DisplayBuffer::DisplayBuffer(int width, int height) : width(width), height(height) 8 | { 9 | byte_array = godot::PackedByteArray(); 10 | byte_array.resize(width * height * 4); 11 | bytes = byte_array.ptrw(); 12 | } 13 | 14 | DisplayBuffer::~DisplayBuffer() {} 15 | 16 | void DisplayBuffer::set_background_alpha(uint8_t a) 17 | { 18 | bg_alpha = a; 19 | 20 | // update colors in image buffer 21 | for (int i = 0; i < width; i++) 22 | { 23 | for (int j = 0; j < height; j++) 24 | { 25 | color c = get_pixel(i, j); 26 | set_pixel(i, j, c.r, c.g, c.b); 27 | } 28 | } 29 | 30 | // print("set background alpha to %d", a); 31 | } 32 | 33 | void DisplayBuffer::draw_rect(int x, int y, int w, int h, uint8_t r, uint8_t g, uint8_t b) 34 | { 35 | y = y + screen_offset_y; 36 | 37 | // save color as background color if was a fullscreen rect 38 | if (x == 0 && y <= 0 && w == width && h >= height) 39 | { 40 | bg_r = r; 41 | bg_g = g; 42 | bg_b = b; 43 | } 44 | 45 | if ( 46 | (w == 24 && h == 7) || 47 | (w == 30 && h == 9) || 48 | (w == 36 && h == 11) || 49 | (w == 45 && h == 13)) 50 | { 51 | append_color(r, g, b); 52 | } 53 | 54 | for (int i = x; i < x + w && x < width; i++) 55 | { 56 | for (int j = y; j < y + h && y < height; j++) 57 | { 58 | set_pixel(i, j, r, g, b); 59 | } 60 | } 61 | } 62 | 63 | void DisplayBuffer::draw_char( 64 | uint8_t ch, 65 | int x, int y, 66 | uint8_t fg_r, uint8_t fg_g, uint8_t fg_b, 67 | uint8_t bg_r, uint8_t bg_g, uint8_t bg_b) 68 | { 69 | // bitmap only covers unicode 0-127 70 | if (font_bitmap == nullptr || ch > 127) 71 | return; 72 | 73 | // starting x/y of glyph in bitmap 74 | int x0 = (ch % FONT_SHEET_COLS) * font_w; 75 | int y0 = (ch / FONT_SHEET_COLS) * font_h; 76 | 77 | y += font_offset_y + screen_offset_y; 78 | 79 | // skip drawing bg if fg color = bg color 80 | bool draw_bg = (fg_r != bg_r || fg_g != bg_g || fg_b != bg_b); 81 | 82 | for (int i = 0; i < font_w; i++) 83 | { 84 | for (int j = 0; j < font_h; j++) 85 | { 86 | if (font_bitmap->get_bit(x0 + i, y0 + j)) 87 | { 88 | set_pixel(x + i, y + j, fg_r, fg_g, fg_b); 89 | } 90 | else if (draw_bg) 91 | { 92 | set_pixel(x + i, y + j, bg_r, bg_g, bg_b); 93 | } 94 | } 95 | } 96 | 97 | // if (fg_r != 0x70 || fg_g != 0xB0 || fg_b != 0x08) 98 | // { 99 | // append_color(fg_r, fg_g, fg_b); 100 | // } 101 | // else 102 | // { 103 | // print("green size: %d, %d", x, y); 104 | // } 105 | } 106 | 107 | void DisplayBuffer::draw_waveform( 108 | int x, int y, 109 | uint8_t r, uint8_t g, uint8_t b, 110 | const uint8_t *points, uint16_t size) 111 | { 112 | // store last waveform width for case when waveform width is 0 113 | static uint16_t last_wf_size = 0; 114 | 115 | int wf_size = size; 116 | 117 | if (wf_size == 0) 118 | { 119 | wf_size = last_wf_size; 120 | } 121 | last_wf_size = wf_size; 122 | 123 | int offset_x = width - wf_size; 124 | 125 | // clear region with background color 126 | draw_rect(x + offset_x, y - screen_offset_y, wf_size, waveform_max + 1, bg_r, bg_g, bg_b); 127 | 128 | // draw points in waveform 129 | for (int i = 0; i < size; i++) 130 | { 131 | uint8_t ampl = points[i]; 132 | if (ampl > waveform_max) 133 | { 134 | ampl = waveform_max; 135 | } 136 | set_pixel(x + offset_x + i, y + ampl, r, g, b); 137 | } 138 | } -------------------------------------------------------------------------------- /src/display_buffer.hpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include "utilities.hpp" 5 | 6 | #define FONT_SHEET_COLS 16 7 | #define FONT_SHEET_ROWS 8 8 | 9 | struct color 10 | { 11 | uint8_t r; 12 | uint8_t g; 13 | uint8_t b; 14 | }; 15 | 16 | class DisplayBuffer 17 | { 18 | public: 19 | godot::PackedByteArray byte_array; 20 | uint8_t *bytes; 21 | uint16_t width; 22 | uint16_t height; 23 | 24 | godot::Ref font_bitmap; // spritesheet of all characters 25 | uint8_t font_w; // width of each char 26 | uint8_t font_h; // height of each char 27 | 28 | // changes depending on small/big/huge font 29 | int8_t screen_offset_y = 0; 30 | int8_t font_offset_y = 0; 31 | uint8_t waveform_max = 0; 32 | 33 | // cached color from fullscreen draw_rect call 34 | uint8_t bg_r = 0; 35 | uint8_t bg_g = 0; 36 | uint8_t bg_b = 0; 37 | 38 | uint8_t bg_alpha = 0xFF; 39 | 40 | godot::PackedColorArray colors; 41 | 42 | DisplayBuffer(int width, int height); 43 | ~DisplayBuffer(); 44 | 45 | void set_pixel( 46 | uint16_t x, uint16_t y, 47 | uint8_t r, uint8_t g, uint8_t b) 48 | { 49 | if (x >= width || y >= height) 50 | return; 51 | int offset = (x + y * width) * 4; // start index of 4-byte chunk 52 | bytes[offset + 0] = r; 53 | bytes[offset + 1] = g; 54 | bytes[offset + 2] = b; 55 | 56 | if (r == bg_r && g == bg_g && b == bg_b) 57 | { 58 | bytes[offset + 3] = bg_alpha; 59 | } 60 | else 61 | { 62 | bytes[offset + 3] = 0xFF; 63 | } 64 | } 65 | 66 | void append_color(uint8_t r, uint8_t g, uint8_t b) 67 | { 68 | if (colors.size() < 16) 69 | { 70 | godot::Color color = godot::Color::hex((uint32_t(r) << 24) | (uint32_t(g) << 16) | (uint32_t(b) << 8) | uint32_t(0xFF)); 71 | colors.append(color); 72 | // if (!colors.has(color)) 73 | // { 74 | // colors.append(color); 75 | // // print("adding color: %02X%02X%02X", r, g, b); 76 | // } 77 | } 78 | } 79 | 80 | color get_pixel(uint16_t x, uint16_t y) 81 | { 82 | if (x >= width) 83 | { 84 | x = width - 1; 85 | } 86 | if (y >= height) 87 | { 88 | y = height - 1; 89 | } 90 | 91 | int offset = (x + y * width) * 4; 92 | return color{ 93 | bytes[offset + 0], 94 | bytes[offset + 1], 95 | bytes[offset + 2]}; 96 | } 97 | 98 | void set_background_alpha(uint8_t a); 99 | 100 | void set_font(godot::Ref bitmap) 101 | { 102 | font_bitmap = bitmap; 103 | if (bitmap != nullptr) 104 | { 105 | font_w = bitmap->get_size().x / FONT_SHEET_COLS; 106 | font_h = bitmap->get_size().y / FONT_SHEET_ROWS; 107 | } 108 | } 109 | 110 | void draw_rect( 111 | int x, int y, 112 | int w, int h, 113 | uint8_t r, uint8_t g, uint8_t b); 114 | 115 | void draw_char( 116 | uint8_t ch, 117 | int x, int y, 118 | uint8_t fg_r, uint8_t fg_g, uint8_t fg_b, 119 | uint8_t bg_r, uint8_t bg_g, uint8_t bg_b); 120 | 121 | void draw_waveform( 122 | int x, int y, 123 | uint8_t r, uint8_t g, uint8_t b, 124 | const uint8_t *points, uint16_t wf_size); 125 | 126 | /// @brief Clear buffer with specified color in RGB8 127 | void clear(uint8_t r, uint8_t g, uint8_t b) 128 | { 129 | draw_rect(0, 0, width, height, r, g, b); 130 | } 131 | 132 | void clear_bg() 133 | { 134 | draw_rect(0, 0, width, height, bg_r, bg_g, bg_b); 135 | } 136 | }; -------------------------------------------------------------------------------- /src/register_types.cpp: -------------------------------------------------------------------------------- 1 | #include "register_types.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #include "gdm8.hpp" 10 | 11 | using namespace godot; 12 | 13 | void gdextension_initialize(ModuleInitializationLevel p_level) 14 | { 15 | if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) 16 | { 17 | ClassDB::register_class(); 18 | } 19 | } 20 | 21 | void gdextension_terminate(ModuleInitializationLevel p_level) 22 | { 23 | if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) 24 | { 25 | } 26 | } 27 | 28 | extern "C" 29 | { 30 | GDExtensionBool GDE_EXPORT libm8gd_init(GDExtensionInterfaceGetProcAddress p_get_proc_address, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) 31 | { 32 | godot::GDExtensionBinding::InitObject init_obj(p_get_proc_address, p_library, r_initialization); 33 | 34 | init_obj.register_initializer(gdextension_initialize); 35 | init_obj.register_terminator(gdextension_terminate); 36 | init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE); 37 | 38 | return init_obj.init(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/register_types.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | using namespace godot; 6 | 7 | void gdextension_initialize(ModuleInitializationLevel p_level); 8 | void gdextension_terminate(ModuleInitializationLevel p_level); 9 | -------------------------------------------------------------------------------- /src/utilities.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | template 6 | static void print(const godot::String &p_text, const VarArgs... p_args) 7 | { 8 | godot::String msg = "libm8gd: " + godot::vformat(p_text, p_args...); 9 | godot::UtilityFunctions::print(msg); 10 | } 11 | 12 | template 13 | static void printerr(const godot::String &p_text, const VarArgs... p_args) 14 | { 15 | godot::String msg = "libm8gd: " + godot::vformat(p_text, p_args...); 16 | godot::UtilityFunctions::printerr(msg); 17 | } 18 | 19 | static void printerr_bytes(uint8_t *bytes, uint32_t size) 20 | { 21 | godot::String msg = " "; 22 | for (uint16_t a = 0; a < size; a++) 23 | { 24 | msg += godot::vformat("0x%02X ", bytes[a]); 25 | } 26 | printerr(msg); 27 | } --------------------------------------------------------------------------------