diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ef79721..426b167c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,8 @@ jobs: lints: name: Check and lints runs-on: ubuntu-latest + env: + GODOT4_BIN: ${{ github.workspace }}/.bin/godot/godot4_bin steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -29,7 +31,7 @@ jobs: run: gdformat -d godot/ - name: cargo xtask install working-directory: rust - run: cargo xtask install + run: cargo xtask install --no-templates - uses: actions-rs/cargo@v1 name: cargo check with: @@ -53,6 +55,8 @@ jobs: os: [ubuntu-latest] rust: [stable] runs-on: ${{ matrix.os }} + env: + GODOT4_BIN: ${{ github.workspace }}/.bin/godot/godot4_bin steps: - name: Checkout sources uses: actions/checkout@v2 @@ -77,7 +81,7 @@ jobs: - name: cargo xtask install working-directory: rust - run: cargo xtask install + run: cargo xtask install --no-templates - name: Download grcov run: | @@ -96,12 +100,14 @@ jobs: build: name: Build and test - if: ${{ github.ref == 'refs/heads/main' }} + # Commented to test if: ${{ github.ref == 'refs/heads/main' }} strategy: matrix: - os: [windows-latest, ubuntu-latest, macos-latest] + os: [windows-latest, ubuntu-latest] rust: [stable] runs-on: ${{ matrix.os }} + env: + GODOT4_BIN: ${{ github.workspace }}/.bin/godot/godot4_bin continue-on-error: true steps: - uses: actions/checkout@v2 @@ -130,11 +136,6 @@ jobs: run: | rustup target add x86_64-apple-darwin rustup target add aarch64-apple-darwin - - uses: actions-rs/cargo@v1 - name: cargo test - with: - command: test - args: --manifest-path rust/Cargo.toml --release - uses: actions-rs/cargo@v1 if: ${{ matrix.os != 'macos-latest' }} @@ -157,6 +158,12 @@ jobs: command: build args: --manifest-path rust/Cargo.toml --release --target=aarch64-apple-darwin + - uses: actions-rs/cargo@v1 + name: cargo test + with: + command: test + args: --manifest-path rust/Cargo.toml --release + - name: Make universal library if: ${{ matrix.os == 'macos-latest' }} run: | diff --git a/.vscode/launch.json b/.vscode/launch.json index b6648200..dca0bf9a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,7 +5,7 @@ "name": "(Windows) Launch", "type": "cppvsdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot_v4.0.3-stable_win64.exe", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot" @@ -20,7 +20,7 @@ "name": "(Windows) Launch Editor", "type": "cppvsdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot_v4.0.3-stable_win64.exe", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot", @@ -36,7 +36,7 @@ "name": "(Linux) Launch Editor", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot_v4.0.3-stable_linux.x86_64", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot", @@ -52,7 +52,7 @@ "name": "(Linux) Launch", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot_v4.0.3-stable_linux.x86_64", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot" @@ -76,7 +76,7 @@ "name": "(Linux) Run Test", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot_v4.0.3-stable_linux.x86_64", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot", @@ -101,7 +101,7 @@ "name": "(MacOS) Launch Editor", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot.app/Contents/MacOS/Godot", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot", @@ -117,7 +117,7 @@ "name": "(MacOS) Launch", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/.bin/godot/Godot.app/Contents/MacOS/Godot", + "program": "${workspaceFolder}/.bin/godot/godot4_bin", "args": [ "--path", "${workspaceFolder}/godot" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 016dd445..4716dbd2 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -11,7 +11,10 @@ ], "problemMatcher": [ "$rustc" - ] + ], + "env": { + "GODOT4_BIN": "${workspaceFolder}/.bin/godot/godot4_bin" + } }, { "label": "(win) Copy GDExtension Lib", diff --git a/godot/.gitignore b/godot/.gitignore index aa1af2aa..1c835601 100644 --- a/godot/.gitignore +++ b/godot/.gitignore @@ -1,5 +1,6 @@ # Godot 4+ specific ignores .godot/editor +.godot/export_credentials.cfg # Godot-specific ignores .import/ diff --git a/godot/.godot/exported/133200997/export-0ace45b193e939f08e040c3e10c7f9fd-grabber_highlight_area.res b/godot/.godot/exported/133200997/export-0ace45b193e939f08e040c3e10c7f9fd-grabber_highlight_area.res deleted file mode 100644 index ba0a6078..00000000 Binary files a/godot/.godot/exported/133200997/export-0ace45b193e939f08e040c3e10c7f9fd-grabber_highlight_area.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-13910026f197497848761a0f5e7b7617-button_disabled.res b/godot/.godot/exported/133200997/export-13910026f197497848761a0f5e7b7617-button_disabled.res deleted file mode 100644 index 0425af1b..00000000 Binary files a/godot/.godot/exported/133200997/export-13910026f197497848761a0f5e7b7617-button_disabled.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-20924ec2fd456ca33c6d76a4d5e0d6ad-style_box_empty.res b/godot/.godot/exported/133200997/export-20924ec2fd456ca33c6d76a4d5e0d6ad-style_box_empty.res deleted file mode 100644 index 51ff021b..00000000 Binary files a/godot/.godot/exported/133200997/export-20924ec2fd456ca33c6d76a4d5e0d6ad-style_box_empty.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-3241ae44c4183a70641c2f49a93cbc3f-raycast_line.scn b/godot/.godot/exported/133200997/export-3241ae44c4183a70641c2f49a93cbc3f-raycast_line.scn deleted file mode 100644 index 6dad3ba1..00000000 Binary files a/godot/.godot/exported/133200997/export-3241ae44c4183a70641c2f49a93cbc3f-raycast_line.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-39381174508e97e89bd3db21f04b8f7f-button_normal.res b/godot/.godot/exported/133200997/export-39381174508e97e89bd3db21f04b8f7f-button_normal.res deleted file mode 100644 index b581e53a..00000000 Binary files a/godot/.godot/exported/133200997/export-39381174508e97e89bd3db21f04b8f7f-button_normal.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-3a7f3bf511e7cd2951b68963bc5b8954-flat_panel.res b/godot/.godot/exported/133200997/export-3a7f3bf511e7cd2951b68963bc5b8954-flat_panel.res deleted file mode 100644 index e2ed5c38..00000000 Binary files a/godot/.godot/exported/133200997/export-3a7f3bf511e7cd2951b68963bc5b8954-flat_panel.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-57905c0782ec2dddac50c931fb2f6d7b-line_edit_focused.res b/godot/.godot/exported/133200997/export-57905c0782ec2dddac50c931fb2f6d7b-line_edit_focused.res deleted file mode 100644 index 41edf897..00000000 Binary files a/godot/.godot/exported/133200997/export-57905c0782ec2dddac50c931fb2f6d7b-line_edit_focused.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-6080448334545697e69a00c31c4cc65d-theme.res b/godot/.godot/exported/133200997/export-6080448334545697e69a00c31c4cc65d-theme.res deleted file mode 100644 index 5cd942c1..00000000 Binary files a/godot/.godot/exported/133200997/export-6080448334545697e69a00c31c4cc65d-theme.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-667406348563dd10e2914a924a668c42-map_shader.scn b/godot/.godot/exported/133200997/export-667406348563dd10e2914a924a668c42-map_shader.scn deleted file mode 100644 index 091bb62a..00000000 Binary files a/godot/.godot/exported/133200997/export-667406348563dd10e2914a924a668c42-map_shader.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-69124dbd7d075457751abc8ac3314171-info_panel.scn b/godot/.godot/exported/133200997/export-69124dbd7d075457751abc8ac3314171-info_panel.scn deleted file mode 100644 index 8c4b54bf..00000000 Binary files a/godot/.godot/exported/133200997/export-69124dbd7d075457751abc8ac3314171-info_panel.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-6bd5f68dbcd3f2cf810cce061fdaa819-orange_buton_pressed.res b/godot/.godot/exported/133200997/export-6bd5f68dbcd3f2cf810cce061fdaa819-orange_buton_pressed.res deleted file mode 100644 index 1140c490..00000000 Binary files a/godot/.godot/exported/133200997/export-6bd5f68dbcd3f2cf810cce061fdaa819-orange_buton_pressed.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-6d22edc70c94e5560905082635c5c7b4-pointer_tooltip.scn b/godot/.godot/exported/133200997/export-6d22edc70c94e5560905082635c5c7b4-pointer_tooltip.scn deleted file mode 100644 index 182efa93..00000000 Binary files a/godot/.godot/exported/133200997/export-6d22edc70c94e5560905082635c5c7b4-pointer_tooltip.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-6f4ee05ae0a15420e8f67c7229627024-player.scn b/godot/.godot/exported/133200997/export-6f4ee05ae0a15420e8f67c7229627024-player.scn deleted file mode 100644 index add2d204..00000000 Binary files a/godot/.godot/exported/133200997/export-6f4ee05ae0a15420e8f67c7229627024-player.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-7083277a97a9cd0c01687bd83da97359-dcl_pink.res b/godot/.godot/exported/133200997/export-7083277a97a9cd0c01687bd83da97359-dcl_pink.res deleted file mode 100644 index dcdc3d25..00000000 Binary files a/godot/.godot/exported/133200997/export-7083277a97a9cd0c01687bd83da97359-dcl_pink.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-74c108647c53eeecbe5de66c8f2fbeb4-slider.res b/godot/.godot/exported/133200997/export-74c108647c53eeecbe5de66c8f2fbeb4-slider.res deleted file mode 100644 index cc983759..00000000 Binary files a/godot/.godot/exported/133200997/export-74c108647c53eeecbe5de66c8f2fbeb4-slider.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-788d1b9fa724aae06735b584a189f24e-tab_selected.res b/godot/.godot/exported/133200997/export-788d1b9fa724aae06735b584a189f24e-tab_selected.res deleted file mode 100644 index 698eb7ff..00000000 Binary files a/godot/.godot/exported/133200997/export-788d1b9fa724aae06735b584a189f24e-tab_selected.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-7d490905770f7f591b3b9d210e7c65e3-gltf_container.scn b/godot/.godot/exported/133200997/export-7d490905770f7f591b3b9d210e7c65e3-gltf_container.scn deleted file mode 100644 index 8a4b66f5..00000000 Binary files a/godot/.godot/exported/133200997/export-7d490905770f7f591b3b9d210e7c65e3-gltf_container.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-839cf4dc193bfc570305f9621885ae98-minimap.scn b/godot/.godot/exported/133200997/export-839cf4dc193bfc570305f9621885ae98-minimap.scn deleted file mode 100644 index ce766fa9..00000000 Binary files a/godot/.godot/exported/133200997/export-839cf4dc193bfc570305f9621885ae98-minimap.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-844dcce42a6b727ec7e1066102a5f3fa-grabber.res b/godot/.godot/exported/133200997/export-844dcce42a6b727ec7e1066102a5f3fa-grabber.res deleted file mode 100644 index d2ac103d..00000000 Binary files a/godot/.godot/exported/133200997/export-844dcce42a6b727ec7e1066102a5f3fa-grabber.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-8678b6db38b7a56e1b912ec1359ac48a-settings.scn b/godot/.godot/exported/133200997/export-8678b6db38b7a56e1b912ec1359ac48a-settings.scn deleted file mode 100644 index 0bdce1a6..00000000 Binary files a/godot/.godot/exported/133200997/export-8678b6db38b7a56e1b912ec1359ac48a-settings.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-88c5680536697b9e47c20f71b4027272-tab_disabled.res b/godot/.godot/exported/133200997/export-88c5680536697b9e47c20f71b4027272-tab_disabled.res deleted file mode 100644 index 6bd525e3..00000000 Binary files a/godot/.godot/exported/133200997/export-88c5680536697b9e47c20f71b4027272-tab_disabled.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-8e50d126035f4691bcbb75776e80ea14-world_environment.scn b/godot/.godot/exported/133200997/export-8e50d126035f4691bcbb75776e80ea14-world_environment.scn deleted file mode 100644 index 87adbfda..00000000 Binary files a/godot/.godot/exported/133200997/export-8e50d126035f4691bcbb75776e80ea14-world_environment.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-90a233e0caf827aed8351b602fce23f4-option_button_disabled.res b/godot/.godot/exported/133200997/export-90a233e0caf827aed8351b602fce23f4-option_button_disabled.res deleted file mode 100644 index f97af941..00000000 Binary files a/godot/.godot/exported/133200997/export-90a233e0caf827aed8351b602fce23f4-option_button_disabled.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-9e65e178d653489fc5183f5793b6d5fd-button_pressed.res b/godot/.godot/exported/133200997/export-9e65e178d653489fc5183f5793b6d5fd-button_pressed.res deleted file mode 100644 index 6c8b3f1a..00000000 Binary files a/godot/.godot/exported/133200997/export-9e65e178d653489fc5183f5793b6d5fd-button_pressed.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-a4473c054992452584419dac3232683f-grabber_area_highlight.res b/godot/.godot/exported/133200997/export-a4473c054992452584419dac3232683f-grabber_area_highlight.res deleted file mode 100644 index e77553d1..00000000 Binary files a/godot/.godot/exported/133200997/export-a4473c054992452584419dac3232683f-grabber_area_highlight.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-b17fa98194e2d6122d70529e5fb3147d-button_normal_orange.res b/godot/.godot/exported/133200997/export-b17fa98194e2d6122d70529e5fb3147d-button_normal_orange.res deleted file mode 100644 index 1d13bc54..00000000 Binary files a/godot/.godot/exported/133200997/export-b17fa98194e2d6122d70529e5fb3147d-button_normal_orange.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-b2a7edc8458debc2167a9df9846653b7-panel.res b/godot/.godot/exported/133200997/export-b2a7edc8458debc2167a9df9846653b7-panel.res deleted file mode 100644 index b1b81d51..00000000 Binary files a/godot/.godot/exported/133200997/export-b2a7edc8458debc2167a9df9846653b7-panel.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-b4c3bf5edd81a5c7eb6a572b2e737db9-tab_unselected.res b/godot/.godot/exported/133200997/export-b4c3bf5edd81a5c7eb6a572b2e737db9-tab_unselected.res deleted file mode 100644 index e78edd13..00000000 Binary files a/godot/.godot/exported/133200997/export-b4c3bf5edd81a5c7eb6a572b2e737db9-tab_unselected.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-b629c1823c6763746387a638fa76f4a5-discover.scn b/godot/.godot/exported/133200997/export-b629c1823c6763746387a638fa76f4a5-discover.scn deleted file mode 100644 index d5aa6777..00000000 Binary files a/godot/.godot/exported/133200997/export-b629c1823c6763746387a638fa76f4a5-discover.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-be5913da87fda37f0d4deac41259f2e2-map.scn b/godot/.godot/exported/133200997/export-be5913da87fda37f0d4deac41259f2e2-map.scn deleted file mode 100644 index 2bbc6535..00000000 Binary files a/godot/.godot/exported/133200997/export-be5913da87fda37f0d4deac41259f2e2-map.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-bebc8eaebe2d0db3257319fcab32f786-panel_bottom_left.scn b/godot/.godot/exported/133200997/export-bebc8eaebe2d0db3257319fcab32f786-panel_bottom_left.scn deleted file mode 100644 index f1b352ec..00000000 Binary files a/godot/.godot/exported/133200997/export-bebc8eaebe2d0db3257319fcab32f786-panel_bottom_left.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-c3e142ec6a5143fda3eab6efe674a234-option_button_normal.res b/godot/.godot/exported/133200997/export-c3e142ec6a5143fda3eab6efe674a234-option_button_normal.res deleted file mode 100644 index 2300c1a7..00000000 Binary files a/godot/.godot/exported/133200997/export-c3e142ec6a5143fda3eab6efe674a234-option_button_normal.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-c754ded60ff436dd905c4d24f944d200-rust_requester.scn b/godot/.godot/exported/133200997/export-c754ded60ff436dd905c4d24f944d200-rust_requester.scn deleted file mode 100644 index 104009d6..00000000 Binary files a/godot/.godot/exported/133200997/export-c754ded60ff436dd905c4d24f944d200-rust_requester.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-ccf7ba1c35bc2f728d4d094568420173-custom_slider_panel.res b/godot/.godot/exported/133200997/export-ccf7ba1c35bc2f728d4d094568420173-custom_slider_panel.res deleted file mode 100644 index 77a92dde..00000000 Binary files a/godot/.godot/exported/133200997/export-ccf7ba1c35bc2f728d4d094568420173-custom_slider_panel.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-cedef4dd85d39a21923df61958a0a0fa-explorer.scn b/godot/.godot/exported/133200997/export-cedef4dd85d39a21923df61958a0a0fa-explorer.scn deleted file mode 100644 index 478fc3e2..00000000 Binary files a/godot/.godot/exported/133200997/export-cedef4dd85d39a21923df61958a0a0fa-explorer.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-d49ef284b1d8c12abe4057c692ace708-orange_button_normal.res b/godot/.godot/exported/133200997/export-d49ef284b1d8c12abe4057c692ace708-orange_button_normal.res deleted file mode 100644 index bf7b2e0b..00000000 Binary files a/godot/.godot/exported/133200997/export-d49ef284b1d8c12abe4057c692ace708-orange_button_normal.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-d8d60ceb9cf95c37e713b68ee7ff7a2f-grabber_area.res b/godot/.godot/exported/133200997/export-d8d60ceb9cf95c37e713b68ee7ff7a2f-grabber_area.res deleted file mode 100644 index 85a14f54..00000000 Binary files a/godot/.godot/exported/133200997/export-d8d60ceb9cf95c37e713b68ee7ff7a2f-grabber_area.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-da41f2640fbd6d3a1fe536ddfb262b83-button_hover.res b/godot/.godot/exported/133200997/export-da41f2640fbd6d3a1fe536ddfb262b83-button_hover.res deleted file mode 100644 index 8d272993..00000000 Binary files a/godot/.godot/exported/133200997/export-da41f2640fbd6d3a1fe536ddfb262b83-button_hover.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-da9ff4a7e860be3c21fffafb427918a5-menu.scn b/godot/.godot/exported/133200997/export-da9ff4a7e860be3c21fffafb427918a5-menu.scn deleted file mode 100644 index ae6fdaf1..00000000 Binary files a/godot/.godot/exported/133200997/export-da9ff4a7e860be3c21fffafb427918a5-menu.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-dbbbc684f3b6b9f4730bb7970bbf647c-custom_slider.scn b/godot/.godot/exported/133200997/export-dbbbc684f3b6b9f4730bb7970bbf647c-custom_slider.scn deleted file mode 100644 index 41e8c9e1..00000000 Binary files a/godot/.godot/exported/133200997/export-dbbbc684f3b6b9f4730bb7970bbf647c-custom_slider.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-dbe59258b6e7c5860bca2a5bbd0223c3-main.scn b/godot/.godot/exported/133200997/export-dbe59258b6e7c5860bca2a5bbd0223c3-main.scn deleted file mode 100644 index fb08e31f..00000000 Binary files a/godot/.godot/exported/133200997/export-dbe59258b6e7c5860bca2a5bbd0223c3-main.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-e3d3907789c0ba43cb04f70d5ef7b336-orange_button_focused.res b/godot/.godot/exported/133200997/export-e3d3907789c0ba43cb04f70d5ef7b336-orange_button_focused.res deleted file mode 100644 index 8034a498..00000000 Binary files a/godot/.godot/exported/133200997/export-e3d3907789c0ba43cb04f70d5ef7b336-orange_button_focused.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-e97fec90aab1fa99c38b2af8dbec0425-orange_button_hover.res b/godot/.godot/exported/133200997/export-e97fec90aab1fa99c38b2af8dbec0425-orange_button_hover.res deleted file mode 100644 index 6a6a1cbf..00000000 Binary files a/godot/.godot/exported/133200997/export-e97fec90aab1fa99c38b2af8dbec0425-orange_button_hover.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-ef0628e7d630d1dbcb702e67166b0898-line_edit.res b/godot/.godot/exported/133200997/export-ef0628e7d630d1dbcb702e67166b0898-line_edit.res deleted file mode 100644 index 91036f51..00000000 Binary files a/godot/.godot/exported/133200997/export-ef0628e7d630d1dbcb702e67166b0898-line_edit.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-f0ba1fd7ccbbc9a08525dbdf9a20116b-grabber_area.res b/godot/.godot/exported/133200997/export-f0ba1fd7ccbbc9a08525dbdf9a20116b-grabber_area.res deleted file mode 100644 index 640ef219..00000000 Binary files a/godot/.godot/exported/133200997/export-f0ba1fd7ccbbc9a08525dbdf9a20116b-grabber_area.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-f3ba113ea94151ac3bafd6df662ff58e-player_visuals.scn b/godot/.godot/exported/133200997/export-f3ba113ea94151ac3bafd6df662ff58e-player_visuals.scn deleted file mode 100644 index b78af324..00000000 Binary files a/godot/.godot/exported/133200997/export-f3ba113ea94151ac3bafd6df662ff58e-player_visuals.scn and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-f9123795a81925035b0454bbbed70851-fake_white.res b/godot/.godot/exported/133200997/export-f9123795a81925035b0454bbbed70851-fake_white.res deleted file mode 100644 index e5f121b7..00000000 Binary files a/godot/.godot/exported/133200997/export-f9123795a81925035b0454bbbed70851-fake_white.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/export-ff2540f38701e6624ec79f5fb6b5b5f9-button_focused.res b/godot/.godot/exported/133200997/export-ff2540f38701e6624ec79f5fb6b5b5f9-button_focused.res deleted file mode 100644 index efc5036f..00000000 Binary files a/godot/.godot/exported/133200997/export-ff2540f38701e6624ec79f5fb6b5b5f9-button_focused.res and /dev/null differ diff --git a/godot/.godot/exported/133200997/file_cache b/godot/.godot/exported/133200997/file_cache deleted file mode 100644 index 404987b7..00000000 --- a/godot/.godot/exported/133200997/file_cache +++ /dev/null @@ -1,48 +0,0 @@ -res://assets/sky/krzmig/world_environment.tscn::756cdfad7ad6a29e171e7eb1268dd39a::1687948756::res://.godot/exported/133200997/export-8e50d126035f4691bcbb75776e80ea14-world_environment.scn -res://assets/test_player/player.tscn::ee47422285809c8393fd3a3c00d26d28::1688559276::res://.godot/exported/133200997/export-6f4ee05ae0a15420e8f67c7229627024-player.scn -res://assets/test_player/player_visuals.tscn::dd48fa589448935571f593be9f7b5ddd::1687966345::res://.godot/exported/133200997/export-f3ba113ea94151ac3bafd6df662ff58e-player_visuals.scn -res://assets/themes/box_flat_color/dcl_pink.tres::c537c9e323d5e6d58b46d6c6f68b10ed::1686686895::res://.godot/exported/133200997/export-7083277a97a9cd0c01687bd83da97359-dcl_pink.res -res://assets/themes/box_flat_color/fake_white.tres::7668e96d8d4c75415ee420e1a4b9309f::1686686895::res://.godot/exported/133200997/export-f9123795a81925035b0454bbbed70851-fake_white.res -res://assets/themes/custom_slider/grabber.tres::1fe5610c80433a087680a6d7aa4914db::1686686555::res://.godot/exported/133200997/export-844dcce42a6b727ec7e1066102a5f3fa-grabber.res -res://assets/themes/custom_slider/grabber_area.tres::ad3b64300c224267dcf08c8b87087c67::1686686555::res://.godot/exported/133200997/export-f0ba1fd7ccbbc9a08525dbdf9a20116b-grabber_area.res -res://assets/themes/custom_slider/grabber_area_highlight.tres::1533ea0159f123f0bf275774244b1aa6::1686686555::res://.godot/exported/133200997/export-a4473c054992452584419dac3232683f-grabber_area_highlight.res -res://assets/themes/general_slider/grabber_area.tres::a178ba57570b42598c435f70720e9876::1686686895::res://.godot/exported/133200997/export-d8d60ceb9cf95c37e713b68ee7ff7a2f-grabber_area.res -res://assets/themes/general_slider/grabber_highlight_area.tres::1c83fae7c6da6e1cfaac7b1864427dd4::1686686895::res://.godot/exported/133200997/export-0ace45b193e939f08e040c3e10c7f9fd-grabber_highlight_area.res -res://assets/themes/general_slider/slider.tres::c0a155bc0d843c8a5f7e20ecac67f00d::1686686895::res://.godot/exported/133200997/export-74c108647c53eeecbe5de66c8f2fbeb4-slider.res -res://assets/themes/tabs/tab_disabled.tres::8493fc6fd5a6c304aff295293938a913::1686686895::res://.godot/exported/133200997/export-88c5680536697b9e47c20f71b4027272-tab_disabled.res -res://assets/themes/tabs/tab_selected.tres::c904811a3e9e6694ba63b45a87d70b9c::1686686895::res://.godot/exported/133200997/export-788d1b9fa724aae06735b584a189f24e-tab_selected.res -res://assets/themes/tabs/tab_unselected.tres::beeabb1868d0b26862cca2a08c0c2836::1686686895::res://.godot/exported/133200997/export-b4c3bf5edd81a5c7eb6a572b2e737db9-tab_unselected.res -res://assets/themes/button_disabled.tres::93b14aaee5e23608f8e727511f102dbb::1686686895::res://.godot/exported/133200997/export-13910026f197497848761a0f5e7b7617-button_disabled.res -res://assets/themes/button_focused.tres::93c29f3dc5a364e838e6e91eb6e060bc::1686686895::res://.godot/exported/133200997/export-ff2540f38701e6624ec79f5fb6b5b5f9-button_focused.res -res://assets/themes/button_hover.tres::0f5c6cbb3f65b179a1ce75185d86db82::1686686895::res://.godot/exported/133200997/export-da41f2640fbd6d3a1fe536ddfb262b83-button_hover.res -res://assets/themes/button_normal.tres::11fe68d2220e9d6062738a480a6d485d::1686686895::res://.godot/exported/133200997/export-39381174508e97e89bd3db21f04b8f7f-button_normal.res -res://assets/themes/button_normal_orange.tres::272798df67288c0d5095ab3c68ef9d18::1686686555::res://.godot/exported/133200997/export-b17fa98194e2d6122d70529e5fb3147d-button_normal_orange.res -res://assets/themes/button_pressed.tres::5af3cd4f048d5134424e87bd09f1fe30::1686686895::res://.godot/exported/133200997/export-9e65e178d653489fc5183f5793b6d5fd-button_pressed.res -res://assets/themes/custom_slider_panel.tres::99806e9d8d92f49dc8ddebdd8a61bfe0::1686686555::res://.godot/exported/133200997/export-ccf7ba1c35bc2f728d4d094568420173-custom_slider_panel.res -res://assets/themes/flat_panel.tres::50c9f891b98dc8f702287b4e9a512a52::1686686895::res://.godot/exported/133200997/export-3a7f3bf511e7cd2951b68963bc5b8954-flat_panel.res -res://assets/themes/line_edit.tres::74eeb86e30a274c183c20585f35ed166::1686686895::res://.godot/exported/133200997/export-ef0628e7d630d1dbcb702e67166b0898-line_edit.res -res://assets/themes/line_edit_focused.tres::a12b1020ee8b0a72a2166a31b6e6e36e::1686686895::res://.godot/exported/133200997/export-57905c0782ec2dddac50c931fb2f6d7b-line_edit_focused.res -res://assets/themes/option_button_disabled.tres::bd1ba1afc34ae332b04c6e700a16db23::1686686895::res://.godot/exported/133200997/export-90a233e0caf827aed8351b602fce23f4-option_button_disabled.res -res://assets/themes/option_button_normal.tres::7854dd810454263102d80f339912bee2::1686686895::res://.godot/exported/133200997/export-c3e142ec6a5143fda3eab6efe674a234-option_button_normal.res -res://assets/themes/orange_buton_pressed.tres::ec58af7417f8564859cfe0322ef9d7f7::1686686895::res://.godot/exported/133200997/export-6bd5f68dbcd3f2cf810cce061fdaa819-orange_buton_pressed.res -res://assets/themes/orange_button_focused.tres::0f7e7bf27aaec168c020fe41b1227acd::1686686895::res://.godot/exported/133200997/export-e3d3907789c0ba43cb04f70d5ef7b336-orange_button_focused.res -res://assets/themes/orange_button_hover.tres::d824b905faa85c55983139b5b582dc84::1686686895::res://.godot/exported/133200997/export-e97fec90aab1fa99c38b2af8dbec0425-orange_button_hover.res -res://assets/themes/orange_button_normal.tres::25e298c5210dcc31d7acbbe7d28fc4b7::1686686895::res://.godot/exported/133200997/export-d49ef284b1d8c12abe4057c692ace708-orange_button_normal.res -res://assets/themes/panel.tres::008df2b7556308a9467aa499e2279d6b::1686686895::res://.godot/exported/133200997/export-b2a7edc8458debc2167a9df9846653b7-panel.res -res://assets/themes/style_box_empty.tres::b5bb4b1c4bdbdabb2b3c2cd8280cc893::1686686895::res://.godot/exported/133200997/export-20924ec2fd456ca33c6d76a4d5e0d6ad-style_box_empty.res -res://assets/themes/theme.tres::257094f27d4150270c0b960549853092::1688559276::res://.godot/exported/133200997/export-6080448334545697e69a00c31c4cc65d-theme.res -res://src/decentraland_components/gltf_container.tscn::968211d448a231a5c61fda1078b456ea::1686059633::res://.godot/exported/133200997/export-7d490905770f7f591b3b9d210e7c65e3-gltf_container.scn -res://src/tool/raycast_debugger/raycast_line.tscn::cd70cccafa9fb9a15a6fa7a1f10b1069::1688503437::res://.godot/exported/133200997/export-3241ae44c4183a70641c2f49a93cbc3f-raycast_line.scn -res://src/ui/components/custom_slider/custom_slider.tscn::c3a0ed09977e3981cfccfc1e80eceee4::1686686555::res://.godot/exported/133200997/export-dbbbc684f3b6b9f4730bb7970bbf647c-custom_slider.scn -res://src/ui/components/discover/discover.tscn::eba26e1144bab756817b4058caa92406::1687803921::res://.godot/exported/133200997/export-b629c1823c6763746387a638fa76f4a5-discover.scn -res://src/ui/components/info_panel/info_panel.tscn::2d60c919021c24fdf502743ab4a9051f::1687948756::res://.godot/exported/133200997/export-69124dbd7d075457751abc8ac3314171-info_panel.scn -res://src/ui/components/map/map.tscn::fae3be8d424438d01676ce72959b9570::1688559276::res://.godot/exported/133200997/export-be5913da87fda37f0d4deac41259f2e2-map.scn -res://src/ui/components/map_shader/map_shader.tscn::3170d322224afb6a43f1099873f5ebf1::1686686555::res://.godot/exported/133200997/export-667406348563dd10e2914a924a668c42-map_shader.scn -res://src/ui/components/menu/menu.tscn::b47a13d067f0cdd16229646c4bced943::1688559276::res://.godot/exported/133200997/export-da9ff4a7e860be3c21fffafb427918a5-menu.scn -res://src/ui/components/minimap/minimap.tscn::b38caaa6993a814a57b9828cde2c62dc::1687803921::res://.godot/exported/133200997/export-839cf4dc193bfc570305f9621885ae98-minimap.scn -res://src/ui/components/settings/settings.tscn::1de3114b7f5bde021ea163c86e6b739c::1688559276::res://.godot/exported/133200997/export-8678b6db38b7a56e1b912ec1359ac48a-settings.scn -res://src/ui/components/panel_bottom_left.tscn::a846bbad1f13ffece5c3b26b2c4682ee::1687948756::res://.godot/exported/133200997/export-bebc8eaebe2d0db3257319fcab32f786-panel_bottom_left.scn -res://src/ui/components/pointer_tooltip.tscn::b5342e07f3ae6cc59e989da0ef30faff::1687948756::res://.godot/exported/133200997/export-6d22edc70c94e5560905082635c5c7b4-pointer_tooltip.scn -res://src/ui/explorer.tscn::c19c7c5f2fe111b62f72e0a94c2ed5d1::1688559276::res://.godot/exported/133200997/export-cedef4dd85d39a21923df61958a0a0fa-explorer.scn -res://src/main.tscn::d2ed951905f21167192cd682b54d0d6c::1688503610::res://.godot/exported/133200997/export-dbe59258b6e7c5860bca2a5bbd0223c3-main.scn -res://test/rust_requester.tscn::ea42b1418d0a37f36c5aa4dac3a50369::1686062943::res://.godot/exported/133200997/export-c754ded60ff436dd905c4d24f944d200-rust_requester.scn diff --git a/godot/.godot/global_script_class_cache.cfg b/godot/.godot/global_script_class_cache.cfg index 85b07fd0..44e33a8e 100644 --- a/godot/.godot/global_script_class_cache.cfg +++ b/godot/.godot/global_script_class_cache.cfg @@ -1,5 +1,11 @@ list=Array[Dictionary]([{ "base": &"Node", +"class": &"Comms", +"icon": "", +"language": &"GDScript", +"path": "res://src/logic/comms.gd" +}, { +"base": &"Node", "class": &"ContentManager", "icon": "", "language": &"GDScript", diff --git a/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.fontdata b/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.fontdata index 8323307c..e980af1a 100644 Binary files a/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.fontdata and b/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.fontdata differ diff --git a/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.md5 b/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.md5 index 3237ec7a..79e765e7 100644 --- a/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.md5 +++ b/godot/.godot/imported/Lato-Black.ttf-6c37eaf576c61426edd0f8982cf8866e.md5 @@ -1,3 +1,3 @@ source_md5="d83ab24f5cf2be8b7a9873dd64f6060a" -dest_md5="767383f5525602aff3f52a920b74282b" +dest_md5="d0dcf64e34c8d819bb8c3bd677914966" diff --git a/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.fontdata b/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.fontdata index dc9908ed..bee8e40e 100644 Binary files a/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.fontdata and b/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.fontdata differ diff --git a/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.md5 b/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.md5 index d38a8da3..aedc6790 100644 --- a/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.md5 +++ b/godot/.godot/imported/Lato-BlackItalic.ttf-d64c0c297a71891c739452cce89d23ae.md5 @@ -1,3 +1,3 @@ source_md5="047217f671c9e0849c97d43e26543046" -dest_md5="f0450c91eb8acec250d6f1edb5c2dbab" +dest_md5="b68b601bcb9bd2477b96a2b9ed2927b3" diff --git a/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.fontdata b/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.fontdata index 738123ca..4bebf846 100644 Binary files a/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.fontdata and b/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.fontdata differ diff --git a/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.md5 b/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.md5 index daabaaa0..5ad37efe 100644 --- a/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.md5 +++ b/godot/.godot/imported/Lato-Bold.ttf-04f64c85984d6be6e60af75c9c27ccf6.md5 @@ -1,3 +1,3 @@ source_md5="24b516c266d7341c954cb2918f1c8f38" -dest_md5="3ebede8591768606e9089afb3bdb97a6" +dest_md5="310e4a71afceeb1675055d0a24481463" diff --git a/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.fontdata b/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.fontdata index f7f7de1a..27304d8b 100644 Binary files a/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.fontdata and b/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.fontdata differ diff --git a/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.md5 b/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.md5 index a6495e20..01a183cc 100644 --- a/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.md5 +++ b/godot/.godot/imported/Lato-BoldItalic.ttf-28df0b34e86471f07b0edd9992cc46bf.md5 @@ -1,3 +1,3 @@ source_md5="acc03ac1e9162f0388c005177d55d762" -dest_md5="fc36f3b951534ced3f4050f640d52ee0" +dest_md5="792e8650c8fe677e2be5ef9efa7612c5" diff --git a/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.fontdata b/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.fontdata index 89c76496..e1b76cf7 100644 Binary files a/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.fontdata and b/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.fontdata differ diff --git a/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.md5 b/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.md5 index 0ce9b893..605688b2 100644 --- a/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.md5 +++ b/godot/.godot/imported/Lato-Italic.ttf-1d1813ad39e8c49810a3b5bfd22b4a4f.md5 @@ -1,3 +1,3 @@ source_md5="5d22f337a040ae2857e36e7c5800369b" -dest_md5="de9640dd14fe0090585dd18af4f3933f" +dest_md5="505416b1e2cd4578582ef3f2c0787917" diff --git a/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.fontdata b/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.fontdata index 882a8f54..f3e57dcb 100644 Binary files a/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.fontdata and b/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.fontdata differ diff --git a/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.md5 b/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.md5 index 2fdb46ed..4595107c 100644 --- a/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.md5 +++ b/godot/.godot/imported/Lato-Light.ttf-a2142ee4610002032a0eb087f060464d.md5 @@ -1,3 +1,3 @@ source_md5="2bcc211c05fc425a57b2767a4cdcf174" -dest_md5="5c2bcbf1979ed9e0faf7e7720d953792" +dest_md5="db579b3ca882beaf7c2164f79712161d" diff --git a/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.fontdata b/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.fontdata index 048b6c3d..414bb9e2 100644 Binary files a/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.fontdata and b/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.fontdata differ diff --git a/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.md5 b/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.md5 index 853cb652..851b09e9 100644 --- a/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.md5 +++ b/godot/.godot/imported/Lato-LightItalic.ttf-06f3a7416886582eabb252e467332cc9.md5 @@ -1,3 +1,3 @@ source_md5="2404a6da847c878edbc8280745365cba" -dest_md5="ab79f6bc98fe003f31d819a3399aefdb" +dest_md5="73382e44a99973f2fa8113ff14900033" diff --git a/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.fontdata b/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.fontdata index 8c573ad3..4e7f4694 100644 Binary files a/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.fontdata and b/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.fontdata differ diff --git a/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.md5 b/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.md5 index da9678fa..33a5601f 100644 --- a/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.md5 +++ b/godot/.godot/imported/Lato-Regular.ttf-11018674b83aa8c23782341f7a494439.md5 @@ -1,3 +1,3 @@ source_md5="122dd68d69fe9587e062d20d9ff5de2a" -dest_md5="a63b5bc4073ceb5a441e4538bb22b1b9" +dest_md5="e6770c065317ee457c7a5911e17a9714" diff --git a/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.fontdata b/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.fontdata index 5e9903a3..5220dd5a 100644 Binary files a/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.fontdata and b/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.fontdata differ diff --git a/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.md5 b/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.md5 index e03d4178..5fd38103 100644 --- a/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.md5 +++ b/godot/.godot/imported/Lato-Thin.ttf-29b1063794cb3f0145b3e27e7fe7a1a1.md5 @@ -1,3 +1,3 @@ source_md5="7ab0bc06eecc1b75f8708aba3d3b044a" -dest_md5="6a40c10a8e183aa78c091684693b2ec1" +dest_md5="664cda47130f5b714f8f88ec9f06daad" diff --git a/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.fontdata b/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.fontdata index 510f55d1..3d27a4be 100644 Binary files a/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.fontdata and b/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.fontdata differ diff --git a/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.md5 b/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.md5 index 623372a6..5773ba81 100644 --- a/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.md5 +++ b/godot/.godot/imported/Lato-ThinItalic.ttf-f70a04d742a50a5df0f41db87cffb761.md5 @@ -1,3 +1,3 @@ source_md5="2b26bc77c3f9432c9d4ca4911520294d" -dest_md5="d9aeeddbc5b2aa68d6d4540e3f482aa7" +dest_md5="933d17764b0aa54ee820183984371132" diff --git a/godot/.godot/shader_cache/BlitShaderRD/c2f1d52755200965700b6f348956cefa3cf380b9355ca2d12ee8306796d2dd95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/BlitShaderRD/0c1ebf93a1000042d0c75c6a9686cfcaa65dbf150a9fd375c1174b8e1cf43716/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 89% rename from godot/.godot/shader_cache/BlitShaderRD/c2f1d52755200965700b6f348956cefa3cf380b9355ca2d12ee8306796d2dd95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/BlitShaderRD/0c1ebf93a1000042d0c75c6a9686cfcaa65dbf150a9fd375c1174b8e1cf43716/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 95cfd456..5a55f66f 100644 Binary files a/godot/.godot/shader_cache/BlitShaderRD/c2f1d52755200965700b6f348956cefa3cf380b9355ca2d12ee8306796d2dd95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/BlitShaderRD/0c1ebf93a1000042d0c75c6a9686cfcaa65dbf150a9fd375c1174b8e1cf43716/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/BokehDofShaderRD/4e1a20d4a6154d332b56a183d403487c5317b06f4376d5965389ef9c2e254245/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/BokehDofShaderRD/24d905231969aed3cb868438a70355f9b1de12b446ddacf8c90644621962e515/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/BokehDofShaderRD/4e1a20d4a6154d332b56a183d403487c5317b06f4376d5965389ef9c2e254245/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/BokehDofShaderRD/24d905231969aed3cb868438a70355f9b1de12b446ddacf8c90644621962e515/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 62c934d9..49a008a2 100644 Binary files a/godot/.godot/shader_cache/BokehDofShaderRD/4e1a20d4a6154d332b56a183d403487c5317b06f4376d5965389ef9c2e254245/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/BokehDofShaderRD/24d905231969aed3cb868438a70355f9b1de12b446ddacf8c90644621962e515/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CanvasOcclusionShaderRD/92ab09a5b748efc7b1cbd2e6ef22120c910e45245cf9a7f45919c10b5b90492f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CanvasOcclusionShaderRD/d396ab1004048ea904efd0daf73177f72a2d81259495b04be3646c58a6a8ae08/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 90% rename from godot/.godot/shader_cache/CanvasOcclusionShaderRD/92ab09a5b748efc7b1cbd2e6ef22120c910e45245cf9a7f45919c10b5b90492f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CanvasOcclusionShaderRD/d396ab1004048ea904efd0daf73177f72a2d81259495b04be3646c58a6a8ae08/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 44e7ed56..3b717256 100644 Binary files a/godot/.godot/shader_cache/CanvasOcclusionShaderRD/92ab09a5b748efc7b1cbd2e6ef22120c910e45245cf9a7f45919c10b5b90492f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CanvasOcclusionShaderRD/d396ab1004048ea904efd0daf73177f72a2d81259495b04be3646c58a6a8ae08/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CanvasSdfShaderRD/11aeb3e1de1481dde5ad69e00e0d8601c7f1d67218216501fc5264eedc1ab9dd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CanvasSdfShaderRD/7eccb0f906b4d6dc1f613eb910cdfc4f91c2b28dec00e9a8589801e0528b3e37/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 93% rename from godot/.godot/shader_cache/CanvasSdfShaderRD/11aeb3e1de1481dde5ad69e00e0d8601c7f1d67218216501fc5264eedc1ab9dd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CanvasSdfShaderRD/7eccb0f906b4d6dc1f613eb910cdfc4f91c2b28dec00e9a8589801e0528b3e37/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 240ff78e..acc135a6 100644 Binary files a/godot/.godot/shader_cache/CanvasSdfShaderRD/11aeb3e1de1481dde5ad69e00e0d8601c7f1d67218216501fc5264eedc1ab9dd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CanvasSdfShaderRD/7eccb0f906b4d6dc1f613eb910cdfc4f91c2b28dec00e9a8589801e0528b3e37/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/087916079fba7c625e62b0c2cca570e0fb87c99a.cache new file mode 100644 index 00000000..d6b665fb Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/1bab8848f11993699fd9b5d1729377c0dd9e4024.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/1bab8848f11993699fd9b5d1729377c0dd9e4024.cache new file mode 100644 index 00000000..e8a39ee4 Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/1bab8848f11993699fd9b5d1729377c0dd9e4024.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/323ddf3deeacbe0ea413ec71d66b65d04e7d1a46.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/323ddf3deeacbe0ea413ec71d66b65d04e7d1a46.cache new file mode 100644 index 00000000..7c4fa75a Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/323ddf3deeacbe0ea413ec71d66b65d04e7d1a46.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/3807593a1871d2e064fb0bac29effc3f0c2260c0.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/3807593a1871d2e064fb0bac29effc3f0c2260c0.cache new file mode 100644 index 00000000..e2e518a9 Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/3807593a1871d2e064fb0bac29effc3f0c2260c0.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/56d9fe4d6b0b7002894526797f5e65db0d5f1e18.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/56d9fe4d6b0b7002894526797f5e65db0d5f1e18.cache new file mode 100644 index 00000000..2ba88a83 Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/56d9fe4d6b0b7002894526797f5e65db0d5f1e18.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/64447a736aff6a458b114aea85eaf603d253f9a8.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/64447a736aff6a458b114aea85eaf603d253f9a8.cache new file mode 100644 index 00000000..06d9a7c8 Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/64447a736aff6a458b114aea85eaf603d253f9a8.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/98676c93f49a619be763bf730c8db104e1e3ad96.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/98676c93f49a619be763bf730c8db104e1e3ad96.cache new file mode 100644 index 00000000..c7a52ada Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/98676c93f49a619be763bf730c8db104e1e3ad96.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/a95ddc2e45b9d96ca4ee5ca9f90e835dece08c32.cache b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/a95ddc2e45b9d96ca4ee5ca9f90e835dece08c32.cache new file mode 100644 index 00000000..b03353aa Binary files /dev/null and b/godot/.godot/shader_cache/CanvasShaderRD/25f76db722d5fd4affbbf2a0d33b05594d90689e6f5549976f22090f39546484/a95ddc2e45b9d96ca4ee5ca9f90e835dece08c32.cache differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache deleted file mode 100644 index 95ea1435..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/6c94b25d75b1ec58f806edc8e65c2a35743ad557.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/6c94b25d75b1ec58f806edc8e65c2a35743ad557.cache deleted file mode 100644 index 4fa30b25..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/6c94b25d75b1ec58f806edc8e65c2a35743ad557.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/7c35e91172ffc8491fe57146c3e177fd3e10b0a0.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/7c35e91172ffc8491fe57146c3e177fd3e10b0a0.cache deleted file mode 100644 index 1a9d8a72..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/7c35e91172ffc8491fe57146c3e177fd3e10b0a0.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/86b4b6d51b4a45af6d7a93cd8ccd2af80a156da9.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/86b4b6d51b4a45af6d7a93cd8ccd2af80a156da9.cache deleted file mode 100644 index ee06b250..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/86b4b6d51b4a45af6d7a93cd8ccd2af80a156da9.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/98676c93f49a619be763bf730c8db104e1e3ad96.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/98676c93f49a619be763bf730c8db104e1e3ad96.cache deleted file mode 100644 index 228f21d3..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/98676c93f49a619be763bf730c8db104e1e3ad96.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/9d0533530a382e64370fc542a58d7fdac6c773bd.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/9d0533530a382e64370fc542a58d7fdac6c773bd.cache deleted file mode 100644 index 74e3306e..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/9d0533530a382e64370fc542a58d7fdac6c773bd.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/a444689c2f13418983bd978ab522bd863aed69c5.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/a444689c2f13418983bd978ab522bd863aed69c5.cache deleted file mode 100644 index ae367162..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/a444689c2f13418983bd978ab522bd863aed69c5.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/cfbe819c6b55623a3cfeaf8d0ab83aeaa2d48269.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/cfbe819c6b55623a3cfeaf8d0ab83aeaa2d48269.cache deleted file mode 100644 index 9ff31e71..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/cfbe819c6b55623a3cfeaf8d0ab83aeaa2d48269.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/e3f407ba9d0efb9eb7acd76443c6c65368ba6181.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/e3f407ba9d0efb9eb7acd76443c6c65368ba6181.cache deleted file mode 100644 index dd7ee81b..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/e3f407ba9d0efb9eb7acd76443c6c65368ba6181.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/eaf44e18cd01e1dcdf84a400c6fbe82c311d34e7.cache b/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/eaf44e18cd01e1dcdf84a400c6fbe82c311d34e7.cache deleted file mode 100644 index 9ab435fc..00000000 Binary files a/godot/.godot/shader_cache/CanvasShaderRD/768a940bcb6ab8ef0d50e97194520c254fea1ecc69313d44cf054f3f01c05852/eaf44e18cd01e1dcdf84a400c6fbe82c311d34e7.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/ClusterDebugShaderRD/88f882e74c383f02c224c438558d1787b699e442f36dbd5a55d94cd7348f2296/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ClusterDebugShaderRD/7b715cccb39d3d614826606bc114e5a10dc5063d1fa0e9bdfdfff1d291757242/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 100% rename from godot/.godot/shader_cache/ClusterDebugShaderRD/88f882e74c383f02c224c438558d1787b699e442f36dbd5a55d94cd7348f2296/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ClusterDebugShaderRD/7b715cccb39d3d614826606bc114e5a10dc5063d1fa0e9bdfdfff1d291757242/087916079fba7c625e62b0c2cca570e0fb87c99a.cache diff --git a/godot/.godot/shader_cache/ClusterRenderShaderRD/369199d77a3f0d4acab002ac8c9ba857925a06e5dc82b6823747a3170da60dfa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ClusterRenderShaderRD/369199d77a3f0d4acab002ac8c9ba857925a06e5dc82b6823747a3170da60dfa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache deleted file mode 100644 index 42229587..00000000 Binary files a/godot/.godot/shader_cache/ClusterRenderShaderRD/369199d77a3f0d4acab002ac8c9ba857925a06e5dc82b6823747a3170da60dfa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/ClusterRenderShaderRD/be842cc07f526221cdd87a7def118418e4627a358b25244dbb38ab06c68fc669/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ClusterRenderShaderRD/be842cc07f526221cdd87a7def118418e4627a358b25244dbb38ab06c68fc669/087916079fba7c625e62b0c2cca570e0fb87c99a.cache new file mode 100644 index 00000000..aa9d817a Binary files /dev/null and b/godot/.godot/shader_cache/ClusterRenderShaderRD/be842cc07f526221cdd87a7def118418e4627a358b25244dbb38ab06c68fc669/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/ClusterStoreShaderRD/ca1a04ee1bdde8f26ec895c8a7a4f0bd673204cc6bbd6c9c0d88becbfa767f81/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ClusterStoreShaderRD/b65381e0d58341bc646245b467c0dbf8061479a0d4c48b54e2e818227474eb10/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 100% rename from godot/.godot/shader_cache/ClusterStoreShaderRD/ca1a04ee1bdde8f26ec895c8a7a4f0bd673204cc6bbd6c9c0d88becbfa767f81/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ClusterStoreShaderRD/b65381e0d58341bc646245b467c0dbf8061479a0d4c48b54e2e818227474eb10/087916079fba7c625e62b0c2cca570e0fb87c99a.cache diff --git a/godot/.godot/shader_cache/CopyShaderRD/a01097c5b89928dd653e6f213ce5d2ee3922ca680e80521bc1f4675ce79a312a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CopyShaderRD/cbaf79eaf197015986e8fb61fdf7e525c97774b06fd3653470a343f5bb616c16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 92% rename from godot/.godot/shader_cache/CopyShaderRD/a01097c5b89928dd653e6f213ce5d2ee3922ca680e80521bc1f4675ce79a312a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CopyShaderRD/cbaf79eaf197015986e8fb61fdf7e525c97774b06fd3653470a343f5bb616c16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 761d45b7..13ef4616 100644 Binary files a/godot/.godot/shader_cache/CopyShaderRD/a01097c5b89928dd653e6f213ce5d2ee3922ca680e80521bc1f4675ce79a312a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CopyShaderRD/cbaf79eaf197015986e8fb61fdf7e525c97774b06fd3653470a343f5bb616c16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CopyToFbShaderRD/94bc9909b821174238ebc4355459d921ecf6e7463ab53cedaadba00c50ca750f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CopyToFbShaderRD/dda0bc226ab21894498fe69133e5b6bdcdf947d154555dd30db497592cdd6368/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 94% rename from godot/.godot/shader_cache/CopyToFbShaderRD/94bc9909b821174238ebc4355459d921ecf6e7463ab53cedaadba00c50ca750f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CopyToFbShaderRD/dda0bc226ab21894498fe69133e5b6bdcdf947d154555dd30db497592cdd6368/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 395e50b5..b55ab36d 100644 Binary files a/godot/.godot/shader_cache/CopyToFbShaderRD/94bc9909b821174238ebc4355459d921ecf6e7463ab53cedaadba00c50ca750f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CopyToFbShaderRD/dda0bc226ab21894498fe69133e5b6bdcdf947d154555dd30db497592cdd6368/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CubeToDpShaderRD/848b11591e02f1a376c22ef80a6b55aee44ed6bf997f1a831f1220fceeca3cc9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CubeToDpShaderRD/4afbe49e9730aabd55372882270dbec8d0c189feddbd94948fe58c9c46480fe3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 92% rename from godot/.godot/shader_cache/CubeToDpShaderRD/848b11591e02f1a376c22ef80a6b55aee44ed6bf997f1a831f1220fceeca3cc9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CubeToDpShaderRD/4afbe49e9730aabd55372882270dbec8d0c189feddbd94948fe58c9c46480fe3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index d9d15eef..226f414c 100644 Binary files a/godot/.godot/shader_cache/CubeToDpShaderRD/848b11591e02f1a376c22ef80a6b55aee44ed6bf997f1a831f1220fceeca3cc9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CubeToDpShaderRD/4afbe49e9730aabd55372882270dbec8d0c189feddbd94948fe58c9c46480fe3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CubemapDownsamplerShaderRD/7f740a8d7cd9c4186462b9e1b332f46b7cd444267e394d57ad68d9b1d111efe2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CubemapDownsamplerShaderRD/e11573ba02d3151b8040cd5e18fbffb556f28ec14d4f7f4df8dd9c181ff65184/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/CubemapDownsamplerShaderRD/7f740a8d7cd9c4186462b9e1b332f46b7cd444267e394d57ad68d9b1d111efe2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CubemapDownsamplerShaderRD/e11573ba02d3151b8040cd5e18fbffb556f28ec14d4f7f4df8dd9c181ff65184/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 9265cbce..2d3bafc4 100644 Binary files a/godot/.godot/shader_cache/CubemapDownsamplerShaderRD/7f740a8d7cd9c4186462b9e1b332f46b7cd444267e394d57ad68d9b1d111efe2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CubemapDownsamplerShaderRD/e11573ba02d3151b8040cd5e18fbffb556f28ec14d4f7f4df8dd9c181ff65184/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CubemapFilterShaderRD/e763a34c76d94a6db174634ef9b93c6a1483e591eb32306c86c14149bcc614d2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CubemapFilterShaderRD/c45d424bb74f325110a9b1ac651e7f32b607d976b852eb0fcdbf95f4057e3ae7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/CubemapFilterShaderRD/e763a34c76d94a6db174634ef9b93c6a1483e591eb32306c86c14149bcc614d2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CubemapFilterShaderRD/c45d424bb74f325110a9b1ac651e7f32b607d976b852eb0fcdbf95f4057e3ae7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 2c74de09..fd75cf2e 100644 Binary files a/godot/.godot/shader_cache/CubemapFilterShaderRD/e763a34c76d94a6db174634ef9b93c6a1483e591eb32306c86c14149bcc614d2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CubemapFilterShaderRD/c45d424bb74f325110a9b1ac651e7f32b607d976b852eb0fcdbf95f4057e3ae7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/CubemapRoughnessShaderRD/25108099ef7a62c3e3ce1910aa4d1ff87379a06fedec32bf504970fba37710f6/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/CubemapRoughnessShaderRD/365f146dd9bbedaa9d1110a1bf95d10f3f11d17b3267504123138b86c51d8ea9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/CubemapRoughnessShaderRD/25108099ef7a62c3e3ce1910aa4d1ff87379a06fedec32bf504970fba37710f6/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/CubemapRoughnessShaderRD/365f146dd9bbedaa9d1110a1bf95d10f3f11d17b3267504123138b86c51d8ea9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index ba4a76ca..c149ce1e 100644 Binary files a/godot/.godot/shader_cache/CubemapRoughnessShaderRD/25108099ef7a62c3e3ce1910aa4d1ff87379a06fedec32bf504970fba37710f6/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/CubemapRoughnessShaderRD/365f146dd9bbedaa9d1110a1bf95d10f3f11d17b3267504123138b86c51d8ea9/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/FsrUpscaleShaderRD/b1907a6444d1c331fb568af178c19df6322eb16381280e5b03471333bab03af2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/FsrUpscaleShaderRD/ff02cb3a7a1ad992f865250c55a0bd6986079ba0e667d1e8910f8ef141d91fb1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/FsrUpscaleShaderRD/b1907a6444d1c331fb568af178c19df6322eb16381280e5b03471333bab03af2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/FsrUpscaleShaderRD/ff02cb3a7a1ad992f865250c55a0bd6986079ba0e667d1e8910f8ef141d91fb1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 9951b7f5..5858b43e 100644 Binary files a/godot/.godot/shader_cache/FsrUpscaleShaderRD/b1907a6444d1c331fb568af178c19df6322eb16381280e5b03471333bab03af2/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/FsrUpscaleShaderRD/ff02cb3a7a1ad992f865250c55a0bd6986079ba0e667d1e8910f8ef141d91fb1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/GiShaderRD/873d8f0d0ee2571eeaef4aac446d88e194c1110c0ffb8a6715d9db211444cc35/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/GiShaderRD/07b1cef822d7a21d8fa4e6b9ba5e6fd7fab73eb9cd335a464bde56525e60e1d5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/GiShaderRD/873d8f0d0ee2571eeaef4aac446d88e194c1110c0ffb8a6715d9db211444cc35/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/GiShaderRD/07b1cef822d7a21d8fa4e6b9ba5e6fd7fab73eb9cd335a464bde56525e60e1d5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 62e346ba..11013587 100644 Binary files a/godot/.godot/shader_cache/GiShaderRD/873d8f0d0ee2571eeaef4aac446d88e194c1110c0ffb8a6715d9db211444cc35/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/GiShaderRD/07b1cef822d7a21d8fa4e6b9ba5e6fd7fab73eb9cd335a464bde56525e60e1d5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/LuminanceReduceShaderRD/c7024d6968413d9e6ec46e9035f60799559ec2521a86516c038d0cd9628ef9c5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/LuminanceReduceShaderRD/697d82d834a201063dda2533c312a47b67b190b55dd10dd63242f300c866b243/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 94% rename from godot/.godot/shader_cache/LuminanceReduceShaderRD/c7024d6968413d9e6ec46e9035f60799559ec2521a86516c038d0cd9628ef9c5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/LuminanceReduceShaderRD/697d82d834a201063dda2533c312a47b67b190b55dd10dd63242f300c866b243/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index a67d3583..075c867b 100644 Binary files a/godot/.godot/shader_cache/LuminanceReduceShaderRD/c7024d6968413d9e6ec46e9035f60799559ec2521a86516c038d0cd9628ef9c5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/LuminanceReduceShaderRD/697d82d834a201063dda2533c312a47b67b190b55dd10dd63242f300c866b243/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/ParticlesCopyShaderRD/e52e76f1a88726b4190968f6cd06236c0e8d60b4ae14d876e98e584e6aafb852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ParticlesCopyShaderRD/a29654a6adf58bc6c91241764184cd753aeeaabbe1f6a7b16e294ad959943e50/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/ParticlesCopyShaderRD/e52e76f1a88726b4190968f6cd06236c0e8d60b4ae14d876e98e584e6aafb852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ParticlesCopyShaderRD/a29654a6adf58bc6c91241764184cd753aeeaabbe1f6a7b16e294ad959943e50/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 003a7330..602501e4 100644 Binary files a/godot/.godot/shader_cache/ParticlesCopyShaderRD/e52e76f1a88726b4190968f6cd06236c0e8d60b4ae14d876e98e584e6aafb852/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/ParticlesCopyShaderRD/a29654a6adf58bc6c91241764184cd753aeeaabbe1f6a7b16e294ad959943e50/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/ParticlesShaderRD/73aba4694bbe30eab30f3d0d26415acc5e1b075c8597437e3d792a9eea5e9ea2/f128cab0b22fb7e0d9f023d6cdb81309be392d95.cache b/godot/.godot/shader_cache/ParticlesShaderRD/4fbebe7ccb4e0469cbd0103fb550e4655b52f974dee97d590b4f60117bc502fc/f128cab0b22fb7e0d9f023d6cdb81309be392d95.cache similarity index 100% rename from godot/.godot/shader_cache/ParticlesShaderRD/73aba4694bbe30eab30f3d0d26415acc5e1b075c8597437e3d792a9eea5e9ea2/f128cab0b22fb7e0d9f023d6cdb81309be392d95.cache rename to godot/.godot/shader_cache/ParticlesShaderRD/4fbebe7ccb4e0469cbd0103fb550e4655b52f974dee97d590b4f60117bc502fc/f128cab0b22fb7e0d9f023d6cdb81309be392d95.cache diff --git a/godot/.godot/shader_cache/ResolveShaderRD/e63a3ec5c23396ce39e4baa183eac33176017017322ffbebca3db38dacec2b49/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ResolveShaderRD/3cb30377fb58552b6968636d1680d67bf6deae0366748bc636ee9a08b81f2b03/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 93% rename from godot/.godot/shader_cache/ResolveShaderRD/e63a3ec5c23396ce39e4baa183eac33176017017322ffbebca3db38dacec2b49/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ResolveShaderRD/3cb30377fb58552b6968636d1680d67bf6deae0366748bc636ee9a08b81f2b03/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 198aaca4..86b1cf04 100644 Binary files a/godot/.godot/shader_cache/ResolveShaderRD/e63a3ec5c23396ce39e4baa183eac33176017017322ffbebca3db38dacec2b49/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/ResolveShaderRD/3cb30377fb58552b6968636d1680d67bf6deae0366748bc636ee9a08b81f2b03/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/RoughnessLimiterShaderRD/e5ddcb840c94cad52e5a45a1198d57ff0a86fd1500d57a2ff12bae6c3abf66aa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/RoughnessLimiterShaderRD/e5ddcb840c94cad52e5a45a1198d57ff0a86fd1500d57a2ff12bae6c3abf66aa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache deleted file mode 100644 index 1e81f157..00000000 Binary files a/godot/.godot/shader_cache/RoughnessLimiterShaderRD/e5ddcb840c94cad52e5a45a1198d57ff0a86fd1500d57a2ff12bae6c3abf66aa/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/118ba36f6ebd3257d0e24fef9b5c1f403c461a66.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/118ba36f6ebd3257d0e24fef9b5c1f403c461a66.cache deleted file mode 100644 index d0ec8fa2..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/118ba36f6ebd3257d0e24fef9b5c1f403c461a66.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/1344ce3d77ef72d56eef3c9cd0d5417bdd0a4b13.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/1344ce3d77ef72d56eef3c9cd0d5417bdd0a4b13.cache deleted file mode 100644 index 7529572c..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/1344ce3d77ef72d56eef3c9cd0d5417bdd0a4b13.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/17f778c763750e3e1feaf71f7fd64e064947081a.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/17f778c763750e3e1feaf71f7fd64e064947081a.cache deleted file mode 100644 index a226916f..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/17f778c763750e3e1feaf71f7fd64e064947081a.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3c2004ff2f4cb10be32eecce3aef58999f3a3c00.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3c2004ff2f4cb10be32eecce3aef58999f3a3c00.cache deleted file mode 100644 index bde6bf9a..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3c2004ff2f4cb10be32eecce3aef58999f3a3c00.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3d0d92e506ebed59ea8f1359f384dea3a9c607db.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3d0d92e506ebed59ea8f1359f384dea3a9c607db.cache deleted file mode 100644 index 5b46a2da..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/3d0d92e506ebed59ea8f1359f384dea3a9c607db.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/56b5925a2b0572c2ded75f0fcb579c223484ca13.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/56b5925a2b0572c2ded75f0fcb579c223484ca13.cache deleted file mode 100644 index f1e37663..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/56b5925a2b0572c2ded75f0fcb579c223484ca13.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/5e1ddc0dfdfa4a0280e0bd9cfc3279252e3c7973.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/5e1ddc0dfdfa4a0280e0bd9cfc3279252e3c7973.cache deleted file mode 100644 index c9a39698..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/5e1ddc0dfdfa4a0280e0bd9cfc3279252e3c7973.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/75da7bf77f2db25ffa2a30eb209a1fc8cc2f5b30.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/75da7bf77f2db25ffa2a30eb209a1fc8cc2f5b30.cache deleted file mode 100644 index 24acd4a4..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/75da7bf77f2db25ffa2a30eb209a1fc8cc2f5b30.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/7e6f09e567701e5ed403065b0ec9125225432ba4.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/7e6f09e567701e5ed403065b0ec9125225432ba4.cache deleted file mode 100644 index 50736948..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/7e6f09e567701e5ed403065b0ec9125225432ba4.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache deleted file mode 100644 index 9f0c3f61..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/86f0e50dd1cced740ed4a7a2bd47dfa02bc882b2.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/86f0e50dd1cced740ed4a7a2bd47dfa02bc882b2.cache deleted file mode 100644 index bf69362e..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/86f0e50dd1cced740ed4a7a2bd47dfa02bc882b2.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache deleted file mode 100644 index 909c2d00..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8d29d1fcc64ce2d8b7ed49c901c65a91146fbb76.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8d29d1fcc64ce2d8b7ed49c901c65a91146fbb76.cache deleted file mode 100644 index 059cc1cf..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/8d29d1fcc64ce2d8b7ed49c901c65a91146fbb76.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/90d1f2dc8493a4c954ba463e0fb3e0232f84d84d.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/90d1f2dc8493a4c954ba463e0fb3e0232f84d84d.cache deleted file mode 100644 index b93bcb25..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/90d1f2dc8493a4c954ba463e0fb3e0232f84d84d.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/93e6e5f60a9cbda4b1545392ba0a76c4ab1d135e.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/93e6e5f60a9cbda4b1545392ba0a76c4ab1d135e.cache deleted file mode 100644 index 0717db6b..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/93e6e5f60a9cbda4b1545392ba0a76c4ab1d135e.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/95ebea003c691e9b9fde1a09192072619f359c99.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/95ebea003c691e9b9fde1a09192072619f359c99.cache deleted file mode 100644 index 4d5307ad..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/95ebea003c691e9b9fde1a09192072619f359c99.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9909cf38417b9edb6e5a64b31241317810757356.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9909cf38417b9edb6e5a64b31241317810757356.cache deleted file mode 100644 index a34e2456..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9909cf38417b9edb6e5a64b31241317810757356.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9bac24b6b27ed3d77e750d66523fc854f8d3e4d8.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9bac24b6b27ed3d77e750d66523fc854f8d3e4d8.cache deleted file mode 100644 index 70298224..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9bac24b6b27ed3d77e750d66523fc854f8d3e4d8.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9daebd2e9a93be48c2f780ac379da9f156a37fc1.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9daebd2e9a93be48c2f780ac379da9f156a37fc1.cache deleted file mode 100644 index 9a6b7cf0..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9daebd2e9a93be48c2f780ac379da9f156a37fc1.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9ee7662cbbf421d57dab75ea6bdc94f3816b967f.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9ee7662cbbf421d57dab75ea6bdc94f3816b967f.cache deleted file mode 100644 index 498c20b0..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/9ee7662cbbf421d57dab75ea6bdc94f3816b967f.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/cda0b23e08870d026d0d917257ebde2239df9daa.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/cda0b23e08870d026d0d917257ebde2239df9daa.cache deleted file mode 100644 index 9474c99c..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/cda0b23e08870d026d0d917257ebde2239df9daa.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/d5380b6ac7ee6d22bc98457496eb4495a49b1c6f.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/d5380b6ac7ee6d22bc98457496eb4495a49b1c6f.cache deleted file mode 100644 index 5de0a609..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/d5380b6ac7ee6d22bc98457496eb4495a49b1c6f.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/f56c506d48f920a47e552ed6cf6059536156a939.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/f56c506d48f920a47e552ed6cf6059536156a939.cache deleted file mode 100644 index 7d5b60d5..00000000 Binary files a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/9bbb546eb412775406568803a96fe335a7b2d7e28b60038b0ab86432da3c3450/f56c506d48f920a47e552ed6cf6059536156a939.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/033e026e3e20c13b1288f9cdfe88365ec252bdb4.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/033e026e3e20c13b1288f9cdfe88365ec252bdb4.cache new file mode 100644 index 00000000..ef2c6a04 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/033e026e3e20c13b1288f9cdfe88365ec252bdb4.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/18d20e2757a0f4ce9b109ae99852f1be6eaa1288.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/18d20e2757a0f4ce9b109ae99852f1be6eaa1288.cache new file mode 100644 index 00000000..0fe249b1 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/18d20e2757a0f4ce9b109ae99852f1be6eaa1288.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/34a5e28b5a870ad273349f953c5d1224ef2811a7.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/34a5e28b5a870ad273349f953c5d1224ef2811a7.cache new file mode 100644 index 00000000..2984c314 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/34a5e28b5a870ad273349f953c5d1224ef2811a7.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/54202eec702711805ef2e96464566c5d36cf146f.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/54202eec702711805ef2e96464566c5d36cf146f.cache new file mode 100644 index 00000000..9fe1f138 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/54202eec702711805ef2e96464566c5d36cf146f.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/5fbe352551ecabe1c14129f0b394584c6f3d1daf.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/5fbe352551ecabe1c14129f0b394584c6f3d1daf.cache new file mode 100644 index 00000000..bf8c56f9 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/5fbe352551ecabe1c14129f0b394584c6f3d1daf.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/6c6b12a5e393b3ca55ab7e2b9672a7cf1ad24213.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/6c6b12a5e393b3ca55ab7e2b9672a7cf1ad24213.cache new file mode 100644 index 00000000..624784bf Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/6c6b12a5e393b3ca55ab7e2b9672a7cf1ad24213.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/7af3e87b30723c67f6b8ba1afe89d42e437af281.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/7af3e87b30723c67f6b8ba1afe89d42e437af281.cache new file mode 100644 index 00000000..2cc37a83 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/7af3e87b30723c67f6b8ba1afe89d42e437af281.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache new file mode 100644 index 00000000..842e33ef Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/84f3bfa29ba52d036ccb227b544f4212261b97e7.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache new file mode 100644 index 00000000..6746b2ea Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c405797d04cff2252b29dc660af5eda3a9bef6a.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c8d1a6e1940414ebf1cf97ca8b2d4433d11de96.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c8d1a6e1940414ebf1cf97ca8b2d4433d11de96.cache new file mode 100644 index 00000000..ed2ef68c Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/8c8d1a6e1940414ebf1cf97ca8b2d4433d11de96.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/94a99aac296381f489ce917ffe42b0c658c96bee.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/94a99aac296381f489ce917ffe42b0c658c96bee.cache new file mode 100644 index 00000000..e1502cc3 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/94a99aac296381f489ce917ffe42b0c658c96bee.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/a8cbfc6c6dd9bf771a6f6d7faad8520566a3ae79.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/a8cbfc6c6dd9bf771a6f6d7faad8520566a3ae79.cache new file mode 100644 index 00000000..8dfba922 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/a8cbfc6c6dd9bf771a6f6d7faad8520566a3ae79.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/b53ca1d3fad36029633e28e9f4d285429e1ba7be.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/b53ca1d3fad36029633e28e9f4d285429e1ba7be.cache new file mode 100644 index 00000000..48668ca2 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/b53ca1d3fad36029633e28e9f4d285429e1ba7be.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/bb1180fbd147b6e348c825ef2adb98c6354bd9fb.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/bb1180fbd147b6e348c825ef2adb98c6354bd9fb.cache new file mode 100644 index 00000000..72b29f80 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/bb1180fbd147b6e348c825ef2adb98c6354bd9fb.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ca86eaf3ca86f96cd58587dd17f17eb747ce6ba0.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ca86eaf3ca86f96cd58587dd17f17eb747ce6ba0.cache new file mode 100644 index 00000000..608f1bcc Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ca86eaf3ca86f96cd58587dd17f17eb747ce6ba0.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ddecddbcd2cd0ac6dd77ff972f086e7fc640412a.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ddecddbcd2cd0ac6dd77ff972f086e7fc640412a.cache new file mode 100644 index 00000000..557675b0 Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/ddecddbcd2cd0ac6dd77ff972f086e7fc640412a.cache differ diff --git a/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/eb9d28aefd0319947f8861f24e94cfa251997039.cache b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/eb9d28aefd0319947f8861f24e94cfa251997039.cache new file mode 100644 index 00000000..1043df7f Binary files /dev/null and b/godot/.godot/shader_cache/SceneForwardClusteredShaderRD/a4a2bca04c6e74b560ca2f476434e71286f5bc717591b67d557e483e76ad7237/eb9d28aefd0319947f8861f24e94cfa251997039.cache differ diff --git a/godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/9086a4843736ca82f941e39d6761895a3d70c47b681a2fa9b2e0b72b183534ee/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/c6f5bf78acd9b7f6148aea4c4af766005ad5272593e1ce207cf7f40d8ef6ae93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 96% rename from godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/9086a4843736ca82f941e39d6761895a3d70c47b681a2fa9b2e0b72b183534ee/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/c6f5bf78acd9b7f6148aea4c4af766005ad5272593e1ce207cf7f40d8ef6ae93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 1a8a2099..c774e816 100644 Binary files a/godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/9086a4843736ca82f941e39d6761895a3d70c47b681a2fa9b2e0b72b183534ee/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/ScreenSpaceReflectionFilterShaderRD/c6f5bf78acd9b7f6148aea4c4af766005ad5272593e1ce207cf7f40d8ef6ae93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/5bff3a9b61301c1fd05474160229717e9cc1ecf605844117503341b9b1ab5092/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/2252f1aaff5678e52b7c6616694844b0ea1f5ab3f2d6114a7e2277c8a5bf81fd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 96% rename from godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/5bff3a9b61301c1fd05474160229717e9cc1ecf605844117503341b9b1ab5092/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/2252f1aaff5678e52b7c6616694844b0ea1f5ab3f2d6114a7e2277c8a5bf81fd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 5e5d3e78..d50de310 100644 Binary files a/godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/5bff3a9b61301c1fd05474160229717e9cc1ecf605844117503341b9b1ab5092/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/ScreenSpaceReflectionScaleShaderRD/2252f1aaff5678e52b7c6616694844b0ea1f5ab3f2d6114a7e2277c8a5bf81fd/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/70c8cb444d8058c772ced4c5e4b02f66d4b197b20a50ecf728d59732dac57e77/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/0582063dc659d3a1716f5e98a52a50aa0e1ae29948fc726d4f1757089c829086/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 93% rename from godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/70c8cb444d8058c772ced4c5e4b02f66d4b197b20a50ecf728d59732dac57e77/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/0582063dc659d3a1716f5e98a52a50aa0e1ae29948fc726d4f1757089c829086/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 7856b91d..f05dbf55 100644 Binary files a/godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/70c8cb444d8058c772ced4c5e4b02f66d4b197b20a50ecf728d59732dac57e77/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/ScreenSpaceReflectionShaderRD/0582063dc659d3a1716f5e98a52a50aa0e1ae29948fc726d4f1757089c829086/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/f5a1e9f23a38b610ce02ed4d97d33fb6d2eb2b2eab6ac3e55601250a99dd2b45/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/026e9cd0b29f3dc44ef5829c06be67a8aa58b21b39628eb542f315454cace774/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/f5a1e9f23a38b610ce02ed4d97d33fb6d2eb2b2eab6ac3e55601250a99dd2b45/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/026e9cd0b29f3dc44ef5829c06be67a8aa58b21b39628eb542f315454cace774/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 8d337125..92a467bc 100644 Binary files a/godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/f5a1e9f23a38b610ce02ed4d97d33fb6d2eb2b2eab6ac3e55601250a99dd2b45/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SdfgiDebugProbesShaderRD/026e9cd0b29f3dc44ef5829c06be67a8aa58b21b39628eb542f315454cace774/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SdfgiDebugShaderRD/19bb112b5936d89a78ebd6dd6b1ba115993927640303397c343a5b02d7a7de99/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SdfgiDebugShaderRD/182acfe5e12b46afe084be225bbf43645307f4fe772ee0f7d98d6bee7418d248/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/SdfgiDebugShaderRD/19bb112b5936d89a78ebd6dd6b1ba115993927640303397c343a5b02d7a7de99/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SdfgiDebugShaderRD/182acfe5e12b46afe084be225bbf43645307f4fe772ee0f7d98d6bee7418d248/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 3a2a44ee..d25bd92a 100644 Binary files a/godot/.godot/shader_cache/SdfgiDebugShaderRD/19bb112b5936d89a78ebd6dd6b1ba115993927640303397c343a5b02d7a7de99/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SdfgiDebugShaderRD/182acfe5e12b46afe084be225bbf43645307f4fe772ee0f7d98d6bee7418d248/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SdfgiDirectLightShaderRD/b51c953c895f50ed291e2447b1ba68e74a15c3456c9543e13b944d4bfa52e59e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SdfgiDirectLightShaderRD/3d5c18b29d71caf2c3715a736c2a5f8c3f48d94cc8461e48802fd45206c034e1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/SdfgiDirectLightShaderRD/b51c953c895f50ed291e2447b1ba68e74a15c3456c9543e13b944d4bfa52e59e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SdfgiDirectLightShaderRD/3d5c18b29d71caf2c3715a736c2a5f8c3f48d94cc8461e48802fd45206c034e1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 193e328c..c3be2a51 100644 Binary files a/godot/.godot/shader_cache/SdfgiDirectLightShaderRD/b51c953c895f50ed291e2447b1ba68e74a15c3456c9543e13b944d4bfa52e59e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SdfgiDirectLightShaderRD/3d5c18b29d71caf2c3715a736c2a5f8c3f48d94cc8461e48802fd45206c034e1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SdfgiIntegrateShaderRD/787dd81f8782397c3b78d8f955b560c24d56a144db5b4d4136ff1e7f7d7e715b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SdfgiIntegrateShaderRD/85d5e0c692bcadb6746f4ff67a44bf1c6f6f6471cc81f6c5f246ff10aaafd02a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 98% rename from godot/.godot/shader_cache/SdfgiIntegrateShaderRD/787dd81f8782397c3b78d8f955b560c24d56a144db5b4d4136ff1e7f7d7e715b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SdfgiIntegrateShaderRD/85d5e0c692bcadb6746f4ff67a44bf1c6f6f6471cc81f6c5f246ff10aaafd02a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index fa015937..75af47f8 100644 Binary files a/godot/.godot/shader_cache/SdfgiIntegrateShaderRD/787dd81f8782397c3b78d8f955b560c24d56a144db5b4d4136ff1e7f7d7e715b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SdfgiIntegrateShaderRD/85d5e0c692bcadb6746f4ff67a44bf1c6f6f6471cc81f6c5f246ff10aaafd02a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SdfgiPreprocessShaderRD/4b49e1d0c6d932608a0b7e49db561bc4139898c130425be4217d4c67560350e7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SdfgiPreprocessShaderRD/9ecd850b144213458c2a8a17481071b402b6269f67fa8c8990a724795a126e79/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/SdfgiPreprocessShaderRD/4b49e1d0c6d932608a0b7e49db561bc4139898c130425be4217d4c67560350e7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SdfgiPreprocessShaderRD/9ecd850b144213458c2a8a17481071b402b6269f67fa8c8990a724795a126e79/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 205e3e10..022e514b 100644 Binary files a/godot/.godot/shader_cache/SdfgiPreprocessShaderRD/4b49e1d0c6d932608a0b7e49db561bc4139898c130425be4217d4c67560350e7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SdfgiPreprocessShaderRD/9ecd850b144213458c2a8a17481071b402b6269f67fa8c8990a724795a126e79/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SkeletonShaderRD/8caeb0594b84f48168e5c60481b8545dc8340f2837ed1e075cc8c0feb4ad7bd7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SkeletonShaderRD/d100baf93241f0c754cda69975d01951dd876e5fd8513e55af7d8b7b66aed501/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/SkeletonShaderRD/8caeb0594b84f48168e5c60481b8545dc8340f2837ed1e075cc8c0feb4ad7bd7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SkeletonShaderRD/d100baf93241f0c754cda69975d01951dd876e5fd8513e55af7d8b7b66aed501/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 30f9ff8f..db0e0d51 100644 Binary files a/godot/.godot/shader_cache/SkeletonShaderRD/8caeb0594b84f48168e5c60481b8545dc8340f2837ed1e075cc8c0feb4ad7bd7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SkeletonShaderRD/d100baf93241f0c754cda69975d01951dd876e5fd8513e55af7d8b7b66aed501/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache new file mode 100644 index 00000000..8e96849f Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/064198c016022615fe6753142c7d0fb63e72359e.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/064198c016022615fe6753142c7d0fb63e72359e.cache new file mode 100644 index 00000000..49dea458 Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/064198c016022615fe6753142c7d0fb63e72359e.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/5e341807a40df1680aa1db561c90fe1002c781bd.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/5e341807a40df1680aa1db561c90fe1002c781bd.cache new file mode 100644 index 00000000..45847703 Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/5e341807a40df1680aa1db561c90fe1002c781bd.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/79dc3bbb81851ed6d2a1ad9cc2f3769d66b46f3f.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/79dc3bbb81851ed6d2a1ad9cc2f3769d66b46f3f.cache new file mode 100644 index 00000000..d2c397b0 Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/79dc3bbb81851ed6d2a1ad9cc2f3769d66b46f3f.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/8fe86c44ce6769fa73b7b51d9e577eb651b19e4b.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/8fe86c44ce6769fa73b7b51d9e577eb651b19e4b.cache new file mode 100644 index 00000000..190aa3fa Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/8fe86c44ce6769fa73b7b51d9e577eb651b19e4b.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache new file mode 100644 index 00000000..ae39ac29 Binary files /dev/null and b/godot/.godot/shader_cache/SkyShaderRD/63ede5b91bef1e7195c5b7ab4baea467ec7f8bd84dcd6a3cefdb6608c2c762e7/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache deleted file mode 100644 index 2a85f747..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/03e3b11c69e24394b2d955a8c0ba85587bb70839.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/59fe6cf05bf4a13d34c144643274612aacecb959.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/59fe6cf05bf4a13d34c144643274612aacecb959.cache deleted file mode 100644 index 910471a1..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/59fe6cf05bf4a13d34c144643274612aacecb959.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/793ce7e11b582451627017df13679d8dac889488.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/793ce7e11b582451627017df13679d8dac889488.cache deleted file mode 100644 index 393b96a4..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/793ce7e11b582451627017df13679d8dac889488.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/95e55bdcfff59c30143e80c9cabfe2f175ddb660.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/95e55bdcfff59c30143e80c9cabfe2f175ddb660.cache deleted file mode 100644 index 16a80208..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/95e55bdcfff59c30143e80c9cabfe2f175ddb660.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/bddcccb6fecec91e3f1e00c0d9106cb612b1daf2.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/bddcccb6fecec91e3f1e00c0d9106cb612b1daf2.cache deleted file mode 100644 index 9e0a94bb..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/bddcccb6fecec91e3f1e00c0d9106cb612b1daf2.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache deleted file mode 100644 index 64c4476f..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/de678811d1bad3cad4892a8db7b6ea0be197d51d.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/f01de7cfc190c5a681916d623818c76cd220b8f4.cache b/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/f01de7cfc190c5a681916d623818c76cd220b8f4.cache deleted file mode 100644 index 11c0d3a6..00000000 Binary files a/godot/.godot/shader_cache/SkyShaderRD/92473bae51d06bf654ef4f447af22d4426f2db7906ef4dba10874131e2b77488/f01de7cfc190c5a681916d623818c76cd220b8f4.cache and /dev/null differ diff --git a/godot/.godot/shader_cache/SortShaderRD/bbc61ccf4e8d618fda43c2e9be55e052efec7ff4778823329ce8bcdaf6cb79f0/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SortShaderRD/84d06f923bde52ed9458b465349a5feca0ffed31985f5f4cacd00ecc58216401/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/SortShaderRD/bbc61ccf4e8d618fda43c2e9be55e052efec7ff4778823329ce8bcdaf6cb79f0/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SortShaderRD/84d06f923bde52ed9458b465349a5feca0ffed31985f5f4cacd00ecc58216401/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index bc43083d..5d1ddcf1 100644 Binary files a/godot/.godot/shader_cache/SortShaderRD/bbc61ccf4e8d618fda43c2e9be55e052efec7ff4778823329ce8bcdaf6cb79f0/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SortShaderRD/84d06f923bde52ed9458b465349a5feca0ffed31985f5f4cacd00ecc58216401/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SpecularMergeShaderRD/fa9280cfdae9918d12d99092daf8f0ebc132718562abbbc50fddde1ea4f6ca93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SpecularMergeShaderRD/bae3d41c61574dc17f302d63a3b8757a001d8fba63aa6187acb13ebca6489d11/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 69% rename from godot/.godot/shader_cache/SpecularMergeShaderRD/fa9280cfdae9918d12d99092daf8f0ebc132718562abbbc50fddde1ea4f6ca93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SpecularMergeShaderRD/bae3d41c61574dc17f302d63a3b8757a001d8fba63aa6187acb13ebca6489d11/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 189095e4..42de2af1 100644 Binary files a/godot/.godot/shader_cache/SpecularMergeShaderRD/fa9280cfdae9918d12d99092daf8f0ebc132718562abbbc50fddde1ea4f6ca93/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SpecularMergeShaderRD/bae3d41c61574dc17f302d63a3b8757a001d8fba63aa6187acb13ebca6489d11/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/2bb7b9f5ccada7ae7015970d5fb7f34dea1d257a82c58a216c382124b2900ddf/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/005d00945d77245a98fcf6dd0f9321f3ed8adf11d1e0f8a0a81a70bea28de26b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 89% rename from godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/2bb7b9f5ccada7ae7015970d5fb7f34dea1d257a82c58a216c382124b2900ddf/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/005d00945d77245a98fcf6dd0f9321f3ed8adf11d1e0f8a0a81a70bea28de26b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index a4cc9194..64db8836 100644 Binary files a/godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/2bb7b9f5ccada7ae7015970d5fb7f34dea1d257a82c58a216c382124b2900ddf/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsEffectsDownsampleShaderRD/005d00945d77245a98fcf6dd0f9321f3ed8adf11d1e0f8a0a81a70bea28de26b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsaoBlurShaderRD/f272214372abaffe0d6ed907d2a2d9d761e328e1916cbc3835fd26217edfd075/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsaoBlurShaderRD/7e7da8ac461c7fcf3056ab632798acc257559d80902a7e15e613b73632dc1b62/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/SsaoBlurShaderRD/f272214372abaffe0d6ed907d2a2d9d761e328e1916cbc3835fd26217edfd075/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsaoBlurShaderRD/7e7da8ac461c7fcf3056ab632798acc257559d80902a7e15e613b73632dc1b62/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 5a5eeb39..c3a53744 100644 Binary files a/godot/.godot/shader_cache/SsaoBlurShaderRD/f272214372abaffe0d6ed907d2a2d9d761e328e1916cbc3835fd26217edfd075/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsaoBlurShaderRD/7e7da8ac461c7fcf3056ab632798acc257559d80902a7e15e613b73632dc1b62/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsaoImportanceMapShaderRD/91375f3fba95fa03a5064db08493d1aa5eec833f3e4aa87865f9189d9d56e9e3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsaoImportanceMapShaderRD/865b2b8ddbc37af96929dfc2c9c800c3f007e24854025222ab63e8e79aeacf6c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 93% rename from godot/.godot/shader_cache/SsaoImportanceMapShaderRD/91375f3fba95fa03a5064db08493d1aa5eec833f3e4aa87865f9189d9d56e9e3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsaoImportanceMapShaderRD/865b2b8ddbc37af96929dfc2c9c800c3f007e24854025222ab63e8e79aeacf6c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index edd56ecc..b09b1773 100644 Binary files a/godot/.godot/shader_cache/SsaoImportanceMapShaderRD/91375f3fba95fa03a5064db08493d1aa5eec833f3e4aa87865f9189d9d56e9e3/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsaoImportanceMapShaderRD/865b2b8ddbc37af96929dfc2c9c800c3f007e24854025222ab63e8e79aeacf6c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsaoInterleaveShaderRD/115877e83d469e48bec48f9a1cd7cbb43659e42a7ac3b59dff3cf1596341bfd8/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsaoInterleaveShaderRD/b94da1927c96e4aeb7f2a94e928eecbf938193fb42015560cb80fb13e47e2344/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 92% rename from godot/.godot/shader_cache/SsaoInterleaveShaderRD/115877e83d469e48bec48f9a1cd7cbb43659e42a7ac3b59dff3cf1596341bfd8/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsaoInterleaveShaderRD/b94da1927c96e4aeb7f2a94e928eecbf938193fb42015560cb80fb13e47e2344/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index d82d8cfc..50af30b1 100644 Binary files a/godot/.godot/shader_cache/SsaoInterleaveShaderRD/115877e83d469e48bec48f9a1cd7cbb43659e42a7ac3b59dff3cf1596341bfd8/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsaoInterleaveShaderRD/b94da1927c96e4aeb7f2a94e928eecbf938193fb42015560cb80fb13e47e2344/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsaoShaderRD/57f594fe4ca9cab11da92b5db53c3da2c4f9fed7d54bda4637a82a875be96b8b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsaoShaderRD/83aad29481f7b09a719c58445249016c1f540945ff5baafcff9e0b4a515807d1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 99% rename from godot/.godot/shader_cache/SsaoShaderRD/57f594fe4ca9cab11da92b5db53c3da2c4f9fed7d54bda4637a82a875be96b8b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsaoShaderRD/83aad29481f7b09a719c58445249016c1f540945ff5baafcff9e0b4a515807d1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index e2bac510..0aab13d2 100644 Binary files a/godot/.godot/shader_cache/SsaoShaderRD/57f594fe4ca9cab11da92b5db53c3da2c4f9fed7d54bda4637a82a875be96b8b/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsaoShaderRD/83aad29481f7b09a719c58445249016c1f540945ff5baafcff9e0b4a515807d1/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsilBlurShaderRD/234c0ec18f6d53ed1c398505763d2b3128de6e09d0e924009bbf111057df444c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsilBlurShaderRD/75ab9d6baf1a5ed4a16e4b8faa9e9ca5dc9e661ca8020cd2786ec9a2f19322ff/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 93% rename from godot/.godot/shader_cache/SsilBlurShaderRD/234c0ec18f6d53ed1c398505763d2b3128de6e09d0e924009bbf111057df444c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsilBlurShaderRD/75ab9d6baf1a5ed4a16e4b8faa9e9ca5dc9e661ca8020cd2786ec9a2f19322ff/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index dfe166cc..6445545e 100644 Binary files a/godot/.godot/shader_cache/SsilBlurShaderRD/234c0ec18f6d53ed1c398505763d2b3128de6e09d0e924009bbf111057df444c/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsilBlurShaderRD/75ab9d6baf1a5ed4a16e4b8faa9e9ca5dc9e661ca8020cd2786ec9a2f19322ff/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsilImportanceMapShaderRD/f1693982b0e6960e73c5ed36b7de14e0bd7818230244207dc05f84e788381574/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsilImportanceMapShaderRD/c0100afc6140b85b8487d2766bdd73e9724f3fe8cd2e473f227e6b49db67da16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/SsilImportanceMapShaderRD/f1693982b0e6960e73c5ed36b7de14e0bd7818230244207dc05f84e788381574/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsilImportanceMapShaderRD/c0100afc6140b85b8487d2766bdd73e9724f3fe8cd2e473f227e6b49db67da16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index d5dae4ec..85ac9348 100644 Binary files a/godot/.godot/shader_cache/SsilImportanceMapShaderRD/f1693982b0e6960e73c5ed36b7de14e0bd7818230244207dc05f84e788381574/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsilImportanceMapShaderRD/c0100afc6140b85b8487d2766bdd73e9724f3fe8cd2e473f227e6b49db67da16/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsilInterleaveShaderRD/576387f3d286cc03bd12a368a3179ff99039c44f34e984281d6b864122212c0a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsilInterleaveShaderRD/2911c6399e544ebc121f04c026be04e56bd5d7c1e0f2898a3108e2a4030c75db/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 92% rename from godot/.godot/shader_cache/SsilInterleaveShaderRD/576387f3d286cc03bd12a368a3179ff99039c44f34e984281d6b864122212c0a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsilInterleaveShaderRD/2911c6399e544ebc121f04c026be04e56bd5d7c1e0f2898a3108e2a4030c75db/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index c8bb30f8..3974f7e2 100644 Binary files a/godot/.godot/shader_cache/SsilInterleaveShaderRD/576387f3d286cc03bd12a368a3179ff99039c44f34e984281d6b864122212c0a/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsilInterleaveShaderRD/2911c6399e544ebc121f04c026be04e56bd5d7c1e0f2898a3108e2a4030c75db/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SsilShaderRD/7c544d4cb09d6151d2da02e8154dddaf46ee10340ce30f1c02dd4c6402809f74/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SsilShaderRD/e10f70cf5ee769fd43aafb27a9b6f027ee0e3cb4ad0c18b09c9d08b0faf2344d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 98% rename from godot/.godot/shader_cache/SsilShaderRD/7c544d4cb09d6151d2da02e8154dddaf46ee10340ce30f1c02dd4c6402809f74/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SsilShaderRD/e10f70cf5ee769fd43aafb27a9b6f027ee0e3cb4ad0c18b09c9d08b0faf2344d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 04135fb6..4e5ca9ec 100644 Binary files a/godot/.godot/shader_cache/SsilShaderRD/7c544d4cb09d6151d2da02e8154dddaf46ee10340ce30f1c02dd4c6402809f74/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SsilShaderRD/e10f70cf5ee769fd43aafb27a9b6f027ee0e3cb4ad0c18b09c9d08b0faf2344d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/9e3c3a463e384cc3c48779fab97927f23e266f3713c75f4ebbc18cfb5e138d0e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/04c06bf911efc274f1d71bc90f49ff92ce948711127d4a165ddbf8a41f0f102f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 95% rename from godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/9e3c3a463e384cc3c48779fab97927f23e266f3713c75f4ebbc18cfb5e138d0e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/04c06bf911efc274f1d71bc90f49ff92ce948711127d4a165ddbf8a41f0f102f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index c94ba3a0..4bb7813e 100644 Binary files a/godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/9e3c3a463e384cc3c48779fab97927f23e266f3713c75f4ebbc18cfb5e138d0e/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/SubsurfaceScatteringShaderRD/04c06bf911efc274f1d71bc90f49ff92ce948711127d4a165ddbf8a41f0f102f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/TaaResolveShaderRD/d8fc4c3ca512a5e8f306f9bdba13d0daaa6c764dcd17d1e919b627c8ce1cd770/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/TaaResolveShaderRD/de247eb3a5ea4f3e68fbdff0592b574f39c59c42c2a5ca4e2380786f23809328/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 98% rename from godot/.godot/shader_cache/TaaResolveShaderRD/d8fc4c3ca512a5e8f306f9bdba13d0daaa6c764dcd17d1e919b627c8ce1cd770/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/TaaResolveShaderRD/de247eb3a5ea4f3e68fbdff0592b574f39c59c42c2a5ca4e2380786f23809328/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 7092b188..cccf276d 100644 Binary files a/godot/.godot/shader_cache/TaaResolveShaderRD/d8fc4c3ca512a5e8f306f9bdba13d0daaa6c764dcd17d1e919b627c8ce1cd770/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/TaaResolveShaderRD/de247eb3a5ea4f3e68fbdff0592b574f39c59c42c2a5ca4e2380786f23809328/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/TonemapShaderRD/8f4ef13f770ca9b28453a50bd2e69720362a04cb7780d45364c52d7f61921db4/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/TonemapShaderRD/0403a6c77e97ecbf3816b1d29f71da5d83442bb55380af34f32653fcb1c5a6c7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/TonemapShaderRD/8f4ef13f770ca9b28453a50bd2e69720362a04cb7780d45364c52d7f61921db4/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/TonemapShaderRD/0403a6c77e97ecbf3816b1d29f71da5d83442bb55380af34f32653fcb1c5a6c7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 1837ee7b..33c44d01 100644 Binary files a/godot/.godot/shader_cache/TonemapShaderRD/8f4ef13f770ca9b28453a50bd2e69720362a04cb7780d45364c52d7f61921db4/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/TonemapShaderRD/0403a6c77e97ecbf3816b1d29f71da5d83442bb55380af34f32653fcb1c5a6c7/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/VolumetricFogProcessShaderRD/42e2dad7c0d62523fa322856fbd59ee4e16ac1a71cb4cbc322ed6f9ce02ed638/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/VolumetricFogProcessShaderRD/36c39051dd215d13119b0dfe11a404c565a9d94f258bc6a5b24acc68153c9f95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 98% rename from godot/.godot/shader_cache/VolumetricFogProcessShaderRD/42e2dad7c0d62523fa322856fbd59ee4e16ac1a71cb4cbc322ed6f9ce02ed638/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/VolumetricFogProcessShaderRD/36c39051dd215d13119b0dfe11a404c565a9d94f258bc6a5b24acc68153c9f95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index a8223f84..60e365c2 100644 Binary files a/godot/.godot/shader_cache/VolumetricFogProcessShaderRD/42e2dad7c0d62523fa322856fbd59ee4e16ac1a71cb4cbc322ed6f9ce02ed638/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/VolumetricFogProcessShaderRD/36c39051dd215d13119b0dfe11a404c565a9d94f258bc6a5b24acc68153c9f95/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/VolumetricFogShaderRD/e8e03650409b51dbb984da28e2da4ca57d5b351410b54cc85ecd2e3b30c4df66/9a227745af2d65830f930370a9fbba551fbd6f60.cache b/godot/.godot/shader_cache/VolumetricFogShaderRD/9c9f121242fcffc637a3bba591e33224a2aa14847cdc252f270132c0e44dd726/9a227745af2d65830f930370a9fbba551fbd6f60.cache similarity index 100% rename from godot/.godot/shader_cache/VolumetricFogShaderRD/e8e03650409b51dbb984da28e2da4ca57d5b351410b54cc85ecd2e3b30c4df66/9a227745af2d65830f930370a9fbba551fbd6f60.cache rename to godot/.godot/shader_cache/VolumetricFogShaderRD/9c9f121242fcffc637a3bba591e33224a2aa14847cdc252f270132c0e44dd726/9a227745af2d65830f930370a9fbba551fbd6f60.cache diff --git a/godot/.godot/shader_cache/VoxelGiDebugShaderRD/2d9932eeb6cb6cf8bcec70b30515ff04ed24094bf2cc48e0fe467f8a41512732/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/VoxelGiDebugShaderRD/4839b581df773c79ad756bff1af6f7d657a18f37850e9a57ae0828ab912d2161/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 94% rename from godot/.godot/shader_cache/VoxelGiDebugShaderRD/2d9932eeb6cb6cf8bcec70b30515ff04ed24094bf2cc48e0fe467f8a41512732/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/VoxelGiDebugShaderRD/4839b581df773c79ad756bff1af6f7d657a18f37850e9a57ae0828ab912d2161/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 31b19537..1b9d6b26 100644 Binary files a/godot/.godot/shader_cache/VoxelGiDebugShaderRD/2d9932eeb6cb6cf8bcec70b30515ff04ed24094bf2cc48e0fe467f8a41512732/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/VoxelGiDebugShaderRD/4839b581df773c79ad756bff1af6f7d657a18f37850e9a57ae0828ab912d2161/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/VoxelGiShaderRD/9270766eeb2299f2a122e2a48b2b4a5432d67cce3ca0768a6439791722e9ca7f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/VoxelGiShaderRD/069e0ac288b2930ed9b40966befd4ba0a00e712862315389a27299c24d4a6ee5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 97% rename from godot/.godot/shader_cache/VoxelGiShaderRD/9270766eeb2299f2a122e2a48b2b4a5432d67cce3ca0768a6439791722e9ca7f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/VoxelGiShaderRD/069e0ac288b2930ed9b40966befd4ba0a00e712862315389a27299c24d4a6ee5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index a78661f0..c0780651 100644 Binary files a/godot/.godot/shader_cache/VoxelGiShaderRD/9270766eeb2299f2a122e2a48b2b4a5432d67cce3ca0768a6439791722e9ca7f/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/VoxelGiShaderRD/069e0ac288b2930ed9b40966befd4ba0a00e712862315389a27299c24d4a6ee5/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/.godot/shader_cache/VrsShaderRD/d3cf5e27cd34584bfec34510117cda868b27a0e32138f75e4c5584dfa3cc8739/087916079fba7c625e62b0c2cca570e0fb87c99a.cache b/godot/.godot/shader_cache/VrsShaderRD/484d74ab93b037c3c748d30e165a41f5d2517e563f05342958edccd45f4bb26d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache similarity index 86% rename from godot/.godot/shader_cache/VrsShaderRD/d3cf5e27cd34584bfec34510117cda868b27a0e32138f75e4c5584dfa3cc8739/087916079fba7c625e62b0c2cca570e0fb87c99a.cache rename to godot/.godot/shader_cache/VrsShaderRD/484d74ab93b037c3c748d30e165a41f5d2517e563f05342958edccd45f4bb26d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache index 8c3c46dc..1444f4b3 100644 Binary files a/godot/.godot/shader_cache/VrsShaderRD/d3cf5e27cd34584bfec34510117cda868b27a0e32138f75e4c5584dfa3cc8739/087916079fba7c625e62b0c2cca570e0fb87c99a.cache and b/godot/.godot/shader_cache/VrsShaderRD/484d74ab93b037c3c748d30e165a41f5d2517e563f05342958edccd45f4bb26d/087916079fba7c625e62b0c2cca570e0fb87c99a.cache differ diff --git a/godot/decentraland_godot_lib.gdextension b/godot/decentraland_godot_lib.gdextension index 9bd7d564..ae50ff5c 100644 --- a/godot/decentraland_godot_lib.gdextension +++ b/godot/decentraland_godot_lib.gdextension @@ -1,5 +1,6 @@ [configuration] entry_symbol = "gdext_rust_init" +compatibility_minimum = "4.1" [libraries] windows.debug.x86_64 = "res://lib/decentraland_godot_lib.dll" diff --git a/godot/export_presets.cfg b/godot/export_presets.cfg index f8e0dced..8dda924d 100644 --- a/godot/export_presets.cfg +++ b/godot/export_presets.cfg @@ -13,13 +13,12 @@ encryption_include_filters="" encryption_exclude_filters="" encrypt_pck=false encrypt_directory=false -script_encryption_key="" [preset.0.options] -custom_template/debug="" -custom_template/release="" -debug/export_console_script=1 +custom_template/debug="./../.bin/godot/templates/templates/linux_debug.x86_64" +custom_template/release="./../.bin/godot/templates/templates/linux_release.x86_64" +debug/export_console_wrapper=1 binary_format/embed_pck=false texture_format/bptc=true texture_format/s3tc=true @@ -54,14 +53,14 @@ encryption_include_filters="" encryption_exclude_filters="" encrypt_pck=false encrypt_directory=false -script_encryption_key="" [preset.1.options] +export/distribution_type=1 binary_format/architecture="universal" -custom_template/debug="" -custom_template/release="" -debug/export_console_script=1 +custom_template/debug="./../.bin/godot/templates/templates/macos.zip" +custom_template/release="./../.bin/godot/templates/templates/macos.zip" +debug/export_console_wrapper=1 application/icon="" application/icon_interpolation=4 application/bundle_identifier="com.decentraland.godot" @@ -71,11 +70,18 @@ application/short_version="1.0" application/version="1.0" application/copyright="" application/copyright_localized={} +application/min_macos_version="10.12" display/high_res=true +xcode/platform_build="14C18" +xcode/sdk_version="13.1" +xcode/sdk_build="22C55" +xcode/sdk_name="macosx13.1" +xcode/xcode_version="1420" +xcode/xcode_build="14C18" codesign/codesign=1 +codesign/installer_identity="" +codesign/apple_team_id="" codesign/identity="" -codesign/certificate_file="" -codesign/certificate_password="" codesign/entitlements/custom_file="" codesign/entitlements/allow_jit_code_execution=false codesign/entitlements/allow_unsigned_executable_memory=false @@ -101,12 +107,6 @@ codesign/entitlements/app_sandbox/files_movies=0 codesign/entitlements/app_sandbox/helper_executables=[] codesign/custom_options=PackedStringArray() notarization/notarization=0 -notarization/apple_id_name="" -notarization/apple_id_password="" -notarization/apple_team_id="" -notarization/api_uuid="" -notarization/api_key="" -notarization/api_key_id="" privacy/microphone_usage_description="" privacy/microphone_usage_description_localized={} privacy/camera_usage_description="" @@ -156,13 +156,12 @@ encryption_include_filters="" encryption_exclude_filters="" encrypt_pck=false encrypt_directory=false -script_encryption_key="" [preset.2.options] -custom_template/debug="" -custom_template/release="" -debug/export_console_script=1 +custom_template/debug="./../.bin/godot/templates/templates/windows_debug_x86_64.exe" +custom_template/release="./../.bin/godot/templates/templates/windows_release_x86_64.exe" +debug/export_console_wrapper=1 binary_format/embed_pck=false texture_format/bptc=true texture_format/s3tc=true @@ -170,9 +169,6 @@ texture_format/etc=false texture_format/etc2=false binary_format/architecture="x86_64" codesign/enable=false -codesign/identity_type=0 -codesign/identity="" -codesign/password="" codesign/timestamp=true codesign/timestamp_server_url="" codesign/digest_algorithm=1 @@ -222,12 +218,11 @@ encryption_include_filters="" encryption_exclude_filters="" encrypt_pck=false encrypt_directory=false -script_encryption_key="" [preset.3.options] -custom_template/debug="" -custom_template/release="" +custom_template/debug="./../.bin/godot/templates/templates/android_debug.apk" +custom_template/release="./../.bin/godot/templates/templates/android_release.apk" gradle_build/use_gradle_build=false gradle_build/export_format=0 gradle_build/min_sdk="" @@ -236,12 +231,6 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -keystore/debug="" -keystore/debug_user="" -keystore/debug_password="" -keystore/release="" -keystore/release_user="" -keystore/release_password="" version/code=1 version/name="1.0" package/unique_name="org.godotengine.decentralandgodot" diff --git a/godot/project.godot b/godot/project.godot index 87f5891a..86ee9587 100644 --- a/godot/project.godot +++ b/godot/project.godot @@ -13,7 +13,7 @@ config_version=5 config/name="Decentraland Godot Rust" config/description="Decentraland Godot Client - Protocol Squad" run/main_scene="res://src/main.tscn" -config/features=PackedStringArray("4.0") +config/features=PackedStringArray("4.1") config/icon="res://decentraland_logo.png" [autoload] @@ -110,7 +110,7 @@ ia_action6={ } ia_pointer={ "deadzone": 0.5, -"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null) +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } double_gravity={ diff --git a/godot/src/decentraland_components/gltf_container.gd b/godot/src/decentraland_components/gltf_container.gd index 15a9c309..f6688e23 100644 --- a/godot/src/decentraland_components/gltf_container.gd +++ b/godot/src/decentraland_components/gltf_container.gd @@ -29,7 +29,7 @@ func load_gltf(): var content_manager: ContentManager = get_tree().root.get_node("content_manager") self.dcl_gltf_src = dcl_gltf_src.to_lower() - self.file_hash = content_mapping.get_content_hash(dcl_gltf_src) + self.file_hash = content_mapping.get("content", {}).get(dcl_gltf_src, "") if self.file_hash.is_empty(): gltf_state = GodotGltfState.NotFound diff --git a/godot/src/global.gd b/godot/src/global.gd index 509a81f9..698cfb7c 100644 --- a/godot/src/global.gd +++ b/godot/src/global.gd @@ -9,3 +9,7 @@ func _ready(): func add_raycast(id: int, time: float, from: Vector3, to: Vector3) -> void: raycast_debugger.add_raycast(id, time, from, to) + + +func get_tls_client(): + return TLSOptions.client_unsafe() diff --git a/godot/src/logic/content_manager.gd b/godot/src/logic/content_manager.gd index 153b6221..a53e4c3e 100644 --- a/godot/src/logic/content_manager.gd +++ b/godot/src/logic/content_manager.gd @@ -27,8 +27,8 @@ func get_resource_from_hash(file_hash: String): return null -func get_resource(file_path: String, _content_type: ContentType, content_mapping: ContentMapping): - var file_hash = content_mapping.get_content_hash(file_path) +func get_resource(file_path: String, _content_type: ContentType, content_mapping: Dictionary): + var file_hash: String = content_mapping.get("content", {}).get(file_path, "") var content_cached = content_cache_map.get(file_hash) if content_cached != null and content_cached.get("loaded"): return content_cached.get("resource") @@ -36,8 +36,8 @@ func get_resource(file_path: String, _content_type: ContentType, content_mapping return null -func fetch_resource(file_path: String, content_type: ContentType, content_mapping: ContentMapping): - var file_hash = content_mapping.get_content_hash(file_path) +func fetch_resource(file_path: String, content_type: ContentType, content_mapping: Dictionary): + var file_hash: String = content_mapping.get("content", {}).get(file_path, "") var content_cached = content_cache_map.get(file_hash) if content_cached != null: return not content_cached.get("loaded") @@ -97,10 +97,10 @@ func get_finished_downloads() -> Array[RequestResponse]: func process_loading_gltf(content: Dictionary, finished_downloads: Array[RequestResponse]) -> bool: - var content_mapping: ContentMapping = content.get("content_mapping") + var content_mapping = content.get("content_mapping") var file_hash: String = content.get("file_hash") var file_path: String = content.get("file_path") - var base_url = content_mapping.get_base_url() + var base_url: String = content_mapping.get("base_url", "") var base_path = file_path.get_base_dir() var local_gltf_path = "user://content/" + file_hash @@ -158,12 +158,9 @@ func process_loading_gltf(content: Dictionary, finished_downloads: Array[Request content["request_dependencies"] = [] for uri in dependencies: var image_path = base_path + "/" + uri - var image_hash = content_mapping.get_content_hash(image_path.to_lower()) + var image_hash = content_mapping.get("content", {}).get(image_path.to_lower(), "") if image_hash.is_empty() or base_url.is_empty(): - printerr( - uri + " not found (resolved: " + image_path + ") => ", - content_mapping.get_mappings() - ) + printerr(uri + " not found (resolved: " + image_path + ") => ", content_mapping) continue var local_image_path = "user://content/" + image_hash diff --git a/godot/src/logic/parcel_manager.gd b/godot/src/logic/parcel_manager.gd index 40781911..f9341cb6 100644 --- a/godot/src/logic/parcel_manager.gd +++ b/godot/src/logic/parcel_manager.gd @@ -221,9 +221,9 @@ func _on_try_spawn_scene(scene): var p = parcel.split_floats(",") parcels.push_back(Vector2i(int(p[0]), int(p[1]))) - var content_mapping = ContentMapping.new() - content_mapping.set_content_mapping(scene.entity["content"]) - content_mapping.set_base_url(scene.entity.baseUrl) + var content_mapping: Dictionary = { + "base_url": scene.entity.baseUrl, "content": scene.entity["content"] + } var scene_definition: Dictionary = { "base": Vector2i(base_parcel[0], base_parcel[1]), diff --git a/godot/src/main.gd b/godot/src/main.gd index 6a3f45f6..bd41df1b 100644 --- a/godot/src/main.gd +++ b/godot/src/main.gd @@ -26,8 +26,12 @@ func start(): var content_manager = ContentManager.new() content_manager.set_name("content_manager") + var comms = Comms.new() + comms.set_name("comms") + get_tree().root.add_child(scene_runner) get_tree().root.add_child(realm) + get_tree().root.add_child(comms) get_tree().root.add_child(content_manager) get_tree().change_scene_to_file("res://src/ui/explorer.tscn") diff --git a/rust/.cargo/config b/rust/.cargo/config index f0ccbc9a..5ef12845 100644 --- a/rust/.cargo/config +++ b/rust/.cargo/config @@ -1,2 +1,5 @@ [alias] -xtask = "run --package xtask --" \ No newline at end of file +xtask = "run --package xtask --" + +[env] +GODOT4_BIN = { value = "../.bin/godot/godot4_bin", relative = true } \ No newline at end of file diff --git a/rust/decentraland-godot-lib/Cargo.toml b/rust/decentraland-godot-lib/Cargo.toml index fe2db583..f422a429 100644 --- a/rust/decentraland-godot-lib/Cargo.toml +++ b/rust/decentraland-godot-lib/Cargo.toml @@ -8,9 +8,9 @@ publish = false crate-type = ["cdylib"] [dependencies] -godot = { git = "https://github.com/godot-rust/gdext", rev = "565bf105" } +godot = { git = "https://github.com/godot-rust/gdext", rev = "aa29debf", features = ["custom-godot"] } rand = "0.8" -serde = "1.0.152" +serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0.92", features = ["raw_value"] } tokio = { version = "1.26.0", features = ["sync", "rt-multi-thread", "net"] } protobuf = "3.2.0" @@ -20,16 +20,12 @@ futures-lite = "1.12.0" num-traits = "0.2" num-derive = "0.3" num = "0.4" -deno_core = "0.170.*" -serde_v8 = "0.81.0" +v8 = "0.74.2" hyper = { version = "1.0.0-rc.3", features = ["full"] } http-body-util = "0.1.0-rc.2" -reqwest = { version = "0.11" } +reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls", "blocking"] } regex = "*" urn = "0.7.0" [build-dependencies] prost-build = "0.11.8" - -[dev-dependencies] -httpmock = "0.6" diff --git a/rust/decentraland-godot-lib/build.rs b/rust/decentraland-godot-lib/build.rs index 54ad833f..9f20c969 100644 --- a/rust/decentraland-godot-lib/build.rs +++ b/rust/decentraland-godot-lib/build.rs @@ -11,6 +11,7 @@ struct Component { snake_name: String, } +const PROTO_FILES_BASE_DIR: &str = "src/dcl/components/proto/"; const COMPONENT_BASE_DIR: &str = "src/dcl/components/proto/decentraland/sdk/components/"; const GROW_ONLY_SET_COMPONENTS: [&str; 2] = ["PointerEventsResult", "VideoEvent"]; @@ -293,6 +294,12 @@ fn main() -> io::Result<()> { } } + proto_files.push( + format!("{PROTO_FILES_BASE_DIR}decentraland/kernel/comms/rfc5/ws_comms.proto").into(), + ); + proto_files + .push(format!("{PROTO_FILES_BASE_DIR}decentraland/kernel/comms/rfc4/comms.proto").into()); + generate_enum(&proto_components); generate_impl_crdt(&proto_components); generate_dcl_component_impl(&proto_components); diff --git a/rust/decentraland-godot-lib/src/comms/mod.rs b/rust/decentraland-godot-lib/src/comms/mod.rs new file mode 100644 index 00000000..79afff99 --- /dev/null +++ b/rust/decentraland-godot-lib/src/comms/mod.rs @@ -0,0 +1,201 @@ +use std::time::Instant; + +use godot::{ + engine::{TlsOptions, WebSocketPeer}, + prelude::*, +}; + +struct WebSocketRoom { + url: GodotString, + ws_peer: Gd, + last_state: godot::engine::web_socket_peer::State, + last_try_time: Instant, +} + +enum Adapter { + None, + WsRoom(WebSocketRoom), +} + +#[derive(GodotClass)] +#[class(base=Node)] +pub struct Comms { + #[base] + base: Base, + current_adapter: Adapter, + tls_client: Option>, +} + +#[godot_api] +impl NodeVirtual for Comms { + fn init(base: Base) -> Self { + Comms { + base, + current_adapter: Adapter::None, + tls_client: None, + } + } + + fn ready(&mut self) { + self.call_deferred("init_rs".into(), &[]); + } + + fn process(&mut self, _dt: f64) { + match &mut self.current_adapter { + Adapter::None => {} + Adapter::WsRoom(ws_room) => { + let mut peer = ws_room.ws_peer.share(); + peer.poll(); + + let current_state = peer.get_ready_state(); + if current_state != ws_room.last_state { + match peer.get_ready_state() { + godot::engine::web_socket_peer::State::STATE_CONNECTING => { + godot_print!("comms > connecting to {}", ws_room.url); + ws_room.last_try_time = Instant::now(); + } + godot::engine::web_socket_peer::State::STATE_CLOSING => { + godot_print!("comms > closing to {}", ws_room.url); + } + godot::engine::web_socket_peer::State::STATE_CLOSED => { + godot_print!("comms > closed to {}", ws_room.url); + } + godot::engine::web_socket_peer::State::STATE_OPEN => { + godot_print!("comms > connected to {}", ws_room.url); + // ws_packet::Message::PeerIdentification(WsIdentification {}) + } + _ => {} + } + ws_room.last_state = current_state; + } + + match peer.get_ready_state() { + godot::engine::web_socket_peer::State::STATE_CLOSED => { + if (Instant::now() - ws_room.last_try_time).as_secs() > 1 { + // TODO: see if the tls client is really required for now + let _tls_client = self.tls_client.as_ref().unwrap().share(); + + peer.call("connect_to_url".into(), &[ws_room.url.clone().to_variant()]); + } + } + godot::engine::web_socket_peer::State::STATE_OPEN => { + while peer.get_available_packet_count() > 0 { + let packet = peer.get_packet(); + godot_print!("comms > packet {:?}", packet); + } + } + _ => {} + } + } + } + } +} + +impl Comms {} + +#[godot_api] +impl Comms { + fn realm(&self) -> Gd { + self.base.get_node("/root/realm".into()).unwrap() + } + + #[func] + fn init_rs(&mut self) { + let mut realm = self.realm(); + let on_realm_changed = + Callable::from_object_method(self.base.share(), StringName::from("_on_realm_changed")); + + realm.connect("realm_changed".into(), on_realm_changed); + + if self.tls_client.is_none() { + let tls_client = self + .get_node("/root/Global".into()) + .unwrap() + .call("get_tls_client".into(), &[]); + let tls_client: Gd = Gd::from_variant(&tls_client); + self.tls_client = Some(tls_client); + } + } + + #[func] + fn _on_realm_changed(&mut self) { + self.call_deferred("_on_realm_changed_deferred".into(), &[]); + } + + fn _internal_get_comms_from_real(&self) -> Option<(String, Option)> { + let realm = self.realm(); + let realm_about = Dictionary::from_variant(&realm.get("realm_about".into())); + let comms = Dictionary::from_variant(&realm_about.get(StringName::from("comms"))?); + let comms_protocol = String::from_variant(&comms.get(StringName::from("protocol"))?); + let comms_fixed_adapter = comms + .get(StringName::from("fixedAdapter")) + .map(|v| GodotString::from_variant(&v)); + + Some((comms_protocol, comms_fixed_adapter)) + } + + #[func] + fn _on_realm_changed_deferred(&mut self) { + self.clean(); + + let comms = self._internal_get_comms_from_real(); + if comms.is_none() { + godot_print!("comms > invalid comms from realm."); + return; + } + + let (comms_protocol, comms_fixed_adapter) = comms.unwrap(); + if comms_protocol != "v3" { + godot_print!("comms > Only protocol 'v3' is supported."); + return; + } + + if comms_fixed_adapter.is_none() { + godot_print!("comms > As far, only fixedAdapter is supported."); + return; + } + + let comms_fixed_adapter_str = comms_fixed_adapter.unwrap().to_string(); + let fixed_adapter: Vec<&str> = comms_fixed_adapter_str.splitn(2, ':').collect(); + let adapter_protocol = *fixed_adapter.first().unwrap(); + + match adapter_protocol { + "ws-room" => { + if let Some(ws_url) = fixed_adapter.get(1) { + godot_print!("comms > websocket to {}", ws_url); + self.current_adapter = Adapter::WsRoom(WebSocketRoom { + ws_peer: WebSocketPeer::new(), + url: GodotString::from(ws_url), + last_state: godot::engine::web_socket_peer::State::STATE_CLOSED, + last_try_time: Instant::now(), + }); + } + } + "offline" => { + godot_print!("comms > set offline"); + } + _ => { + godot_print!("comms > unknown adapter {:?}", adapter_protocol); + } + } + } + + fn clean(&mut self) { + match &self.current_adapter { + Adapter::None => {} + Adapter::WsRoom(ws_room) => { + let mut peer = ws_room.ws_peer.share(); + peer.close(); + match peer.get_ready_state() { + godot::engine::web_socket_peer::State::STATE_OPEN + | godot::engine::web_socket_peer::State::STATE_CONNECTING => { + peer.close(); + } + _ => {} + } + } + } + + self.current_adapter = Adapter::None; + } +} diff --git a/rust/decentraland-godot-lib/src/dcl/components/proto_components.rs b/rust/decentraland-godot-lib/src/dcl/components/proto_components.rs index ad5c970a..83e511ae 100644 --- a/rust/decentraland-godot-lib/src/dcl/components/proto_components.rs +++ b/rust/decentraland-godot-lib/src/dcl/components/proto_components.rs @@ -15,3 +15,21 @@ pub mod sdk { pub mod common { include!(concat!(env!("OUT_DIR"), "/decentraland.common.rs")); } + +pub mod kernel { + #[allow(clippy::all)] + pub mod comms { + pub mod rfc5 { + include!(concat!( + env!("OUT_DIR"), + "/decentraland.kernel.comms.rfc5.rs" + )); + } + pub mod rfc4 { + include!(concat!( + env!("OUT_DIR"), + "/decentraland.kernel.comms.rfc4.rs" + )); + } + } +} diff --git a/rust/decentraland-godot-lib/src/dcl/crdt/entity.rs b/rust/decentraland-godot-lib/src/dcl/crdt/entity.rs index 79a63220..4f426a71 100644 --- a/rust/decentraland-godot-lib/src/dcl/crdt/entity.rs +++ b/rust/decentraland-godot-lib/src/dcl/crdt/entity.rs @@ -5,7 +5,7 @@ use std::collections::HashSet; pub struct SceneEntityContainer { // fixed array of 65536=2^16 elements, each index is the entity_number // the u16 item is the generation and the bool if is alive - entity_version: [(u16, bool); 65536], + entity_version: Vec<(u16, bool)>, new_entities_created: HashSet, entities_deleted: HashSet, } @@ -18,8 +18,11 @@ impl Default for SceneEntityContainer { impl SceneEntityContainer { pub fn new() -> Self { + let mut entity_version: Vec<(u16, bool)> = Vec::new(); + entity_version.resize(65536, (0, false)); + Self { - entity_version: [(0, false); 65536], + entity_version, new_entities_created: Default::default(), entities_deleted: Default::default(), } diff --git a/rust/decentraland-godot-lib/src/dcl/js/engine.rs b/rust/decentraland-godot-lib/src/dcl/js/engine.rs index 90150fc8..dc04b7d4 100644 --- a/rust/decentraland-godot-lib/src/dcl/js/engine.rs +++ b/rust/decentraland-godot-lib/src/dcl/js/engine.rs @@ -1,69 +1,66 @@ -use std::{ - cell::RefCell, - rc::Rc, - sync::{Arc, Mutex}, -}; - -use deno_core::{op, OpDecl, OpState}; -use godot::prelude::godot_print; - use crate::dcl::{ - crdt::{ - message::{append_gos_component, process_many_messages, put_or_delete_lww_component}, - SceneCrdtState, - }, - js::{SceneMainCrdtFileContent, ShuttingDown}, + crdt::message::{append_gos_component, process_many_messages, put_or_delete_lww_component}, serialization::{reader::DclReader, writer::DclWriter}, - RendererResponse, SceneId, SceneResponse, SharedSceneCrdtState, + RendererResponse, SceneResponse, }; -use super::{SceneElapsedTime, SceneLogMessage}; +use super::js_runtime::JsRuntime; -// list of op declarations -pub fn ops() -> Vec { - vec![ - op_crdt_send_to_renderer::decl(), - op_crdt_recv_from_renderer::decl(), - ] -} +pub fn op_crdt_send_to_renderer( + scope: &mut v8::HandleScope, + args: v8::FunctionCallbackArguments, + mut _ret: v8::ReturnValue, +) { + let state = JsRuntime::state_from(scope); + let mut state = state.borrow_mut(); -// receive and process a buffer of crdt messages -#[op(v8)] -fn op_crdt_send_to_renderer(op_state: Rc>, messages: &[u8]) { - let mut op_state = op_state.borrow_mut(); + let logs = std::mem::take(&mut state.logs); - let elapsed_time = op_state.borrow::().0; - let logs = op_state.take::>(); - op_state.put(Vec::::default()); - let scene_id = op_state.take::(); - let mutex_scene_crdt_state = op_state.take::(); + let mutex_scene_crdt_state = &mut state.crdt; let cloned_scene_crdt = mutex_scene_crdt_state.clone(); - let mut stream = DclReader::new(messages); let mut scene_crdt_state = cloned_scene_crdt.lock().unwrap(); + let param_0 = args.get(0); + let buffer_uint8array = v8::Local::::try_from(param_0).unwrap(); + + // TODO: avoid the copy + let buffer = unsafe { + let mut buffer = Vec::with_capacity(buffer_uint8array.byte_length()); + #[allow(clippy::uninit_vec)] + buffer.set_len(buffer_uint8array.byte_length()); + buffer_uint8array.copy_contents(&mut buffer); + buffer + }; + + let mut stream = DclReader::new(&buffer); + process_many_messages(&mut stream, &mut scene_crdt_state); let dirty = scene_crdt_state.take_dirty(); - op_state.put(mutex_scene_crdt_state); - op_state.put(scene_id); - - let sender = op_state.borrow_mut::>(); - sender - .send(SceneResponse::Ok(scene_id, dirty, logs, elapsed_time)) - .expect("error sending scene response!!") -} -#[op(v8)] -async fn op_crdt_recv_from_renderer(op_state: Rc>) -> Vec> { - let mut receiver = op_state - .borrow_mut() - .take::>(); - let response = receiver.recv().await; + drop(scene_crdt_state); + drop(cloned_scene_crdt); - let mut op_state = op_state.borrow_mut(); - op_state.put(receiver); + if let Err(_err) = + state + .thread_sender_to_main + .send(SceneResponse::Ok(state.scene_id, dirty, logs, 0.1)) + { + // TODO: handle fail to send to renderer + } +} - let mutex_scene_crdt_state = op_state.take::>>(); +pub fn op_crdt_recv_from_renderer( + scope: &mut v8::HandleScope, + _args: v8::FunctionCallbackArguments, + mut ret: v8::ReturnValue, +) { + let state = JsRuntime::state_from(scope); + let mut state = state.borrow_mut(); + let receiver = &mut state.thread_receive_from_main; + let response = receiver.blocking_recv(); + + let mutex_scene_crdt_state = &mut state.crdt; let cloned_scene_crdt = mutex_scene_crdt_state.clone(); let scene_crdt_state = cloned_scene_crdt.lock().unwrap(); @@ -82,7 +79,7 @@ async fn op_crdt_recv_from_renderer(op_state: Rc>) -> Vec>) -> Vec>) -> Vec { // channel has been closed, shutdown gracefully - godot_print!("{}: shutting down", std::thread::current().name().unwrap()); - op_state.put(ShuttingDown); + println!("{}: shutting down", std::thread::current().name().unwrap()); + + // TODO: handle recv from renderer + Default::default() } }; + drop(scene_crdt_state); + drop(cloned_scene_crdt); + + let arr_bytes = if state.main_crdt.is_some() { + let main_crdt_data = state.main_crdt.take().unwrap(); + vec![main_crdt_data, data] + } else { + vec![data] + }; + // TODO: main.crdt - op_state.put(mutex_scene_crdt_state); - let mut ret = Vec::>::with_capacity(1); - if let Some(main_crdt) = op_state.try_take::() { - ret.push(main_crdt.0); + let arr = v8::Array::new(scope, arr_bytes.len() as i32); + for (index, arr_u8) in arr_bytes.into_iter().enumerate() { + let uint8_array = slice_to_uint8array(scope, &arr_u8); + arr.set_index(scope, index as u32, uint8_array.into()); } - ret.push(data); - ret + + ret.set(arr.into()); +} + +pub fn slice_to_uint8array<'a>( + scope: &mut v8::HandleScope<'a>, + buf: &[u8], +) -> v8::Local<'a, v8::Uint8Array> { + let buffer = if buf.is_empty() { + v8::ArrayBuffer::new(scope, 0) + } else { + let store: v8::UniqueRef<_> = v8::ArrayBuffer::new_backing_store(scope, buf.len()); + // SAFETY: raw memory copy into the v8 ArrayBuffer allocated above + unsafe { + std::ptr::copy_nonoverlapping( + buf.as_ptr(), + store.data().unwrap().as_ptr() as *mut u8, + buf.len(), + ) + } + v8::ArrayBuffer::with_backing_store(scope, &store.make_shared()) + }; + v8::Uint8Array::new(scope, buffer, 0, buf.len()).expect("Failed to create UintArray8") } diff --git a/rust/decentraland-godot-lib/src/dcl/js/js_modules/EngineApi.js b/rust/decentraland-godot-lib/src/dcl/js/js_modules/EngineApi.js index 36c1158f..16b3429c 100644 --- a/rust/decentraland-godot-lib/src/dcl/js/js_modules/EngineApi.js +++ b/rust/decentraland-godot-lib/src/dcl/js/js_modules/EngineApi.js @@ -1,9 +1,27 @@ +// module.exports.crdtSendToRenderer = async function (messages) { +// Deno.core.ops.op_crdt_send_to_renderer(messages.data); +// const data = (await Deno.core.ops.op_crdt_recv_from_renderer()).map((item) => new Uint8Array(item)); +// return { +// data: data +// }; +// } + +// module.exports.sendBatch = async function () { +// return { events: [] } +// } + +// module.exports.crdtGetState = async function () { +// const data = (await Deno.core.ops.op_crdt_recv_from_renderer()).map((item) => new Uint8Array(item)) +// return { +// data: data +// }; +// } + +// TODO: make really async + module.exports.crdtSendToRenderer = async function (messages) { - Deno.core.ops.op_crdt_send_to_renderer(messages.data); - const data = (await Deno.core.ops.op_crdt_recv_from_renderer()).map((item) => new Uint8Array(item)); - return { - data: data - }; + op_crdt_send_to_renderer(messages.data); + return { data: op_crdt_recv_from_renderer() }; } module.exports.sendBatch = async function () { @@ -11,9 +29,5 @@ module.exports.sendBatch = async function () { } module.exports.crdtGetState = async function () { - const data = (await Deno.core.ops.op_crdt_recv_from_renderer()).map((item) => new Uint8Array(item)) - return { - data: data - }; + return { data: op_crdt_recv_from_renderer() }; } - diff --git a/rust/decentraland-godot-lib/src/dcl/js/js_modules/init.js b/rust/decentraland-godot-lib/src/dcl/js/js_modules/init.js deleted file mode 100644 index 6b0edcca..00000000 --- a/rust/decentraland-godot-lib/src/dcl/js/js_modules/init.js +++ /dev/null @@ -1,57 +0,0 @@ -// this code is executed as the runtime is created, all scopes get these definitions - -// required for async ops (engine.sendMessage is declared as async) -Deno.core.initializeAsyncOps(); - -// minimal console -// const console = { -// // log: function(text) { Deno.core.print("LOG :" + text + "\n") }, -// log: function (text) { }, -// error: function (text) { Deno.core.print("ERROR: " + text + "\n") }, -// } - -// minimal console -const console = { - log: function (text) { Deno.core.ops.op_log("" + text) }, - error: function (text) { Deno.core.ops.op_error("" + text) }, -} - -// load a cjs/node-style module -// TODO: consider using deno.land/std/node's `createRequire` directly. -// Deno's node polyfill doesn't work without the full deno runtime, and i -// note that decentraland examples use ESM syntax which deno_core does support, -// so i haven't gone very deep into making full support work. -// this is a very simplified version of the deno_std/node `createRequire` implementation. -function require(moduleName) { - // dynamically load the module source - var source = Deno.core.ops.op_require(moduleName); - - // create a wrapper for the imported script - source = source.replace(/^#!.*?\n/, ""); - const head = "(function (exports, require, module, __filename, __dirname) { (function (exports, require, module, __filename, __dirname) {"; - const foot = "\n}).call(this, exports, require, module, __filename, __dirname); })"; - source = `${head}${source}${foot}`; - const [wrapped, err] = Deno.core.evalContext(source, moduleName); - if (err) { - throw err.thrown; - } - - // create minimal context for the execution - var module = { - exports: {} - }; - // call the script - // note: `require` function base path would need to be updated for proper support - wrapped.call( - module.exports, // this - module.exports, // exports - require, // require - module, // module - moduleName.substring(1), // __filename - moduleName.substring(0, 1) // __dirname - ); - - return module.exports; -} - -globalThis.setImmediate = (fn) => Promise.resolve().then(fn) \ No newline at end of file diff --git a/rust/decentraland-godot-lib/src/dcl/js/js_modules/main.js b/rust/decentraland-godot-lib/src/dcl/js/js_modules/main.js new file mode 100644 index 00000000..aa7d8b3c --- /dev/null +++ b/rust/decentraland-godot-lib/src/dcl/js/js_modules/main.js @@ -0,0 +1,42 @@ +function require(moduleName) { + var source = globalThis.js_require(moduleName); + if (!source) { + throw new Error("Module not found: " + moduleName) + } + + // create a wrapper for the imported script + source = source.replace(/^#!.*?\n/, ""); + const head = "(function (exports, require, module, __filename, __dirname) { (function (exports, require, module, __filename, __dirname) {"; + const foot = "\n}).call(this, exports, require, module, __filename, __dirname); })"; + source = `${head}${source}${foot}`; + const wrapped = eval(source); + + // create minimal context for the execution + var module = { + exports: {} + }; + // call the script + // note: `require` function base path would need to be updated for proper support + wrapped.call( + module.exports, // this + module.exports, // exports + require, // require + module, // module + moduleName.substring(1), // __filename + moduleName.substring(0, 1) // __dirname + ); + + return module.exports; +} + +globalThis.require = require +globalThis.setImmediate = (fn) => Promise.resolve().then(fn) +globalThis.console = { + log: function (text) { console_log("" + text) }, + error: function (text) { console_error("" + text) }, +} + + +const scene = require('~scene.js'); +globalThis.onStart = scene.onStart; +globalThis.onUpdate = scene.onUpdate; \ No newline at end of file diff --git a/rust/decentraland-godot-lib/src/dcl/js/js_runtime.rs b/rust/decentraland-godot-lib/src/dcl/js/js_runtime.rs new file mode 100644 index 00000000..acf97853 --- /dev/null +++ b/rust/decentraland-godot-lib/src/dcl/js/js_runtime.rs @@ -0,0 +1,267 @@ +use super::engine::{op_crdt_recv_from_renderer, op_crdt_send_to_renderer}; +use crate::dcl::{RendererResponse, SceneId, SceneResponse, SharedSceneCrdtState}; +use std::{cell::RefCell, rc::Rc, time::Duration}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub enum SceneLogLevel { + Log = 1, + SceneError = 2, + SystemError = 3, +} + +#[derive(Clone, Debug)] +pub struct SceneLogMessage { + pub timestamp: f64, // scene local time + pub level: SceneLogLevel, + pub message: String, +} + +pub struct JsRuntime { + pub isolate: v8::OwnedIsolate, + pub context: Rc>, +} + +pub struct JsRuntimeState { + pub scene_id: SceneId, + pub counter: u32, + pub start_time: std::time::SystemTime, + pub elapsed: Duration, + pub thread_sender_to_main: std::sync::mpsc::SyncSender, + pub thread_receive_from_main: tokio::sync::mpsc::Receiver, + pub crdt: SharedSceneCrdtState, + pub main_crdt: Option>, + pub main_code: String, + pub logs: Vec, +} + +pub fn init_v8() { + let platform = v8::new_default_platform(0, false).make_shared(); + v8::V8::initialize_platform(platform); + v8::V8::initialize(); +} + +fn js_require( + scope: &mut v8::HandleScope, + args: v8::FunctionCallbackArguments, + mut ret: v8::ReturnValue, +) { + if args.length() != 1 { + return; + } + + let module_name = args.get(0); + if !module_name.is_string() { + return; + } + + let module_name = module_name.to_rust_string_lossy(scope); + + // This module can be required only once + if module_name.as_str() == "~scene.js" { + let state = JsRuntime::state_from(scope); + let main_code = &mut state.borrow_mut().main_code; + let code = std::mem::take(main_code); + + let module = v8::String::new(scope, &code).unwrap(); + ret.set(module.into()); + } + + let module = match module_name.as_str() { + // core module load + "~system/CommunicationsController" => { + Some(include_str!("js_modules/CommunicationsController.js").to_owned()) + } + "~system/EngineApi" => Some(include_str!("js_modules/EngineApi.js").to_owned()), + "~system/EnvironmentApi" => Some(include_str!("js_modules/EnvironmentApi.js").to_owned()), + "~system/EthereumController" => { + Some(include_str!("js_modules/EthereumController.js").to_owned()) + } + "~system/Players" => Some(include_str!("js_modules/Players.js").to_owned()), + "~system/PortableExperiences" => { + Some(include_str!("js_modules/PortableExperiences.js").to_owned()) + } + "~system/RestrictedActions" => { + Some(include_str!("js_modules/RestrictedActions.js").to_owned()) + } + "~system/Runtime" => Some(include_str!("js_modules/Runtime.js").to_owned()), + "~system/Scene" => Some(include_str!("js_modules/Scene.js").to_owned()), + "~system/SignedFetch" => Some(include_str!("js_modules/SignedFetch.js").to_owned()), + "~system/Testing" => Some(include_str!("js_modules/Testing.js").to_owned()), + "~system/UserActionModule" => { + Some(include_str!("js_modules/UserActionModule.js").to_owned()) + } + "~system/UserIdentity" => Some(include_str!("js_modules/UserIdentity.js").to_owned()), + _ => None, + }; + + if let Some(module) = module { + let module = v8::String::new(scope, &module).unwrap(); + ret.set(module.into()); + } +} + +fn js_console_log( + scope: &mut v8::HandleScope, + args: v8::FunctionCallbackArguments, + mut _ret: v8::ReturnValue, +) { + let state = JsRuntime::state_from(scope); + + if args.length() != 1 { + return; + } + + let message = args.get(0).to_rust_string_lossy(scope); + let time = state.borrow().elapsed.as_micros(); + state.borrow_mut().logs.push(SceneLogMessage { + timestamp: time as f64, + level: SceneLogLevel::Log, + message, + }); +} + +fn js_console_error( + scope: &mut v8::HandleScope, + args: v8::FunctionCallbackArguments, + mut _ret: v8::ReturnValue, +) { + let state = JsRuntime::state_from(scope); + + if args.length() != 1 { + return; + } + + let message = args.get(0).to_rust_string_lossy(scope); + let time = state.borrow().elapsed.as_micros(); + state.borrow_mut().logs.push(SceneLogMessage { + timestamp: time as f64, + level: SceneLogLevel::SceneError, + message, + }); +} + +impl JsRuntime { + pub(crate) fn state_from(isolate: &v8::Isolate) -> Rc> { + let state_ptr = isolate.get_data(0); + let state_rc = + // SAFETY: We are sure that it's a valid pointer for whole lifetime of + // the runtime. + unsafe { Rc::from_raw(state_ptr as *const RefCell) }; + let state = state_rc.clone(); + std::mem::forget(state_rc); + state + } + + pub fn new(state: JsRuntimeState) -> Result { + // Create the V8 sandbox + let mut isolate = v8::Isolate::new(Default::default()); + let state_rc = Rc::new(RefCell::new(state)); + + isolate.set_data(0, Rc::into_raw(state_rc) as *mut std::ffi::c_void); + + let context = { + // Create global variables and functions + let mut scope = v8::HandleScope::new(&mut isolate); + let global = v8::ObjectTemplate::new(&mut scope); + + global.set( + v8::String::new(&mut scope, "js_require").unwrap().into(), + v8::FunctionTemplate::new(&mut scope, js_require).into(), + ); + + global.set( + v8::String::new(&mut scope, "console_log").unwrap().into(), + v8::FunctionTemplate::new(&mut scope, js_console_log).into(), + ); + + global.set( + v8::String::new(&mut scope, "console_error").unwrap().into(), + v8::FunctionTemplate::new(&mut scope, js_console_error).into(), + ); + + global.set( + v8::String::new(&mut scope, "op_crdt_send_to_renderer") + .unwrap() + .into(), + v8::FunctionTemplate::new(&mut scope, op_crdt_send_to_renderer).into(), + ); + + global.set( + v8::String::new(&mut scope, "op_crdt_recv_from_renderer") + .unwrap() + .into(), + v8::FunctionTemplate::new(&mut scope, op_crdt_recv_from_renderer).into(), + ); + + let context = v8::Context::new_from_template(&mut scope, global); + + // Wrap the context in a global object so its lifetime is unbound + v8::Global::new(&mut scope, context) + }; + + let context = JsRuntime { + isolate, + context: context.into(), + }; + + Ok(context) + } + + pub fn run_str(&mut self, filename: &str, src: &str) -> Result { + self.do_scoped(filename, |scope| { + // Build and run the script + let src = v8::String::new(scope, src).ok_or("could not build v8 string")?; + let value = v8::Script::compile(scope, src, None) + .ok_or("failed to compile script")? + .run(scope) + .ok_or("missing return value")?; + let value = value.to_rust_string_lossy(scope); + Ok(value) + }) + } + + pub fn run(&mut self, filename: &str, src: &str) -> Result, String> { + self.do_scoped(filename, |scope| { + // Build and run the script + let src = v8::String::new(scope, src).ok_or("could not build v8 string")?; + let value = v8::Script::compile(scope, src, None) + .ok_or("failed to compile script")? + .run(scope) + .ok_or("missing return value")?; + Ok(value) + }) + } + + pub fn do_scoped<'scope, T>( + &'scope mut self, + filename: &str, + mut callback: impl FnMut(&mut v8::HandleScope<'scope>) -> Result, + ) -> Result { + // "Raw" script scope + let mut scope = v8::HandleScope::new(&mut self.isolate); + let context = v8::Local::new(&mut scope, &*self.context.clone()); + + // Script scope with globals + error handling + let mut scope = v8::ContextScope::new(&mut scope, context); + let mut scope = v8::TryCatch::new(&mut scope); + + // Run user callback using the scope + let script_result = callback(&mut scope); + + if scope.has_caught() { + let message = scope.message().ok_or("could not extract error message")?; + let msg = format!( + "{} ({filename}:{})", + message.get(&mut scope).to_rust_string_lossy(&mut scope), + message.get_line_number(&mut scope).unwrap_or(0), + ); + return Err(msg); + } + + script_result + } + + pub fn handle_scope<'s>(&self, isolate: &'s mut v8::Isolate) -> v8::HandleScope<'s> { + v8::HandleScope::with_context(isolate, &*self.context.clone()) + } +} diff --git a/rust/decentraland-godot-lib/src/dcl/js/mod.rs b/rust/decentraland-godot-lib/src/dcl/js/mod.rs index 8322f5df..87880209 100644 --- a/rust/decentraland-godot-lib/src/dcl/js/mod.rs +++ b/rust/decentraland-godot-lib/src/dcl/js/mod.rs @@ -1,39 +1,15 @@ -use std::{cell::RefCell, rc::Rc, time::Duration}; - -use deno_core::{ - error::{generic_error, AnyError}, - include_js_files, op, v8, Extension, JsRuntime, OpState, RuntimeOptions, -}; -use godot::prelude::godot_print; +pub mod engine; +pub mod js_runtime; +use self::js_runtime::{JsRuntime, JsRuntimeState}; use super::{ crdt::message::process_many_messages, serialization::reader::DclReader, SceneDefinition, SharedSceneCrdtState, }; -use super::{RendererResponse, SceneId, SceneResponse, VM_HANDLES}; - -struct SceneJsFileContent(pub String); -struct SceneMainCrdtFileContent(pub Vec); - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub enum SceneLogLevel { - Log = 1, - SceneError = 2, - SystemError = 3, -} - -#[derive(Clone, Debug)] -pub struct SceneLogMessage { - pub timestamp: f64, // scene local time - pub level: SceneLogLevel, - pub message: String, -} -pub struct SceneElapsedTime(pub f32); - -pub mod engine; - -// marker to indicate shutdown has been triggered -pub struct ShuttingDown; +use super::{RendererResponse, SceneId, SceneResponse}; +use godot::prelude::godot_print; +use std::time::Duration; +use v8::Promise; // main scene processing thread - constructs an isolate and runs the scene pub(crate) fn scene_thread( @@ -43,48 +19,6 @@ pub(crate) fn scene_thread( thread_receive_from_main: tokio::sync::mpsc::Receiver, scene_crdt: SharedSceneCrdtState, ) { - let ext = Extension::builder("decentraland") - // add require operation - .ops(vec![op_require::decl(), op_log::decl(), op_error::decl()]) - // add plugin registrations - .ops(engine::ops()) - // set startup JS script - .js(include_js_files!( - prefix "dcl_core_init", - "js_modules/init.js", - )) - // remove core deno ops that are not required - .middleware(|op| { - const ALLOW: [&str; 7] = [ - "op_eval_context", - "op_require", - "op_crdt_send_to_renderer", - "op_crdt_recv_from_renderer", - "op_print", - "op_log", - "op_error", - ]; - if ALLOW.contains(&op.name) { - op - } else { - op.disable() - } - }) - .build(); - - // create runtime - let mut runtime = JsRuntime::new(RuntimeOptions { - v8_platform: v8::Platform::new(1, false).make_shared().into(), - extensions_with_js: vec![ext], - ..Default::default() - }); - - // store handle - let vm_handle = runtime.v8_isolate().thread_safe_handle(); - let mut guard = VM_HANDLES.lock().unwrap(); - guard.insert(scene_id, vm_handle); - drop(guard); - let mut scene_main_crdt = None; let main_crdt_file_path = scene_definition.main_crdt_path; if !main_crdt_file_path.is_empty() { @@ -106,33 +40,10 @@ pub(crate) fn scene_thread( .send(SceneResponse::Ok(scene_id, dirty, Vec::new(), 0.0)) .expect("error sending scene response!!"); - scene_main_crdt = Some(SceneMainCrdtFileContent(buf)); + scene_main_crdt = Some(buf); } } - let state = runtime.op_state(); - - // store log output and initial elapsed of zero - state.borrow_mut().put(Vec::::default()); - state.borrow_mut().put(SceneElapsedTime(0.0)); - - // store scene detail in the runtime state - state.borrow_mut().put(scene_crdt); - - // store channels - state.borrow_mut().put(thread_sender_to_main); - state.borrow_mut().put(thread_receive_from_main); - state.borrow_mut().put(scene_id); - - if let Some(scene_main_crdt) = scene_main_crdt { - state.borrow_mut().put(scene_main_crdt); - } - - // store kill handle - state - .borrow_mut() - .put(runtime.v8_isolate().thread_safe_handle()); - let scene_file_path = scene_definition.path; let file = godot::engine::FileAccess::open( godot::prelude::GodotString::from(scene_file_path.clone()), @@ -141,196 +52,299 @@ pub(crate) fn scene_thread( if file.is_none() { let err_string = format!("Scene `{scene_file_path}` not found - file is none"); - if let Err(send_err) = state - .borrow_mut() - .take::>() - .send(SceneResponse::Error(scene_id, format!("{err_string:?}"))) + if let Err(send_err) = + thread_sender_to_main.send(SceneResponse::Error(scene_id, format!("{err_string:?}"))) { godot_print!("error sending error: {send_err:?}. original error {err_string:?}") } return; } - let scene_code = SceneJsFileContent(file.unwrap().get_as_text().to_string()); - state.borrow_mut().put(scene_code); - - let script = runtime.execute_script("", "require (\"~scene.js\")"); - let script = match script { - Err(execute_script_error) => { - if let Err(send_err) = state - .borrow_mut() - .take::>() - .send(SceneResponse::Error( - scene_id, - format!("{execute_script_error:?}"), - )) - { - godot_print!( - "error sending error: {send_err:?}. original error {execute_script_error:?}" - ) - } - return; - } - Ok(script) => script, + let js_context_state = JsRuntimeState { + scene_id, + counter: 0, + start_time: std::time::SystemTime::now(), + elapsed: Duration::default(), + thread_sender_to_main: thread_sender_to_main.clone(), + thread_receive_from_main, + crdt: scene_crdt, + main_crdt: scene_main_crdt, + logs: Vec::new(), + main_code: file.unwrap().get_as_text().to_string(), }; - // run startup function - let result: Result<(), deno_core::anyhow::Error> = - run_script(&mut runtime, &script, "onStart", (), |_| Vec::new()); - if let Err(start_script_error) = result { - // ignore failure to send failure - if let Err(send_err) = state - .borrow_mut() - .take::>() - .send(SceneResponse::Error( - scene_id, - format!("{start_script_error:?}"), - )) + // Eval Init Code + let js_context = JsRuntime::new(js_context_state); + if js_context.is_err() { + let err_string = format!("Scene {:?} failed", scene_definition.title); + if let Err(send_err) = + thread_sender_to_main.send(SceneResponse::Error(scene_id, format!("{err_string:?}"))) { - godot_print!("error sending error: {send_err:?}. original error {start_script_error:?}") + godot_print!("error sending error: {send_err:?}. original error {err_string:?}") } - return; } - let start_time = std::time::SystemTime::now(); - let mut elapsed = Duration::default(); + let mut js_context = js_context.unwrap(); - loop { - let dt = std::time::SystemTime::now() - .duration_since(start_time) - .unwrap_or(elapsed) - - elapsed; - elapsed += dt; + // Setup the global context + match js_context.run("dcl_init", include_str!("js_modules/main.js")) { + Ok(_) => { + println!("init script run"); + } + Err(err) => { + println!("error init script {:?}", err); + return; + } + }; - state - .borrow_mut() - .put(SceneElapsedTime(elapsed.as_secs_f32())); + match js_context.run("dcl_init", "globalThis.onStart()") { + Ok(value) => { + println!("onStart script run"); + if value.is_promise() { + let _promise = v8::Local::::try_from(value).unwrap(); + // println!("is a promise {:?}", promise.state()); + } + let _pending_task = js_context.isolate.has_pending_background_tasks(); + // println!("there is pending tasks? {:?}", pending_task); - // run the onUpdate function - let result = run_script(&mut runtime, &script, "onUpdate", (), |scope| { - vec![v8::Number::new(scope, dt.as_secs_f64()).into()] - }); + js_context.isolate.perform_microtask_checkpoint(); - if state.borrow().try_borrow::().is_some() { - godot_print!("exiting from the thread {:?}", scene_id); - return; + let _pending_task = js_context.isolate.has_pending_background_tasks(); + // println!("2) there is pending tasks? {:?}", pending_task); } - - if let Err(e) = result { - let _ = state - .borrow_mut() - .take::>() - .send(SceneResponse::Error(scene_id, format!("{e:?}"))); + Err(err) => { + println!("error init script {:?}", err); return; } - } -} + }; -// helper to setup, acquire, run and return results from a script function -fn run_script( - runtime: &mut JsRuntime, - script: &v8::Global, - fn_name: &str, - messages_in: (), - arg_fn: impl for<'a> Fn(&mut v8::HandleScope<'a>) -> Vec>, -) -> Result<(), AnyError> { - let op_state = runtime.op_state(); - op_state.borrow_mut().put(messages_in); - - let promise = { - let scope = &mut runtime.handle_scope(); - let script_this = v8::Local::new(scope, script.clone()); - // get module - let script = v8::Local::::try_from(script_this).unwrap(); - - // get function - let target_function = - v8::String::new_from_utf8(scope, fn_name.as_bytes(), v8::NewStringType::Internalized) - .unwrap(); - let Some(target_function) = script.get(scope, target_function.into()) else { - return Err(AnyError::msg(format!("{fn_name} is not defined"))); - }; - let Ok(target_function) = v8::Local::::try_from(target_function) else { - return Err(AnyError::msg(format!("{fn_name} is not a function"))); - }; + // let ctx = js_context.context.clone(); + // ctx. + let start_time = std::time::SystemTime::now(); + let mut elapsed = Duration::default(); - // get args - let args = arg_fn(scope); + loop { + let dt = std::time::SystemTime::now() + .duration_since(start_time) + .unwrap_or(elapsed) + - elapsed; + elapsed += dt; - // call - let res = target_function.call(scope, script_this, &args); - let Some(res) = res else { - return Err(AnyError::msg(format!("{fn_name} did not return a promise"))); + match js_context.run( + "dcl_init", + format!("globalThis.onUpdate({:?})", dt.as_secs_f32()).as_str(), + ) { + Ok(value) => { + // println!("onUpdate script run"); + if value.is_promise() { + let _promise = v8::Local::::try_from(value).unwrap(); + // println!("is a promise {:?}", promise.state()); + } + let _pending_task = js_context.isolate.has_pending_background_tasks(); + // println!("there is pending tasks? {:?}", pending_task); + + js_context.isolate.perform_microtask_checkpoint(); + + let _pending_task = js_context.isolate.has_pending_background_tasks(); + // println!("2) there is pending tasks? {:?}", pending_task); + } + Err(err) => { + println!("error init script {:?}", err); + return; + } }; - - drop(args); - v8::Global::new(scope, res) - }; - - let f = runtime.resolve_value(promise); - futures_lite::future::block_on(f).map(|_| ()) -} - -// synchronously returns a string containing JS code from the file system -#[op(v8)] -fn op_require( - state: Rc>, - module_spec: String, -) -> Result { - match module_spec.as_str() { - // user module load - "~scene.js" => Ok(state.borrow().borrow::().0.clone()), - // core module load - "~system/CommunicationsController" => { - Ok(include_str!("js_modules/CommunicationsController.js").to_owned()) - } - "~system/EngineApi" => Ok(include_str!("js_modules/EngineApi.js").to_owned()), - "~system/EnvironmentApi" => Ok(include_str!("js_modules/EnvironmentApi.js").to_owned()), - "~system/EthereumController" => { - Ok(include_str!("js_modules/EthereumController.js").to_owned()) - } - "~system/Players" => Ok(include_str!("js_modules/Players.js").to_owned()), - "~system/PortableExperiences" => { - Ok(include_str!("js_modules/PortableExperiences.js").to_owned()) - } - "~system/RestrictedActions" => { - Ok(include_str!("js_modules/RestrictedActions.js").to_owned()) - } - "~system/Runtime" => Ok(include_str!("js_modules/Runtime.js").to_owned()), - "~system/Scene" => Ok(include_str!("js_modules/Scene.js").to_owned()), - "~system/SignedFetch" => Ok(include_str!("js_modules/SignedFetch.js").to_owned()), - "~system/Testing" => Ok(include_str!("js_modules/Testing.js").to_owned()), - "~system/UserActionModule" => Ok(include_str!("js_modules/UserActionModule.js").to_owned()), - "~system/UserIdentity" => Ok(include_str!("js_modules/UserIdentity.js").to_owned()), - _ => Err(generic_error(format!( - "invalid module request `{module_spec}`" - ))), } -} -#[op(v8)] -fn op_log(state: Rc>, message: String) { - let time = state.borrow().borrow::().0; - state - .borrow_mut() - .borrow_mut::>() - .push(SceneLogMessage { - timestamp: time as f64, - level: SceneLogLevel::Log, - message, - }) -} + // println!("finishing thread"); + + // let scope = js_context.handle_scope(&mut js_context.isolate); + + // // Evaluate the scene code + // let script_export = match js_context.run("scene.js", "require('~scene.js')") { + // Ok(value) => v8::Local::::try_from(value).unwrap(), + // Err(err) => { + // println!("error scene script {:?}", err); + // return; + // } + // }; + + // let script_export = script_export.clone(); + + // js_context.run("asd", "asd"); + + // script_export; + + // js_context.do_scoped("initial", move |&mut scope| { + // script_export.get( + // &mut scope, + // v8::String::new(&mut scope, "onStart").unwrap().into(), + // ); + // Ok(()) + // }); + + // let init_context = v8::Context::new(&mut init_scope); + // let init_scope = &mut v8::ContextScope::new(&mut init_scope, context); + + // let init_code = include_str!("js_modules/init_v8.js"); + // let code = v8::String::new(scope, init_code).unwrap(); + // let script = v8::Script::compile(scope, code, None).unwrap(); + // let result = script.run(scope); + + // // Eval Scene Code + // let scene_code = SceneJsFileContent(file.unwrap().get_as_text().to_string()); + // let code = v8::String::new(scope, scene_code.0.as_str()).unwrap(); + // let script = v8::Script::compile(scope, code, None).unwrap(); + // let result = script.run(scope); + + // let script = runtime.execute_script("", "require (\"~scene.js\")"); + // let script = match script { + // Err(execute_script_error) => { + // if let Err(send_err) = thread_sender_to_main.send(SceneResponse::Error( + // scene_id, + // format!("{execute_script_error:?}"), + // )) { + // godot_print!( + // "error sending error: {send_err:?}. original error {execute_script_error:?}" + // ) + // } + // return; + // } + // Ok(script) => script, + // }; -#[op(v8)] -fn op_error(state: Rc>, message: String) { - let time = state.borrow().borrow::().0; - state - .borrow_mut() - .borrow_mut::>() - .push(SceneLogMessage { - timestamp: time as f64, - level: SceneLogLevel::SceneError, - message, - }) + // run startup function + // let result: Result<(), deno_core::anyhow::Error> = + // run_script(&mut runtime, &script, "onStart", (), |_| Vec::new()); + // if let Err(start_script_error) = result { + // // ignore failure to send failure + // if let Err(send_err) = state + // .borrow_mut() + // .take::>() + // .send(SceneResponse::Error( + // scene_id, + // format!("{start_script_error:?}"), + // )) + // { + // godot_print!("error sending error: {send_err:?}. original error {start_script_error:?}") + // } + + // return; + // } + + // let start_time = std::time::SystemTime::now(); + // let mut elapsed = Duration::default(); + + // loop { + // let dt = std::time::SystemTime::now() + // .duration_since(start_time) + // .unwrap_or(elapsed) + // - elapsed; + // elapsed += dt; + + // // js_context; + // // state + // // .borrow_mut() + // // .put(SceneElapsedTime(elapsed.as_secs_f32())); + + // // // run the onUpdate function + // // let result = run_script(&mut runtime, &script, "onUpdate", (), |scope| { + // // vec![v8::Number::new(scope, dt.as_secs_f64()).into()] + // // }); + + // // if state.borrow().try_borrow::().is_some() { + // // godot_print!("exiting from the thread {:?}", scene_id); + // // return; + // // } + + // // if let Err(e) = result { + // // let _ = state + // // .borrow_mut() + // // .take::>() + // // .send(SceneResponse::Error(scene_id, format!("{e:?}"))); + // // return; + // // } + // } } + +// // helper to setup, acquire, run and return results from a script function +// fn run_script( +// runtime: &mut JsRuntime, +// script: &v8::Global, +// fn_name: &str, +// messages_in: (), +// arg_fn: impl for<'a> Fn(&mut v8::HandleScope<'a>) -> Vec>, +// ) -> Result<(), AnyError> { +// let op_state = runtime.op_state(); +// op_state.borrow_mut().put(messages_in); + +// let promise = { +// let scope = &mut runtime.handle_scope(); +// let script_this = v8::Local::new(scope, script.clone()); +// // get module +// let script = v8::Local::::try_from(script_this).unwrap(); + +// // get function +// let target_function = +// v8::String::new_from_utf8(scope, fn_name.as_bytes(), v8::NewStringType::Internalized) +// .unwrap(); +// let Some(target_function) = script.get(scope, target_function.into()) else { +// return Err(AnyError::msg(format!("{fn_name} is not defined"))); +// }; +// let Ok(target_function) = v8::Local::::try_from(target_function) else { +// return Err(AnyError::msg(format!("{fn_name} is not a function"))); +// }; + +// // get args +// let args = arg_fn(scope); + +// // call +// let res = target_function.call(scope, script_this, &args); +// let Some(res) = res else { +// return Err(AnyError::msg(format!("{fn_name} did not return a promise"))); +// }; + +// drop(args); +// v8::Global::new(scope, res) +// }; + +// let f = runtime.resolve_value(promise); +// futures_lite::future::block_on(f).map(|_| ()) +// } + +// // synchronously returns a string containing JS code from the file system +// #[op(v8)] +// fn op_require( +// state: Rc>, +// module_spec: String, +// ) -> Result { +// match module_spec.as_str() { +// // user module load +// "~scene.js" => Ok(state.borrow().borrow::().0.clone()), +// // core module load +// "~system/CommunicationsController" => { +// Ok(include_str!("js_modules/CommunicationsController.js").to_owned()) +// } +// "~system/EngineApi" => Ok(include_str!("js_modules/EngineApi.js").to_owned()), +// "~system/EnvironmentApi" => Ok(include_str!("js_modules/EnvironmentApi.js").to_owned()), +// "~system/EthereumController" => { +// Ok(include_str!("js_modules/EthereumController.js").to_owned()) +// } +// "~system/Players" => Ok(include_str!("js_modules/Players.js").to_owned()), +// "~system/PortableExperiences" => { +// Ok(include_str!("js_modules/PortableExperiences.js").to_owned()) +// } +// "~system/RestrictedActions" => { +// Ok(include_str!("js_modules/RestrictedActions.js").to_owned()) +// } +// "~system/Runtime" => Ok(include_str!("js_modules/Runtime.js").to_owned()), +// "~system/Scene" => Ok(include_str!("js_modules/Scene.js").to_owned()), +// "~system/SignedFetch" => Ok(include_str!("js_modules/SignedFetch.js").to_owned()), +// "~system/Testing" => Ok(include_str!("js_modules/Testing.js").to_owned()), +// "~system/UserActionModule" => Ok(include_str!("js_modules/UserActionModule.js").to_owned()), +// "~system/UserIdentity" => Ok(include_str!("js_modules/UserIdentity.js").to_owned()), +// _ => Err(generic_error(format!( +// "invalid module request `{module_spec}`" +// ))), +// } +// } diff --git a/rust/decentraland-godot-lib/src/dcl/mod.rs b/rust/decentraland-godot-lib/src/dcl/mod.rs index 079ea9e4..fb4495fa 100644 --- a/rust/decentraland-godot-lib/src/dcl/mod.rs +++ b/rust/decentraland-godot-lib/src/dcl/mod.rs @@ -6,11 +6,9 @@ pub mod serialization; use self::{ components::{SceneComponentId, SceneEntityId}, crdt::SceneCrdtState, - js::{scene_thread, SceneLogMessage}, + js::{js_runtime::SceneLogMessage, scene_thread}, }; -use deno_core::v8::IsolateHandle; -use once_cell::sync::Lazy; use std::{ collections::{HashMap, HashSet}, sync::{Arc, Mutex}, @@ -62,9 +60,6 @@ pub enum SceneResponse { ), } -pub(crate) static VM_HANDLES: Lazy>> = - Lazy::new(Default::default); - pub type SharedSceneCrdtState = Arc>; pub struct DclScene { diff --git a/rust/decentraland-godot-lib/src/lib.rs b/rust/decentraland-godot-lib/src/lib.rs index 7e850b20..10d1eb50 100644 --- a/rust/decentraland-godot-lib/src/lib.rs +++ b/rust/decentraland-godot-lib/src/lib.rs @@ -6,12 +6,12 @@ use godot::prelude::*; +pub mod comms; pub mod dcl; pub mod http_request; pub mod realm; pub mod scene_runner; pub mod test_runner; - struct DecentralandGodotLibrary; #[gdextension] diff --git a/rust/decentraland-godot-lib/src/realm/scene_entity_coordinator.rs b/rust/decentraland-godot-lib/src/realm/scene_entity_coordinator.rs index 08ffdb0b..d40adabb 100644 --- a/rust/decentraland-godot-lib/src/realm/scene_entity_coordinator.rs +++ b/rust/decentraland-godot-lib/src/realm/scene_entity_coordinator.rs @@ -4,6 +4,7 @@ use std::{ }; use godot::{prelude::*, test::itest}; +use serde::{Deserialize, Serialize}; use crate::http_request::{ http_requester::HttpRequester, @@ -12,13 +13,13 @@ use crate::http_request::{ use super::parcel::*; -#[derive(serde::Serialize, serde::Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct TypedIpfsRef { file: String, hash: String, } -#[derive(serde::Serialize, serde::Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct EntityDefinitionJson { id: Option, base_url: Option, @@ -27,13 +28,13 @@ pub struct EntityDefinitionJson { metadata: Option, } -#[derive(serde::Serialize, serde::Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct SceneFieldJson { parcels: Vec, base: String, } -#[derive(serde::Serialize, serde::Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug)] pub struct SceneJsonMetadata { scene: SceneFieldJson, } @@ -563,43 +564,6 @@ mod tests { const TEST_POINTER_O_O_ID: &str = "b64-L3Vzci9zcmMvYXBwLzAuMC5ibGFuay1zY2VuZQ=="; use super::*; - #[allow(dead_code)] - pub fn mock_server() -> httpmock::MockServer { - let server = httpmock::MockServer::start(); - - server.mock(|when, then| { - when.method(httpmock::Method::POST) - .path("/content/entities/active") - .body_contains("\"0,0\""); - - then.status(200) - .header("content-type", "text/json") - .body(format!( - "[{{\"id\":\"{}\",\"pointers\":[\"0,0\"],\"content\":[]}}]", - TEST_POINTER_O_O_ID - )); - }); - - server.mock(|when, then| { - when.method(httpmock::Method::POST) - .path("/content/entities/active"); - - then.status(200) - .header("content-type", "text/json") - .body("[]"); - }); - - server.mock(|when, then| { - when.method(httpmock::Method::GET) - .path(format!("/contents/{}", TEST_URN_HASH)); - - then.status(200) - .header("content-type", "text/json") - .body("{\"pointers\":[],\"content\":[]}"); - }); - - server - } fn wait_update_or_timeout( scene_entity_coordinator: &mut SceneEntityCoordinator, diff --git a/rust/decentraland-godot-lib/src/scene_runner/components/billboard.rs b/rust/decentraland-godot-lib/src/scene_runner/components/billboard.rs index f916b8f6..7ddb243b 100644 --- a/rust/decentraland-godot-lib/src/scene_runner/components/billboard.rs +++ b/rust/decentraland-godot-lib/src/scene_runner/components/billboard.rs @@ -19,7 +19,7 @@ pub fn update_billboard( let origin = node.base.get_global_position(); let direction = node.base.get_global_position() - camera_position; - let basis = Basis::new_looking_at(direction, Vector3::UP); + let basis = Basis::new_looking_at(direction, Vector3::UP, false); node.base .set_global_transform(Transform3D { basis, origin }); diff --git a/rust/decentraland-godot-lib/src/scene_runner/content.rs b/rust/decentraland-godot-lib/src/scene_runner/content.rs deleted file mode 100644 index ca321eaf..00000000 --- a/rust/decentraland-godot-lib/src/scene_runner/content.rs +++ /dev/null @@ -1,64 +0,0 @@ -use godot::prelude::*; -use std::collections::HashMap; - -// Deriving GodotClass makes the class available to Godot -#[derive(GodotClass)] -#[class(base=Node)] -pub struct ContentMapping { - #[base] - base: Base, - base_url: GodotString, - content_mapping: HashMap, -} - -#[godot_api] -impl ContentMapping { - #[func] - fn set_content_mapping(&mut self, content_mapping: Dictionary) { - self.content_mapping.clear(); - self.content_mapping.reserve(content_mapping.len()); - - for (file, hash) in content_mapping.iter_shared() { - self.content_mapping - .insert(file.to_string().into(), hash.to_string().into()); - } - } - - #[func] - fn set_base_url(&mut self, base_url: GodotString) { - self.base_url = base_url; - } - - #[func] - fn get_base_url(&self) -> GodotString { - self.base_url.clone() - } - - #[func] - fn get_content_hash(&self, file: GodotString) -> GodotString { - self.content_mapping - .get(&file) - .unwrap_or(&GodotString::from("")) - .clone() - } - - #[func] - fn get_mappings(&self) -> Dictionary { - let mut dict = Dictionary::new(); - for (file, hash) in self.content_mapping.iter() { - dict.insert(file.clone(), hash.clone()); - } - dict - } -} - -#[godot_api] -impl NodeVirtual for ContentMapping { - fn init(base: Base) -> Self { - ContentMapping { - base, - base_url: GodotString::from(""), - content_mapping: HashMap::new(), - } - } -} diff --git a/rust/decentraland-godot-lib/src/scene_runner/mod.rs b/rust/decentraland-godot-lib/src/scene_runner/mod.rs index dda0330b..3613803a 100644 --- a/rust/decentraland-godot-lib/src/scene_runner/mod.rs +++ b/rust/decentraland-godot-lib/src/scene_runner/mod.rs @@ -1,5 +1,4 @@ mod components; -pub mod content; mod godot_dcl_scene; mod input; pub mod scene; diff --git a/rust/decentraland-godot-lib/src/scene_runner/scene.rs b/rust/decentraland-godot-lib/src/scene_runner/scene.rs index f1bf6636..59b5769c 100644 --- a/rust/decentraland-godot-lib/src/scene_runner/scene.rs +++ b/rust/decentraland-godot-lib/src/scene_runner/scene.rs @@ -1,17 +1,18 @@ use std::{collections::HashSet, time::Instant}; -use godot::prelude::Gd; +use godot::prelude::Dictionary; use crate::dcl::{ components::{ proto_components::sdk::components::{common::RaycastHit, PbPointerEventsResult}, SceneEntityId, }, - js::SceneLogMessage, - DclScene, DirtyEntities, DirtyGosComponents, DirtyLwwComponents, SceneDefinition, SceneId, + js::js_runtime::SceneLogMessage, + DclScene, DirtyEntities, DirtyGosComponents, DirtyLwwComponents, RendererResponse, + SceneDefinition, SceneId, }; -use super::{content::ContentMapping, godot_dcl_scene::GodotDclScene}; +use super::godot_dcl_scene::GodotDclScene; pub struct Dirty { pub waiting_process: bool, @@ -19,6 +20,7 @@ pub struct Dirty { pub lww_components: DirtyLwwComponents, pub gos_components: DirtyGosComponents, pub logs: Vec, + pub renderer_response: Option, } pub enum SceneState { @@ -37,13 +39,14 @@ pub struct Scene { pub waiting_for_updates: bool, pub state: SceneState, - pub content_mapping: godot::prelude::Gd, + pub content_mapping: Dictionary, pub gltf_loading: HashSet, pub pointer_events_result: Vec<(SceneEntityId, PbPointerEventsResult)>, pub continuos_raycast: HashSet, pub current_dirty: Dirty, + pub enqueued_dirty: Vec, pub distance: f32, pub start_time: Instant, @@ -94,7 +97,7 @@ impl Scene { scene_id: SceneId, scene_definition: SceneDefinition, dcl_scene: DclScene, - content_mapping: godot::prelude::Gd, + content_mapping: Dictionary, ) -> Self { let godot_dcl_scene = GodotDclScene::new(&scene_definition, &scene_id); @@ -113,7 +116,9 @@ impl Scene { lww_components: DirtyLwwComponents::default(), gos_components: DirtyGosComponents::default(), logs: Vec::new(), + renderer_response: None, }, + enqueued_dirty: Vec::new(), distance: 0.0, next_tick_us: 0, last_tick_us: 0, @@ -138,7 +143,7 @@ impl Scene { let scene_definition = SceneDefinition::default(); let scene_id = Scene::new_id(); let dcl_scene = DclScene::spawn_new_test_scene(scene_id); - let content_mapping = Gd::::new_default(); + let content_mapping = Dictionary::default(); let godot_dcl_scene = GodotDclScene::new(&scene_definition, &scene_id); Self { @@ -148,7 +153,7 @@ impl Scene { dcl_scene, waiting_for_updates: false, state: SceneState::Alive, - + enqueued_dirty: Vec::new(), content_mapping, current_dirty: Dirty { waiting_process: true, @@ -156,6 +161,7 @@ impl Scene { lww_components: DirtyLwwComponents::default(), gos_components: DirtyGosComponents::default(), logs: Vec::new(), + renderer_response: None, }, distance: 0.0, next_tick_us: 0, diff --git a/rust/decentraland-godot-lib/src/scene_runner/scene_manager.rs b/rust/decentraland-godot-lib/src/scene_runner/scene_manager.rs index f756b32d..2e96737e 100644 --- a/rust/decentraland-godot-lib/src/scene_runner/scene_manager.rs +++ b/rust/decentraland-godot-lib/src/scene_runner/scene_manager.rs @@ -1,15 +1,10 @@ -use crate::{ - dcl::{ - components::{ - proto_components::sdk::components::common::{ - InputAction, PointerEventType, RaycastHit, - }, - SceneEntityId, - }, - js::SceneLogLevel, - DclScene, RendererResponse, SceneDefinition, SceneId, SceneResponse, +use crate::dcl::{ + components::{ + proto_components::sdk::components::common::{InputAction, PointerEventType, RaycastHit}, + SceneEntityId, }, - scene_runner::content::ContentMapping, + js::js_runtime::SceneLogLevel, + DclScene, RendererResponse, SceneDefinition, SceneId, SceneResponse, }; use godot::{ engine::{CharacterBody3D, PhysicsRayQueryParameters3D}, @@ -62,11 +57,7 @@ pub struct SceneManager { impl SceneManager { // Testing a comment for the API #[func] - fn start_scene( - &mut self, - scene_definition: Dictionary, - content_mapping: Gd, - ) -> u32 { + fn start_scene(&mut self, scene_definition: Dictionary, content_mapping: Dictionary) -> u32 { let scene_definition = match SceneDefinition::from_dict(scene_definition) { Ok(scene_definition) => scene_definition, Err(e) => { @@ -120,11 +111,11 @@ impl SceneManager { } #[func] - fn get_scene_content_mapping(&self, scene_id: i32) -> Gd { + fn get_scene_content_mapping(&self, scene_id: i32) -> Dictionary { if let Some(scene) = self.scenes.get(&SceneId(scene_id as u32)) { return scene.content_mapping.share(); } - Gd::new_default() + Dictionary::default() } #[func] @@ -232,45 +223,87 @@ impl SceneManager { } if let SceneState::Alive = scene.state { - let crdt = scene.dcl_scene.scene_crdt.clone(); - let Ok(mut crdt_state) = crdt.try_lock() else {continue;}; - - super::update_scene::update_scene( - delta, - scene, - &mut crdt_state, - &camera_global_transform, - &player_global_transform, - frames_count, - ); - - // enable logs - for log in &scene.current_dirty.logs { - let mut arguments = VariantArray::new(); - arguments.push((scene_id.0 as i32).to_variant()); - arguments.push((log.level as i32).to_variant()); - arguments.push((log.timestamp as f32).to_variant()); - arguments.push(GodotString::from(&log.message).to_variant()); - self.console.callv(arguments); - } + if scene.current_dirty.renderer_response.is_some() { + if scene.dcl_scene.main_sender_to_thread.capacity() > 0 { + let response = scene.current_dirty.renderer_response.take().unwrap(); + if let Err(_err) = scene + .dcl_scene + .main_sender_to_thread + .blocking_send(response) + { + // TODO: handle fail sending to thread + } - scene.current_dirty.waiting_process = false; - let dirty = crdt_state.take_dirty(); - drop(crdt_state); + scene.current_dirty = scene.enqueued_dirty.pop().unwrap_or(Dirty { + waiting_process: false, + entities: Default::default(), + lww_components: Default::default(), + gos_components: Default::default(), + logs: Vec::new(), + renderer_response: None, + }); + + current_time_us = + (std::time::Instant::now() - self.begin_time).as_micros() as i64; + scene.last_tick_us = current_time_us; + if current_time_us > end_time_us { + break; + } + } + } else { + let crdt = scene.dcl_scene.scene_crdt.clone(); + let Ok(mut crdt_state) = crdt.try_lock() else {continue;}; + + super::update_scene::update_scene( + delta, + scene, + &mut crdt_state, + &camera_global_transform, + &player_global_transform, + frames_count, + ); + + // enable logs + for log in &scene.current_dirty.logs { + let mut arguments = VariantArray::new(); + arguments.push((scene_id.0 as i32).to_variant()); + arguments.push((log.level as i32).to_variant()); + arguments.push((log.timestamp as f32).to_variant()); + arguments.push(GodotString::from(&log.message).to_variant()); + self.console.callv(arguments); + } - if let Err(_e) = scene - .dcl_scene - .main_sender_to_thread - .blocking_send(RendererResponse::Ok(dirty)) - { - // TODO: clean up this scene? - // godot_print!("failed to send updates to scene: {e:?}"); - } + let dirty = crdt_state.take_dirty(); + drop(crdt_state); - current_time_us = (std::time::Instant::now() - self.begin_time).as_micros() as i64; - scene.last_tick_us = current_time_us; - if current_time_us > end_time_us { - break; + scene.current_dirty.renderer_response = Some(RendererResponse::Ok(dirty)); + + if scene.dcl_scene.main_sender_to_thread.capacity() > 0 { + let response = scene.current_dirty.renderer_response.take().unwrap(); + if let Err(_err) = scene + .dcl_scene + .main_sender_to_thread + .blocking_send(response) + { + // TODO: handle fail sending to thread + } + + scene.current_dirty = scene.enqueued_dirty.pop().unwrap_or(Dirty { + waiting_process: false, + entities: Default::default(), + lww_components: Default::default(), + gos_components: Default::default(), + logs: Vec::new(), + renderer_response: None, + }); + + current_time_us = + (std::time::Instant::now() - self.begin_time).as_micros() as i64; + scene.last_tick_us = current_time_us; + if current_time_us > end_time_us { + break; + } + } } } } @@ -350,9 +383,17 @@ impl SceneManager { lww_components: dirty_lww_components, gos_components: dirty_gos_components, logs, + renderer_response: None, }; } else { - godot_print!("scene {scene_id:?} is already dirty, skipping"); + scene.enqueued_dirty.push(Dirty { + waiting_process: true, + entities: dirty_entities, + lww_components: dirty_lww_components, + gos_components: dirty_gos_components, + logs, + renderer_response: None, + }); } } } @@ -441,6 +482,9 @@ impl NodeVirtual for SceneManager { let (thread_sender_to_main, main_receiver_from_thread) = std::sync::mpsc::sync_channel(1000); + // TODO: should this be initialized somewhere else? + crate::dcl::js::js_runtime::init_v8(); + SceneManager { base, diff --git a/rust/xtask/Cargo.toml b/rust/xtask/Cargo.toml index 71ff05b1..a3c907fd 100644 --- a/rust/xtask/Cargo.toml +++ b/rust/xtask/Cargo.toml @@ -13,6 +13,7 @@ serde = "1.0.152" flate2 = "1.0.*" tar = "0.4.*" zip = "0.5.*" -reqwest = { version = "0.11.18", features = ["blocking", "json"] } +reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls", "blocking"] } serde_json = { version = "1.0.92", features = ["raw_value"] } -glob = "*" \ No newline at end of file +glob = "*" +tokio = { version = "1.26.0", features = ["sync", "rt-multi-thread", "net"] } \ No newline at end of file diff --git a/rust/xtask/src/download_file.rs b/rust/xtask/src/download_file.rs new file mode 100644 index 00000000..5f2b7a3b --- /dev/null +++ b/rust/xtask/src/download_file.rs @@ -0,0 +1,86 @@ +use reqwest::Url; +use std::fs::File; +use std::io::Write; +use std::path::PathBuf; + +enum DownloadEvent { + Progress(u64), + Result(Result<(), anyhow::Error>), +} + +async fn download_file_thread( + url: Url, + path: PathBuf, + sender: std::sync::mpsc::Sender, +) { + let client = reqwest::Client::new(); + let mut response = match client.get(url).send().await { + Ok(response) => response, + Err(err) => { + let _ = sender.send(DownloadEvent::Result(Err(err.into()))); + return; + } + }; + + let mut downloaded = 0; + + let mut file = match File::create(&path) { + Ok(file) => file, + Err(err) => { + let _ = sender.send(DownloadEvent::Result(Err(err.into()))); + return; + } + }; + + while let Some(chunk) = response.chunk().await.unwrap() { + if let Err(err) = file.write_all(&chunk) { + let _ = sender.send(DownloadEvent::Result(Err(err.into()))); + return; + } + downloaded += chunk.len() as u64; + + // Send progress update + let _ = sender.send(DownloadEvent::Progress(downloaded)); + } + + let _ = sender.send(DownloadEvent::Result(Ok(()))); +} + +pub fn _download_file(url: &str, path: &str) -> Result<(), anyhow::Error> { + let (sender, receiver) = std::sync::mpsc::channel::(); + let url = Url::parse(url)?; + let path = PathBuf::from(path); + + tokio::spawn(async move { + download_file_thread(url, path, sender).await; + }); + + let mut last_download_report = 0; + // Process events + loop { + match receiver.recv() { + Ok(event) => match event { + DownloadEvent::Progress(bytes) => { + if bytes - last_download_report > 5e6 as u64 { + println!("Bytes downloaded: {}", bytes); + last_download_report = bytes; + } + } + DownloadEvent::Result(res) => { + return res; + } + }, + Err(err) => { + return Err(err.into()); + } + } + } +} + +pub fn download_file(url: &str, path: &str) -> Result<(), anyhow::Error> { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { _download_file(url, path) }) +} diff --git a/rust/xtask/src/export.rs b/rust/xtask/src/export.rs index acfca87d..0e8d8e0e 100644 --- a/rust/xtask/src/export.rs +++ b/rust/xtask/src/export.rs @@ -1,7 +1,10 @@ use std::{fs, io, path::Path}; -use crate::install_dependency::{self, get_godot_editor_path}; +use crate::install_dependency::{ + self, download_and_extract_zip, set_executable_permission, GODOT4_EXPORT_TEMPLATES_BASE_URL, +}; +#[allow(dead_code)] fn copy_dir_all(src: impl AsRef, dst: impl AsRef) -> io::Result<()> { fs::create_dir_all(&dst)?; for entry in fs::read_dir(src)? { @@ -37,72 +40,66 @@ pub fn export() -> Result<(), anyhow::Error> { .expect("Failed to run Godot"); // Export .pck - let pck_path = "./../exports/decentraland.godot.client.pck"; - if std::path::Path::new(pck_path).exists() { + let output_path = match std::env::consts::OS { + "linux" => format!("{export_dir}/decentraland.godot.client.x86_64"), + "windows" => format!("{export_dir}/decentraland.godot.client.exe"), + _ => { + return Err(anyhow::anyhow!( + "Unsupported platform: {}", + std::env::consts::OS + )); + } + }; + + let target = match std::env::consts::OS { + "linux" => "linux", + "windows" => "win64", + _ => { + return Err(anyhow::anyhow!( + "Unsupported platform: {}", + std::env::consts::OS + )); + } + }; + + if std::path::Path::new(output_path.as_str()).exists() { fs::remove_file(export_dir)?; } let args = vec![ "-e", + "--quit", + "--headless", "--path", "./../godot", - "--headless", - "--export-pack", - "linux", - pck_path, - "--quit", + "--export-release", + target, + output_path.as_str(), ]; let status2 = std::process::Command::new(program.as_str()) .args(&args) .status() .expect("Failed to run Godot"); - if !std::path::Path::new(pck_path).exists() { + if !std::path::Path::new(output_path.as_str()).exists() { return Err(anyhow::anyhow!( - ".pck file was not generated. pre-import godot status: {:?}, pck-export godot status: {:?}", + "Output file was not generated. pre-import godot status: {:?}, project-export godot status: {:?}", status1, status2 )); } - // check platform - match std::env::consts::OS { - "linux" => { - std::fs::copy( - "./../godot/lib/libdecentraland_godot_lib.so", - "./../exports/libdecentraland_godot_lib.so", - )?; - std::fs::copy(program, "./../exports/decentraland.godot.client")?; - } - "windows" => { - std::fs::copy(program, "./../exports/decentraland.godot.client.exe")?; - std::fs::copy( - "./../godot/lib/decentraland_godot_lib.dll", - "./../exports/decentraland_godot_lib.dll", - )?; - } - "macos" => { - let program = format!("./../.bin/godot/{}", get_godot_editor_path().unwrap()); - copy_dir_all(program, "./../exports/DecentralandGodotClient.app")?; - - let frameworks_dir = "./../exports/DecentralandGodotClient.app/Contents/Frameworks"; - if !std::path::Path::new(frameworks_dir).exists() { - fs::create_dir(frameworks_dir)?; - } + if std::env::consts::OS == "linux" { + set_executable_permission(Path::new(output_path.as_str()))?; + } - std::fs::copy( - "./../godot/lib/libdecentraland_godot_lib.dylib", - "./../exports/DecentralandGodotClient.app/Contents/Frameworks/libdecentraland_godot_lib.dylib", - )?; - std::fs::copy( - "./../exports/decentraland.godot.client.pck", - "./../exports/DecentralandGodotClient.app/Contents/Resources/Godot.pck", - )?; - std::fs::remove_file("./../exports/decentraland.godot.client.pck")?; - } - _ => {} - }; + Ok(()) +} - println!("Exported to {export_dir} succesfully!"); +pub fn prepare_templates() -> Result<(), anyhow::Error> { + download_and_extract_zip( + GODOT4_EXPORT_TEMPLATES_BASE_URL, + "./../.bin/godot/templates", + )?; Ok(()) } diff --git a/rust/xtask/src/install_dependency.rs b/rust/xtask/src/install_dependency.rs index 4b334966..58292aad 100644 --- a/rust/xtask/src/install_dependency.rs +++ b/rust/xtask/src/install_dependency.rs @@ -8,14 +8,17 @@ use std::path::Path; use tar::Archive; use zip::ZipArchive; +use crate::download_file::download_file; +use crate::export::prepare_templates; + const PROTOC_BASE_URL: &str = "https://github.com/protocolbuffers/protobuf/releases/download/v23.2/protoc-23.2-"; const GODOT4_BIN_BASE_URL: &str = - "https://github.com/godotengine/godot/releases/download/4.0.3-stable/Godot_v4.0.3-stable_"; + "https://github.com/godotengine/godot/releases/download/4.1-stable/Godot_v4.1-stable_"; -// pub const GODOT4_EXPORT_TEMPLATES_BASE_URL: &str = -// "https://downloads.tuxfamily.org/godotengine/4.0.3/Godot_v4.0.3-stable_export_templates.tpz"; +pub const GODOT4_EXPORT_TEMPLATES_BASE_URL: &str = + "https://github.com/godotengine/godot/releases/download/4.1-stable/Godot_v4.1-stable_export_templates.tpz"; fn create_directory_all(path: &Path) -> io::Result<()> { if let Some(parent) = path.parent() { @@ -89,10 +92,13 @@ fn get_protoc_url() -> Option { pub fn download_and_extract_zip(url: &str, destination_path: &str) -> Result<(), anyhow::Error> { println!("Downloading {url:?}"); - let response = reqwest::blocking::get(url)?; - let zip_bytes = response.bytes()?; + if Path::new("./tmp-file.zip").exists() { + fs::remove_file("./tmp-file.zip")?; + } - let mut zip_archive = ZipArchive::new(std::io::Cursor::new(zip_bytes))?; + download_file(url, "./tmp-file.zip")?; + let file = File::open("./tmp-file.zip")?; + let mut zip_archive = ZipArchive::new(file)?; for i in 0..zip_archive.len() { let mut file = zip_archive.by_index(i)?; @@ -105,6 +111,8 @@ pub fn download_and_extract_zip(url: &str, destination_path: &str) -> Result<(), } } + fs::remove_file("./tmp-file.zip")?; + Ok(()) } @@ -122,7 +130,7 @@ fn get_godot_url() -> Option { Some(format!("{GODOT4_BIN_BASE_URL}{os_url}")) } -fn set_executable_permission(_file_path: &Path) -> std::io::Result<()> { +pub fn set_executable_permission(_file_path: &Path) -> std::io::Result<()> { #[cfg(unix)] { let mut permissions = fs::metadata(_file_path)?.permissions(); @@ -142,8 +150,8 @@ pub fn get_godot_executable_path() -> Option { let arch = env::consts::ARCH; let os_url = match (os, arch) { - ("linux", "x86_64") => Some("Godot_v4.0.3-stable_linux.x86_64".to_string()), - ("windows", "x86_64") => Some("Godot_v4.0.3-stable_win64.exe".to_string()), + ("linux", "x86_64") => Some("Godot_v4.1-stable_linux.x86_64".to_string()), + ("windows", "x86_64") => Some("Godot_v4.1-stable_win64.exe".to_string()), ("macos", _) => Some("Godot.app/Contents/MacOS/Godot".to_string()), _ => None, }?; @@ -151,20 +159,6 @@ pub fn get_godot_executable_path() -> Option { Some(os_url) } -pub fn get_godot_editor_path() -> Option { - let os = env::consts::OS; - let arch = env::consts::ARCH; - - let os_url = match (os, arch) { - ("linux", "x86_64") => Some("Godot_v4.0.3-stable_linux.x86_64".to_string()), - ("windows", "x86_64") => Some("Godot_v4.0.3-stable_win64.exe".to_string()), - ("macos", _) => Some("Godot.app".to_string()), - _ => None, - }?; - - Some(os_url) -} - pub fn copy_library(debug_mode: bool) -> Result<(), anyhow::Error> { let os = env::consts::OS; let arch = env::consts::ARCH; @@ -189,21 +183,28 @@ pub fn copy_library(debug_mode: bool) -> Result<(), anyhow::Error> { Ok(()) } -pub fn install() -> Result<(), anyhow::Error> { +pub fn install(skip_download_templates: bool) -> Result<(), anyhow::Error> { install_dcl_protocol()?; download_and_extract_zip(get_protoc_url().unwrap().as_str(), "./../.bin/protoc")?; download_and_extract_zip(get_godot_url().unwrap().as_str(), "./../.bin/godot")?; + let program_path = format!("./../.bin/godot/{}", get_godot_executable_path().unwrap()); + let dest_program_path = "./../.bin/godot/godot4_bin"; + match (env::consts::OS, env::consts::ARCH) { ("linux", _) | ("macos", _) => { set_executable_permission(Path::new("./../.bin/protoc/bin/protoc"))?; - set_executable_permission(Path::new( - format!("./../.bin/godot/{}", get_godot_executable_path().unwrap()).as_str(), - ))?; + set_executable_permission(Path::new(program_path.as_str()))?; } _ => (), }; + fs::copy(program_path, dest_program_path)?; + + if !skip_download_templates { + prepare_templates()?; + } + Ok(()) } diff --git a/rust/xtask/src/main.rs b/rust/xtask/src/main.rs index 096ab6a2..4108a94e 100644 --- a/rust/xtask/src/main.rs +++ b/rust/xtask/src/main.rs @@ -4,6 +4,7 @@ use anyhow::Context; use clap::{AppSettings, Arg, Command}; use xtaskops::ops::{clean_files, cmd, confirm, remove_dir}; +mod download_file; mod export; mod install_dependency; mod run; @@ -44,7 +45,14 @@ fn main() -> Result<(), anyhow::Error> { ), ) .subcommand(Command::new("docs")) - .subcommand(Command::new("install")) + .subcommand( + Command::new("install").arg( + Arg::new("no-templates") + .long("no-templates") + .help("skip download templates") + .takes_value(false), + ), + ) .subcommand(Command::new("export")) .subcommand( Command::new("run") @@ -67,17 +75,24 @@ fn main() -> Result<(), anyhow::Error> { .long("itest") .help("run tests") .takes_value(false), + ) + .arg( + Arg::new("only-build") + .long("only-build") + .help("skip the run") + .takes_value(false), ), ); let matches = cli.get_matches(); let root = xtaskops::ops::root_dir(); let res = match matches.subcommand() { - Some(("install", _)) => install_dependency::install(), + Some(("install", sm)) => install_dependency::install(sm.is_present("no-templates")), Some(("run", sm)) => run::run( sm.is_present("editor"), sm.is_present("release"), sm.is_present("itest"), + sm.is_present("only-build"), ), Some(("export", _m)) => export::export(), Some(("coverage", sm)) => coverage_with_itest(sm.is_present("dev")), diff --git a/rust/xtask/src/run.rs b/rust/xtask/src/run.rs index b64aaef9..984f2536 100644 --- a/rust/xtask/src/run.rs +++ b/rust/xtask/src/run.rs @@ -1,10 +1,22 @@ use crate::install_dependency; -pub fn run(editor: bool, release_mode: bool, itest: bool) -> Result<(), anyhow::Error> { - let program = format!( +pub fn run( + editor: bool, + release_mode: bool, + itest: bool, + only_build: bool, +) -> Result<(), anyhow::Error> { + let program = std::fs::canonicalize(format!( "./../.bin/godot/{}", install_dependency::get_godot_executable_path().unwrap() - ); + )) + .unwrap() + .to_str() + .unwrap() + .to_string(); + + std::env::set_var("GODOT4_BIN", program.clone()); + let mut args = vec!["--path", "./../godot"]; if editor { args.push("-e"); @@ -33,6 +45,10 @@ pub fn run(editor: bool, release_mode: bool, itest: bool) -> Result<(), anyhow:: args.push("--headless"); } + if only_build { + return Ok(()); + } + let status = std::process::Command::new(program.as_str()) .args(&args) .status()