diff --git a/.gitattributes b/.gitattributes index 5af3e121a8cc..30d1acb49737 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,6 @@ # Properly detect languages on Github -*.h linguist-language=cpp -*.inc linguist-language=cpp +*.h linguist-language=C++ +*.inc linguist-language=C++ thirdparty/* linguist-vendored # Normalize EOL for all files that Git considers text files diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 7ffae10a2aab..6803d9afd52b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,72 +1,72 @@ name: Bug report description: Report a bug in Godot -body: -- type: markdown - attributes: - value: | - When reporting bugs, please follow the guidelines in this template. This helps identify the problem precisely and thus enables contributors to fix it faster. - - Write a descriptive issue title above. - - The golden rule is to **always open *one* issue for *one* bug**. If you notice several bugs and want to report them, make sure to create one new issue for each of them. - - Search [open](https://github.com/godotengine/godot/issues) and [closed](https://github.com/godotengine/godot/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported. If you don't find a relevant match or if you're unsure, don't hesitate to **open a new issue**. The bugsquad will handle it from there if it's a duplicate. - - Verify that you are using a [supported Godot version](https://docs.godotengine.org/en/latest/about/release_policy.html). Please always check if your issue is reproducible in the latest version – it may already have been fixed! - - If you use a custom build, please test if your issue is reproducible in official builds too. Likewise if you use any C++ modules, GDExtensions, or editor plugins, you should check if the bug is reproducible in a project without these. +body: + - type: markdown + attributes: + value: | + When reporting bugs, please follow the guidelines in this template. This helps identify the problem precisely and thus enables contributors to fix it faster. + - Write a descriptive issue title above. + - The golden rule is to **always open *one* issue for *one* bug**. If you notice several bugs and want to report them, make sure to create one new issue for each of them. + - Search [open](https://github.com/godotengine/godot/issues) and [closed](https://github.com/godotengine/godot/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported. If you don't find a relevant match or if you're unsure, don't hesitate to **open a new issue**. The bugsquad will handle it from there if it's a duplicate. + - Verify that you are using a [supported Godot version](https://docs.godotengine.org/en/latest/about/release_policy.html). Please always check if your issue is reproducible in the latest version – it may already have been fixed! + - If you use a custom build, please test if your issue is reproducible in official builds too. Likewise if you use any C++ modules, GDExtensions, or editor plugins, you should check if the bug is reproducible in a project without these. -- type: textarea - attributes: - label: Tested versions - description: | - To properly fix a bug, we need to identify if the bug was recently introduced in the engine, or if it was always present. - - Please specify the Godot version you found the issue in, including the **Git commit hash** if using a development or non-official build. The exact Godot version (including the commit hash) can be copied by clicking the version shown in the editor (bottom bar) or in the project manager (top bar). - - If you can, **please test earlier Godot versions** (previous stable branch, and development snapshots of the current feature release) and, if applicable, newer versions (development snapshots for the next feature release). Mention whether the bug is reproducible or not in the versions you tested. You can find all Godot releases in our [download archive](https://godotengine.org/download/archive/). - - The aim is for us to identify whether a bug is a **regression**, i.e. an issue that didn't exist in a previous version, but was introduced later on, breaking existing functionality. For example, if a bug is reproducible in 4.2.stable but not in 4.1.stable, we would like you to test intermediate 4.2 dev and beta snapshots to find which snapshot is the first one where the issue can be reproduced. - placeholder: | + - type: textarea + attributes: + label: Tested versions + description: | + To properly fix a bug, we need to identify if the bug was recently introduced in the engine, or if it was always present. + - Please specify the Godot version you found the issue in, including the **Git commit hash** if using a development or non-official build. The exact Godot version (including the commit hash) can be copied by clicking the version shown in the editor (bottom bar) or in the project manager (top bar). + - If you can, **please test earlier Godot versions** (previous stable branch, and development snapshots of the current feature release) and, if applicable, newer versions (development snapshots for the next feature release). Mention whether the bug is reproducible or not in the versions you tested. You can find all Godot releases in our [download archive](https://godotengine.org/download/archive/). + - The aim is for us to identify whether a bug is a **regression**, i.e. an issue that didn't exist in a previous version, but was introduced later on, breaking existing functionality. For example, if a bug is reproducible in 4.2.stable but not in 4.1.stable, we would like you to test intermediate 4.2 dev and beta snapshots to find which snapshot is the first one where the issue can be reproduced. + placeholder: | - - Reproducible in: 4.3.dev [d76c1d0e5], 4.2.stable, 4.2.dev5 and later 4.2 snapshots. - - Not reproducible in: 4.1.3.stable, 4.2.dev4 and earlier 4.2 snapshots. - validations: - required: true + - Reproducible in: 4.3.dev [d76c1d0e5], 4.2.stable, 4.2.dev5 and later 4.2 snapshots. + - Not reproducible in: 4.1.3.stable, 4.2.dev4 and earlier 4.2 snapshots. + validations: + required: true -- type: input - attributes: - label: System information - description: | - - Specify the OS version, and when relevant hardware information. - - For issues that are likely OS-specific and/or graphics-related, please specify the CPU model and architecture. - - For graphics-related issues, specify the GPU model, driver version, and the rendering backend (GLES2, GLES3, Vulkan). - - **Bug reports not including the required information may be closed at the maintainers' discretion.** If in doubt, always include all the requested information; it's better to include too much information than not enough information. - - **Starting from Godot 4.1, you can copy this information to your clipboard by using *Help > Copy System Info* at the top of the editor window.** - placeholder: Windows 10 - Godot v4.0.3.stable - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 970 (nvidia, 510.85.02) - Intel Core i7-10700KF CPU @ 3.80GHz (16 Threads) - validations: - required: true + - type: input + attributes: + label: System information + description: | + - Specify the OS version, and when relevant hardware information. + - For issues that are likely OS-specific and/or graphics-related, please specify the CPU model and architecture. + - For graphics-related issues, specify the GPU model, driver version, and the rendering backend (GLES2, GLES3, Vulkan). + - **Bug reports not including the required information may be closed at the maintainers' discretion.** If in doubt, always include all the requested information; it's better to include too much information than not enough information. + - **Starting from Godot 4.1, you can copy this information to your clipboard by using *Help > Copy System Info* at the top of the editor window.** + placeholder: Windows 10 - Godot v4.0.3.stable - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 970 (nvidia, 510.85.02) - Intel Core i7-10700KF CPU @ 3.80GHz (16 Threads) + validations: + required: true -- type: textarea - attributes: - label: Issue description - description: | - Describe your issue briefly. What doesn't work, and how do you expect it to work instead? - You can include images or videos with drag and drop, and format code blocks or logs with \`\`\` tags, on separate lines before and after the text. (Use \`\`\`gdscript to add GDScript syntax highlighting.) - Please do not add code examples or error messages as screenshots, but as text, this helps searching for issues and testing the code. If you are reporting a bug in the editor interface, like the script editor, please provide both a screenshot *and* the text of the code to help with testing. - validations: - required: true + - type: textarea + attributes: + label: Issue description + description: | + Describe your issue briefly. What doesn't work, and how do you expect it to work instead? + You can include images or videos with drag and drop, and format code blocks or logs with \`\`\` tags, on separate lines before and after the text. (Use \`\`\`gdscript to add GDScript syntax highlighting.) + Please do not add code examples or error messages as screenshots, but as text, this helps searching for issues and testing the code. If you are reporting a bug in the editor interface, like the script editor, please provide both a screenshot *and* the text of the code to help with testing. + validations: + required: true -- type: textarea - attributes: - label: Steps to reproduce - description: | - List of steps or sample code that reproduces the issue. Having reproducible issues is a prerequisite for contributors to be able to solve them. - If you include a minimal reproduction project below, you can detail how to use it here. - validations: - required: true + - type: textarea + attributes: + label: Steps to reproduce + description: | + List of steps or sample code that reproduces the issue. Having reproducible issues is a prerequisite for contributors to be able to solve them. + If you include a minimal reproduction project below, you can detail how to use it here. + validations: + required: true -- type: textarea - attributes: - label: Minimal reproduction project (MRP) - description: | - - A small Godot project which reproduces the issue, with no unnecessary files included. Be sure to not include the `.godot` folder in the archive (but keep `project.godot`). - - Having an MRP is very important for contributors to be able to reproduce the bug in the same way that you are experiencing it. When testing a potential fix for the issue, contributors will use the MRP to validate that the fix is working as intended. - - If the reproduction steps are not project dependent (e.g. the bug is visible in a brand new project), you can write "N/A" in the field. - - Drag and drop a ZIP archive to upload it (max 10 MB). **Do not select another field until the project is done uploading.** - - **Note for C# users:** If your issue is *not* C#-specific, please upload a minimal reproduction project written in GDScript. This will make it easier for contributors to reproduce the issue locally as not everyone has a .NET setup available. - validations: - required: true + - type: textarea + attributes: + label: Minimal reproduction project (MRP) + description: | + - A small Godot project which reproduces the issue, with no unnecessary files included. Be sure to not include the `.godot` folder in the archive (but keep `project.godot`). + - Having an MRP is very important for contributors to be able to reproduce the bug in the same way that you are experiencing it. When testing a potential fix for the issue, contributors will use the MRP to validate that the fix is working as intended. + - If the reproduction steps are not project dependent (e.g. the bug is visible in a brand new project), you can write "N/A" in the field. + - Drag and drop a ZIP archive to upload it (max 10 MB). **Do not select another field until the project is done uploading.** + - **Note for C# users:** If your issue is *not* C#-specific, please upload a minimal reproduction project written in GDScript. This will make it easier for contributors to reproduce the issue locally as not everyone has a .NET setup available. + validations: + required: true diff --git a/.github/actions/download-artifact/action.yml b/.github/actions/download-artifact/action.yml index 534b3251c5c0..c2a3d777c41b 100644 --- a/.github/actions/download-artifact/action.yml +++ b/.github/actions/download-artifact/action.yml @@ -1,15 +1,17 @@ name: Download Godot artifact description: Download the Godot artifact. + inputs: name: description: The artifact name. - default: "${{ github.job }}" + default: ${{ github.job }} path: description: The path to download and extract to. required: true - default: "./" + default: ./ + runs: - using: "composite" + using: composite steps: - name: Download Godot Artifact uses: actions/download-artifact@v4 diff --git a/.github/actions/godot-api-dump/action.yml b/.github/actions/godot-api-dump/action.yml index 773068866170..dee70298c4b5 100644 --- a/.github/actions/godot-api-dump/action.yml +++ b/.github/actions/godot-api-dump/action.yml @@ -1,11 +1,13 @@ name: Dump Godot API description: Dump Godot API for GDExtension + inputs: bin: description: The path to the Godot executable required: true + runs: - using: "composite" + using: composite steps: # Dump GDExtension interface and API - name: Dump GDExtension interface and API for godot-cpp build @@ -19,5 +21,5 @@ runs: - name: Upload API dump uses: ./.github/actions/upload-artifact with: - name: 'godot-api-dump' - path: './godot-api/*' + name: godot-api-dump + path: ./godot-api/* diff --git a/.github/actions/godot-build/action.yml b/.github/actions/godot-build/action.yml index bf29b7e430ad..93d6f076b728 100644 --- a/.github/actions/godot-build/action.yml +++ b/.github/actions/godot-build/action.yml @@ -1,34 +1,39 @@ name: Build Godot description: Build Godot with the provided options. + inputs: target: description: Build target (editor, template_release, template_debug). - default: "editor" + default: editor tests: description: Unit tests. default: false + required: false platform: description: Target platform. required: false sconsflags: - default: "" + description: Additional SCons flags. + default: '' + required: false scons-cache: description: The SCons cache path. - default: "${{ github.workspace }}/.scons-cache/" + default: ${{ github.workspace }}/.scons-cache/ scons-cache-limit: description: The SCons cache size limit. # actions/cache has 10 GiB limit, and GitHub runners have a 14 GiB disk. # Limit to 7 GiB to avoid having the extracted cache fill the disk. default: 7168 + runs: - using: "composite" + using: composite steps: - - name: Scons Build + - name: SCons Build shell: sh env: - SCONSFLAGS: ${{ inputs.sconsflags }} - SCONS_CACHE: ${{ inputs.scons-cache }} - SCONS_CACHE_LIMIT: ${{ inputs.scons-cache-limit }} + SCONSFLAGS: ${{ inputs.sconsflags }} + SCONS_CACHE: ${{ inputs.scons-cache }} + SCONS_CACHE_LIMIT: ${{ inputs.scons-cache-limit }} run: | echo "Building with flags:" platform=${{ inputs.platform }} target=${{ inputs.target }} tests=${{ inputs.tests }} ${{ env.SCONSFLAGS }} diff --git a/.github/actions/godot-cache-restore/action.yml b/.github/actions/godot-cache-restore/action.yml index eb955affef97..7abec20a2821 100644 --- a/.github/actions/godot-cache-restore/action.yml +++ b/.github/actions/godot-cache-restore/action.yml @@ -3,18 +3,19 @@ description: Restore Godot build cache. inputs: cache-name: description: The cache base name (job name by default). - default: "${{github.job}}" + default: ${{ github.job }} scons-cache: description: The SCons cache path. - default: "${{github.workspace}}/.scons-cache/" + default: ${{ github.workspace }}/.scons-cache/ + runs: - using: "composite" + using: composite steps: - name: Restore SCons cache directory uses: actions/cache/restore@v4 with: - path: ${{inputs.scons-cache}} - key: ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + path: ${{ inputs.scons-cache }} + key: ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} # We try to match an existing cache to restore from it. Each potential key is checked against # all existing caches as a prefix. E.g. 'linux-template-minimal' would match any cache that @@ -28,7 +29,7 @@ runs: # 4. A partial match for the same base branch only (not ideal, matches any PR with the same base branch). restore-keys: | - ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} - ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}} - ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-refs/heads/${{env.GODOT_BASE_BRANCH}} - ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}} + ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} + ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }} + ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-refs/heads/${{ env.GODOT_BASE_BRANCH }} + ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }} diff --git a/.github/actions/godot-cache-save/action.yml b/.github/actions/godot-cache-save/action.yml index b7cbf91f94ff..df877cec67bd 100644 --- a/.github/actions/godot-cache-save/action.yml +++ b/.github/actions/godot-cache-save/action.yml @@ -3,15 +3,16 @@ description: Save Godot build cache. inputs: cache-name: description: The cache base name (job name by default). - default: "${{github.job}}" + default: ${{ github.job }} scons-cache: description: The SCons cache path. - default: "${{github.workspace}}/.scons-cache/" + default: ${{ github.workspace }}/.scons-cache/ + runs: - using: "composite" + using: composite steps: - name: Save SCons cache directory uses: actions/cache/save@v4 with: - path: ${{inputs.scons-cache}} - key: ${{inputs.cache-name}}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + path: ${{ inputs.scons-cache }} + key: ${{ inputs.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} diff --git a/.github/actions/godot-converter-test/action.yml b/.github/actions/godot-converter-test/action.yml index 919a76e69375..ffd558d98b1a 100644 --- a/.github/actions/godot-converter-test/action.yml +++ b/.github/actions/godot-converter-test/action.yml @@ -1,11 +1,13 @@ name: Test Godot project converter description: Test the Godot project converter. + inputs: bin: description: The path to the Godot executable required: true + runs: - using: "composite" + using: composite steps: - name: Test 3-to-4 conversion shell: sh diff --git a/.github/actions/godot-deps/action.yml b/.github/actions/godot-deps/action.yml index 99404657c63f..eb9bdef1e774 100644 --- a/.github/actions/godot-deps/action.yml +++ b/.github/actions/godot-deps/action.yml @@ -1,17 +1,19 @@ name: Setup Python and SCons description: Setup Python, install the pip version of SCons. + inputs: python-version: description: The Python version to use. - default: "3.x" + default: 3.x python-arch: description: The Python architecture. - default: "x64" + default: x64 scons-version: description: The SCons version to use. - default: "4.8.0" + default: 4.8.0 + runs: - using: "composite" + using: composite steps: - name: Set up Python 3.x uses: actions/setup-python@v5 diff --git a/.github/actions/godot-project-test/action.yml b/.github/actions/godot-project-test/action.yml index fd8c024a37df..36448cd50aec 100644 --- a/.github/actions/godot-project-test/action.yml +++ b/.github/actions/godot-project-test/action.yml @@ -1,11 +1,13 @@ name: Test Godot project description: Run the test Godot project. + inputs: bin: description: The path to the Godot executable required: true + runs: - using: "composite" + using: composite steps: # Download and extract zip archive with project, folder is renamed to be able to easy change used project - name: Download test project diff --git a/.github/actions/upload-artifact/action.yml b/.github/actions/upload-artifact/action.yml index 80c680103d30..8524afdf593a 100644 --- a/.github/actions/upload-artifact/action.yml +++ b/.github/actions/upload-artifact/action.yml @@ -1,15 +1,17 @@ name: Upload Godot artifact description: Upload the Godot artifact. + inputs: name: description: The artifact name. - default: "${{ github.job }}" + default: ${{ github.job }} path: description: The path to upload. required: true - default: "bin/*" + default: bin/* + runs: - using: "composite" + using: composite steps: - name: Upload Godot Artifact uses: actions/upload-artifact@v4 diff --git a/.github/workflows/android_builds.yml b/.github/workflows/android_builds.yml index ee75d532828d..7ff5502137c3 100644 --- a/.github/workflows/android_builds.yml +++ b/.github/workflows/android_builds.yml @@ -6,15 +6,15 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes + SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes strict_checks=yes concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-android + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-android cancel-in-progress: true jobs: build-android: - runs-on: "ubuntu-20.04" + runs-on: ubuntu-20.04 name: ${{ matrix.name }} strategy: fail-fast: false @@ -39,7 +39,8 @@ jobs: sconsflags: arch=arm64 steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive @@ -85,6 +86,7 @@ jobs: run: | cd platform/android/java ./gradlew generateGodotEditor + ./gradlew generateGodotHorizonOSEditor cd ../../.. ls -l bin/android_editor_builds/ diff --git a/.github/workflows/godot_cpp_test.yml b/.github/workflows/godot_cpp_test.yml index 57114dacfc20..e26c109d75c4 100644 --- a/.github/workflows/godot_cpp_test.yml +++ b/.github/workflows/godot_cpp_test.yml @@ -7,52 +7,58 @@ env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master # Used for the godot-cpp checkout. - GODOT_CPP_BRANCH: '4.2' + GODOT_CPP_BRANCH: 4.3 concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-cpp-tests + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-cpp-tests cancel-in-progress: true jobs: godot-cpp-tests: - runs-on: "ubuntu-20.04" - name: "Build and test Godot CPP" + runs-on: ubuntu-20.04 + name: Build and test Godot CPP steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: - submodules: recursive - - - name: Setup Python and SCons - uses: ./.github/actions/godot-deps + sparse-checkout: .github - # Checkout godot-cpp - name: Checkout godot-cpp uses: actions/checkout@v4 with: + submodules: recursive repository: godotengine/godot-cpp ref: ${{ env.GODOT_CPP_BRANCH }} - submodules: 'recursive' - path: 'godot-cpp' + path: godot-cpp + + - name: Setup Python and SCons + uses: ./.github/actions/godot-deps + + - name: Setup GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master - # Download generated API dump - name: Download GDExtension interface and API dump uses: ./.github/actions/download-artifact with: - name: 'godot-api-dump' - path: './godot-api' + name: godot-api-dump + path: ./godot-cpp/gdextension - # Extract and override existing files with generated files - - name: Extract GDExtension interface and API dump - run: | - cp -f godot-api/gdextension_interface.h godot-cpp/gdextension/ - cp -f godot-api/extension_api.json godot-cpp/gdextension/ + # TODO: Enable caching when godot-cpp has proper cache limiting. - # TODO: Add caching to the SCons build and store it for CI via the godot-cache - # action. + # - name: Restore Godot build cache + # uses: ./.github/actions/godot-cache-restore + # with: + # cache-name: godot-cpp + # continue-on-error: true - # Build godot-cpp test extension - name: Build godot-cpp test extension - run: | - cd godot-cpp/test - scons target=template_debug dev_build=yes - cd ../.. + env: # Keep synced with godot-build. + SCONS_CACHE: ${{ github.workspace }}/.scons-cache/ + SCONS_CACHE_LIMIT: 7168 + run: scons --directory=./godot-cpp/test target=template_debug dev_build=yes verbose=yes + + # - name: Save Godot build cache + # uses: ./.github/actions/godot-cache-save + # with: + # cache-name: godot-cpp + # continue-on-error: true diff --git a/.github/workflows/ios_builds.yml b/.github/workflows/ios_builds.yml index 8da6d1311e6e..8513429f9a63 100644 --- a/.github/workflows/ios_builds.yml +++ b/.github/workflows/ios_builds.yml @@ -6,19 +6,20 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes + SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no module_text_server_fb_enabled=yes strict_checks=yes concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-ios + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-ios cancel-in-progress: true jobs: ios-template: - runs-on: "macos-latest" + runs-on: macos-latest name: Template (target=template_release) steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 10389dc9da0d..dc3d9f378624 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -6,18 +6,18 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes + SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes strict_checks=yes DOTNET_NOLOGO: true DOTNET_CLI_TELEMETRY_OPTOUT: true TSAN_OPTIONS: suppressions=misc/error_suppressions/tsan.txt concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-linux + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-linux cancel-in-progress: true jobs: build-linux: - runs-on: "ubuntu-20.04" + runs-on: ubuntu-20.04 name: ${{ matrix.name }} strategy: fail-fast: false @@ -27,7 +27,7 @@ jobs: cache-name: linux-editor-mono target: editor sconsflags: module_mono_enabled=yes - bin: "./bin/godot.linuxbsd.editor.x86_64.mono" + bin: ./bin/godot.linuxbsd.editor.x86_64.mono build-mono: true tests: false # Disabled due freeze caused by mix Mono build and CI doc-test: true @@ -40,7 +40,7 @@ jobs: target: editor # Debug symbols disabled as they're huge on this build and we hit the 14 GB limit for runners. sconsflags: dev_build=yes scu_build=yes debug_symbols=no precision=double use_asan=yes use_ubsan=yes linker=gold - bin: "./bin/godot.linuxbsd.editor.dev.double.x86_64.san" + bin: ./bin/godot.linuxbsd.editor.dev.double.x86_64.san build-mono: false tests: true proj-test: true @@ -53,7 +53,7 @@ jobs: cache-name: linux-editor-llvm-sanitizers target: editor sconsflags: dev_build=yes use_asan=yes use_ubsan=yes use_llvm=yes linker=lld - bin: "./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san" + bin: ./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san build-mono: false tests: true # Skip 2GiB artifact speeding up action. @@ -66,36 +66,37 @@ jobs: target: editor tests: true sconsflags: dev_build=yes use_tsan=yes use_llvm=yes linker=lld - bin: "./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san" + bin: ./bin/godot.linuxbsd.editor.dev.x86_64.llvm.san build-mono: false # Skip 2GiB artifact speeding up action. artifact: false - - name: Template w/ Mono (target=template_release) + - name: Template w/ Mono (target=template_release, tests=yes) cache-name: linux-template-mono target: template_release - sconsflags: module_mono_enabled=yes tests=yes - bin: "./bin/godot.linuxbsd.template_release.x86_64.mono" + sconsflags: module_mono_enabled=yes + bin: ./bin/godot.linuxbsd.template_release.x86_64.mono build-mono: false tests: true artifact: true - - name: Minimal template (target=template_release, everything disabled) + - name: Minimal template (target=template_release, tests=yes, everything disabled) cache-name: linux-template-minimal target: template_release - sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no tests=yes - bin: "./bin/godot.linuxbsd.template_release.x86_64" + sconsflags: modules_enabled_by_default=no disable_3d=yes disable_advanced_gui=yes deprecated=no minizip=no + bin: ./bin/godot.linuxbsd.template_release.x86_64 tests: true artifact: true steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive # Need newer mesa for lavapipe to work properly. - name: Linux dependencies for tests - if: ${{ matrix.proj-test }} + if: matrix.proj-test run: | sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EB8B81E14DA65431D7504EA8F63F0F2B90935439 @@ -120,11 +121,11 @@ jobs: continue-on-error: true - name: Setup Python and SCons - if: ${{ ! matrix.legacy-scons }} + if: '!matrix.legacy-scons' uses: ./.github/actions/godot-deps - name: Setup Python and SCons (legacy versions) - if: ${{ matrix.legacy-scons }} + if: matrix.legacy-scons uses: ./.github/actions/godot-deps with: # Sync with Ensure*Version in SConstruct. @@ -149,48 +150,48 @@ jobs: continue-on-error: true - name: Generate C# glue - if: ${{ matrix.build-mono }} + if: matrix.build-mono run: | ${{ matrix.bin }} --headless --generate-mono-glue ./modules/mono/glue - name: Build .NET solutions - if: ${{ matrix.build-mono }} + if: matrix.build-mono run: | ./modules/mono/build_scripts/build_assemblies.py --godot-output-dir=./bin --godot-platform=linuxbsd - name: Prepare artifact - if: ${{ matrix.artifact }} + if: matrix.artifact run: | strip bin/godot.* chmod +x bin/godot.* - name: Upload artifact uses: ./.github/actions/upload-artifact - if: ${{ matrix.artifact }} + if: matrix.artifact with: name: ${{ matrix.cache-name }} - name: Dump Godot API uses: ./.github/actions/godot-api-dump - if: ${{ matrix.api-dump }} + if: matrix.api-dump with: bin: ${{ matrix.bin }} - name: Unit tests - if: ${{ matrix.tests }} + if: matrix.tests run: | ${{ matrix.bin }} --version ${{ matrix.bin }} --help ${{ matrix.bin }} --headless --test --force-colors - name: .NET source generators tests - if: ${{ matrix.build-mono }} + if: matrix.build-mono run: | dotnet test modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Tests # Check class reference - name: Check for class reference updates - if: ${{ matrix.doc-test }} + if: matrix.doc-test run: | echo "Running --doctool to see if this changes the public API without updating the documentation." echo -e "If a diff is shown, it means that your code/doc changes are incomplete and you should update the class reference with --doctool.\n\n" @@ -199,20 +200,20 @@ jobs: # Check API backwards compatibility - name: Check for GDExtension compatibility - if: ${{ matrix.api-compat }} + if: matrix.api-compat run: | ./misc/scripts/validate_extension_api.sh "${{ matrix.bin }}" # Download and run the test project - name: Test Godot project uses: ./.github/actions/godot-project-test - if: ${{ matrix.proj-test }} + if: matrix.proj-test with: bin: ${{ matrix.bin }} # Test the project converter - name: Test project converter uses: ./.github/actions/godot-converter-test - if: ${{ matrix.proj-conv }} + if: matrix.proj-conv with: bin: ${{ matrix.bin }} diff --git a/.github/workflows/macos_builds.yml b/.github/workflows/macos_builds.yml index 4db7462b3a85..fcf4b00afb18 100644 --- a/.github/workflows/macos_builds.yml +++ b/.github/workflows/macos_builds.yml @@ -6,15 +6,15 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes + SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes strict_checks=yes concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-macos + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-macos cancel-in-progress: true jobs: build-macos: - runs-on: "macos-latest" + runs-on: macos-latest name: ${{ matrix.name }} strategy: fail-fast: false @@ -24,17 +24,18 @@ jobs: cache-name: macos-editor target: editor tests: true - bin: "./bin/godot.macos.editor.universal" + bin: ./bin/godot.macos.editor.universal - - name: Template (target=template_release) + - name: Template (target=template_release, tests=yes) cache-name: macos-template target: template_release tests: true - sconsflags: debug_symbols=no tests=yes - bin: "./bin/godot.macos.template_release.universal" + sconsflags: debug_symbols=no + bin: ./bin/godot.macos.template_release.universal steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive @@ -86,7 +87,7 @@ jobs: name: ${{ matrix.cache-name }} - name: Unit tests - if: ${{ matrix.tests }} + if: matrix.tests run: | ${{ matrix.bin }} --version ${{ matrix.bin }} --help diff --git a/.github/workflows/runner.yml b/.github/workflows/runner.yml index 34b6af43074d..d2d0e3571fda 100644 --- a/.github/workflows/runner.yml +++ b/.github/workflows/runner.yml @@ -2,51 +2,45 @@ name: 🔗 GHA on: [push, pull_request] concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-runner + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-runner cancel-in-progress: true jobs: # First stage: Only static checks, fast and prevent expensive builds from running. static-checks: - if: ${{ vars.DISABLE_GODOT_CI == '' }} + if: '!vars.DISABLE_GODOT_CI' name: 📊 Static checks uses: ./.github/workflows/static_checks.yml # Second stage: Run all the builds and some of the tests. android-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🤖 Android needs: static-checks uses: ./.github/workflows/android_builds.yml ios-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🍏 iOS needs: static-checks uses: ./.github/workflows/ios_builds.yml linux-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🐧 Linux needs: static-checks uses: ./.github/workflows/linux_builds.yml macos-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🍎 macOS needs: static-checks uses: ./.github/workflows/macos_builds.yml windows-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🏁 Windows needs: static-checks uses: ./.github/workflows/windows_builds.yml web-build: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🌐 Web needs: static-checks uses: ./.github/workflows/web_builds.yml @@ -56,7 +50,6 @@ jobs: # Can be turned off for PRs that intentionally break compat with godot-cpp, # until both the upstream PR and the matching godot-cpp changes are merged. godot-cpp-test: - if: ${{ vars.DISABLE_GODOT_CI == '' }} name: 🪲 Godot CPP # This can be changed to depend on another platform, if we decide to use it for # godot-cpp instead. Make sure to move the .github/actions/godot-api-dump step diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index 9a8a4a8f1912..ff102a06cc57 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -3,7 +3,7 @@ on: workflow_call: concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-static + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-static cancel-in-progress: true jobs: @@ -48,7 +48,7 @@ jobs: - name: Style checks via pre-commit uses: pre-commit/action@v3.0.1 with: - extra_args: --verbose --files ${{ env.CHANGED_FILES }} + extra_args: --files ${{ env.CHANGED_FILES }} - name: Python builders checks via pytest run: | @@ -57,3 +57,7 @@ jobs: - name: Class reference schema checks run: | xmllint --noout --schema doc/class.xsd doc/classes/*.xml modules/*/doc_classes/*.xml platform/*/doc_classes/*.xml + + - name: Run C compiler on `gdextension_interface.h` + run: | + gcc -c core/extension/gdextension_interface.h diff --git a/.github/workflows/web_builds.yml b/.github/workflows/web_builds.yml index add5fa815403..8e30c99fbc65 100644 --- a/.github/workflows/web_builds.yml +++ b/.github/workflows/web_builds.yml @@ -6,17 +6,17 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no use_closure_compiler=yes - EM_VERSION: 3.1.59 - EM_CACHE_FOLDER: "emsdk-cache" + SCONSFLAGS: verbose=yes warnings=extra werror=yes debug_symbols=no use_closure_compiler=yes strict_checks=yes + EM_VERSION: 3.1.64 + EM_CACHE_FOLDER: emsdk-cache concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-web + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-web cancel-in-progress: true jobs: web-template: - runs-on: "ubuntu-22.04" + runs-on: ubuntu-22.04 name: ${{ matrix.name }} strategy: fail-fast: false @@ -37,16 +37,17 @@ jobs: artifact: true steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive - name: Set up Emscripten latest uses: mymindstorm/setup-emsdk@v14 with: - version: ${{env.EM_VERSION}} - actions-cache-folder: ${{env.EM_CACHE_FOLDER}} - cache-key: emsdk-${{ matrix.cache-name }}-${{env.GODOT_BASE_BRANCH}}-${{github.ref}}-${{github.sha}} + version: ${{ env.EM_VERSION }} + actions-cache-folder: ${{ env.EM_CACHE_FOLDER }} + cache-key: emsdk-${{ matrix.cache-name }}-${{ env.GODOT_BASE_BRANCH }}-${{ github.ref }}-${{ github.sha }} - name: Verify Emscripten setup run: | @@ -77,6 +78,6 @@ jobs: - name: Upload artifact uses: ./.github/actions/upload-artifact - if: ${{ matrix.artifact }} + if: matrix.artifact with: name: ${{ matrix.cache-name }} diff --git a/.github/workflows/windows_builds.yml b/.github/workflows/windows_builds.yml index 90629204e6a9..95e3d4a553d1 100644 --- a/.github/workflows/windows_builds.yml +++ b/.github/workflows/windows_builds.yml @@ -7,17 +7,17 @@ on: env: # Used for the cache key. Add version suffix to force clean build. GODOT_BASE_BRANCH: master - SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes d3d12=yes "angle_libs=${{github.workspace}}/" + SCONSFLAGS: verbose=yes warnings=extra werror=yes module_text_server_fb_enabled=yes d3d12=yes strict_checks=yes "angle_libs=${{ github.workspace }}/" SCONS_CACHE_MSVC_CONFIG: true concurrency: - group: ci-${{github.actor}}-${{github.head_ref || github.run_number}}-${{github.ref}}-windows + group: ci-${{ github.actor }}-${{ github.head_ref || github.run_number }}-${{ github.ref }}-windows cancel-in-progress: true jobs: build-windows: # Windows 10 with latest image - runs-on: "windows-latest" + runs-on: windows-latest name: ${{ matrix.name }} strategy: fail-fast: false @@ -29,17 +29,27 @@ jobs: tests: true # Skip debug symbols, they're way too big with MSVC. sconsflags: debug_symbols=no vsproj=yes vsproj_gen_only=no windows_subsystem=console - bin: "./bin/godot.windows.editor.x86_64.exe" + bin: ./bin/godot.windows.editor.x86_64.exe + artifact: true - - name: Template (target=template_release) + - name: Editor w/ clang-cl (target=editor, tests=yes, use_llvm=yes) + cache-name: windows-editor-clang + target: editor + tests: true + sconsflags: debug_symbols=no windows_subsystem=console use_llvm=yes + bin: ./bin/godot.windows.editor.x86_64.llvm.exe + + - name: Template (target=template_release, tests=yes) cache-name: windows-template target: template_release tests: true - sconsflags: debug_symbols=no tests=yes - bin: "./bin/godot.windows.template_release.x86_64.console.exe" + sconsflags: debug_symbols=no + bin: ./bin/godot.windows.template_release.x86_64.console.exe + artifact: true steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: recursive @@ -64,7 +74,7 @@ jobs: target: angle/angle.zip - name: Extract pre-built ANGLE static libraries - run: Expand-Archive -Force angle/angle.zip ${{github.workspace}}/ + run: Expand-Archive -Force angle/angle.zip ${{ github.workspace }}/ - name: Setup MSVC problem matcher uses: ammaraskar/msvc-problem-matcher@master @@ -84,16 +94,18 @@ jobs: continue-on-error: true - name: Prepare artifact + if: ${{ matrix.artifact }} run: | Remove-Item bin/* -Include *.exp,*.lib,*.pdb -Force - name: Upload artifact + if: ${{ matrix.artifact }} uses: ./.github/actions/upload-artifact with: name: ${{ matrix.cache-name }} - name: Unit tests - if: ${{ matrix.tests }} + if: matrix.tests run: | ${{ matrix.bin }} --version ${{ matrix.bin }} --help diff --git a/.mailmap b/.mailmap index c4e7cf17432e..825e72bfd08f 100644 --- a/.mailmap +++ b/.mailmap @@ -26,10 +26,13 @@ ChibiDenDen Chris Bradfield Clay John Clay John +CookieBadger Dana Olson dankan1890 Daniel J. Ramirez David Cambré +DmitriySalnikov +DmitriySalnikov Dominik 'dreamsComeTrue' Jasiński DeeJayLSP <60024671+DeeJayLSP@users.noreply.github.com> Emmanuel Barroga @@ -66,6 +69,8 @@ Ignacio Etcheverry Ilaria Cislaghi Ilaria Cislaghi Indah Sylvia +Ivan Shakhov +Ivan Shakhov iwek J08nY J08nY @@ -79,6 +84,7 @@ Jean-Michel Bernard Jérôme Gully JFonS jitspoe +Johan Aires Rastén Juan Linietsky Juan Linietsky Juan Linietsky @@ -92,6 +98,7 @@ karroffel Kelly Thomas Kongfa Waroros K. S. Ernest (iFire) Lee +K. S. Ernest (iFire) Lee kleonc <9283098+kleonc@users.noreply.github.com> Leon Krause Leon Krause @@ -108,6 +115,7 @@ Marcin Zawiejski Marcus Elg Mariano Javier Suligoy Mario Schlack +Mark DiBarry marxin marynate Mateo Kuruk Miccino @@ -136,6 +144,7 @@ Pieter-Jan Briers Pieter-Jan Briers Poommetee Ketson Przemysław Gołąb (n-pigeon) +Radiant <69520693+RadiantUwU@users.noreply.github.com> Rafał Mikrut Rafał Mikrut Ralf Hölzemer diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 46f29d0d5fc9..a3bf09bb5655 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,6 +17,7 @@ repos: exclude: | (?x)^( tests/python_build/.*| + platform/android/java/editor/src/main/java/com/android/.*| platform/android/java/lib/src/com/.* ) @@ -30,6 +31,7 @@ repos: exclude: | (?x)^( tests/python_build/.*| + platform/android/java/editor/src/main/java/com/android/.*| platform/android/java/lib/src/com/.* ) additional_dependencies: [clang-tidy==18.1.1] @@ -54,6 +56,11 @@ repos: rev: v2.3.0 hooks: - id: codespell + exclude: | + (?x)^( + platform/android/java/editor/src/main/java/com/android/.*| + platform/android/java/lib/src/com/.* + ) additional_dependencies: [tomli] ### Requires Docker; look into alternative implementation. @@ -89,16 +96,21 @@ repos: language: node entry: eslint files: ^(platform/web/js/|modules/|misc/dist/html/).*\.(js|html)$ - args: [--fix, --no-warn-ignored, --no-config-lookup, --config, platform/web/eslint.config.cjs] + args: + - --fix + - --no-warn-ignored + - --no-config-lookup + - --config + - platform/web/eslint.config.cjs additional_dependencies: - '@eslint/js@^9.3.0' - '@html-eslint/eslint-plugin@^0.24.1' - '@html-eslint/parser@^0.24.1' - '@stylistic/eslint-plugin@^2.1.0' - - 'eslint@^9.3.0' - - 'eslint-plugin-html@^8.1.1' - - 'globals@^15.3.0' - - 'espree@^10.0.1' + - eslint@^9.3.0 + - eslint-plugin-html@^8.1.1 + - globals@^15.3.0 + - espree@^10.0.1 - id: jsdoc name: jsdoc @@ -116,7 +128,7 @@ repos: - -d - dry-run pass_filenames: false - additional_dependencies: ['jsdoc@^4.0.3'] + additional_dependencies: [jsdoc@^4.0.3] - id: svgo name: svgo @@ -124,7 +136,7 @@ repos: entry: svgo files: \.svg$ args: [--quiet, --config, misc/utility/svgo.config.mjs] - additional_dependencies: ["svgo@3.3.2"] + additional_dependencies: [svgo@3.3.2] - id: copyright-headers name: copyright-headers @@ -135,6 +147,7 @@ repos: (?x)^( core/math/bvh_.*\.inc$| platform/(?!android|ios|linuxbsd|macos|web|windows)\w+/.*| + platform/android/java/editor/src/main/java/com/android/.*| platform/android/java/lib/src/com/.*| platform/android/java/lib/src/org/godotengine/godot/gl/GLSurfaceView\.java$| platform/android/java/lib/src/org/godotengine/godot/gl/EGLLogWrapper\.java$| @@ -162,6 +175,7 @@ repos: modules/gdscript/tests/scripts/parser/features/mixed_indentation_on_blank_lines\.gd$| modules/gdscript/tests/scripts/parser/warnings/empty_file_newline_comment\.notest\.gd$| modules/gdscript/tests/scripts/parser/warnings/empty_file_newline\.notest\.gd$| + platform/android/java/editor/src/main/java/com/android/.*| platform/android/java/lib/src/com/google/.* ) @@ -170,7 +184,7 @@ repos: language: python entry: python misc/scripts/dotnet_format.py types_or: [c#] - +# # End of upstream Godot pre-commit hooks. # # Keep this separation to let downstream forks add their own hooks to this file, diff --git a/AUTHORS.md b/AUTHORS.md index 0f000a1a75af..b21270b3f700 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -1,11 +1,17 @@ # Godot Engine authors Godot Engine is developed by a community of voluntary contributors who -contribute code, bug reports, documentation, artwork, support, etc. +contribute code, bug reports, documentation, translations, support, etc., +across multiple repositories. It is impossible to list them all; nevertheless, this file aims at listing -the developers who contributed significant patches to this MIT licensed -source code. "Significant" is arbitrarily decided, but should be fair :) +the developers who contributed significant improvements to the engine code. + +To keep the list curated, we use a threshold of a minimum of 11 commits. + +This file does not strictly reflect copyright ownership for the engine +source code. For this, refer to the Git history to know which contributor +wrote which part of the codebase. GitHub usernames are indicated in parentheses, or as sole entry when no other name is available. @@ -25,17 +31,18 @@ name is available. ## Developers -(in alphabetical order, with over 10 commits excluding merges) - Aaron Franke (aaronfranke) + Aaron Pagano (aaronp64) Aaron Record (LightningAA) Adam Scott (adamscott) + Alexander Hartmann (Alex2782) Alexander Holland (AlexHolly) Alex Drozd (brno32) Alexey Khoroshavin (allkhor) Alfred Reinold Baudisch (alfredbaudisch) Alistair Leslie-Hughes (alesliehughes) Alket Rexhepi (alketii) + Alvin Wong (alvinhochun) Andrea Catania (AndreaCatania) Andreia Gaita (shana) Andrii Doroshenko (Xrayez) @@ -44,11 +51,13 @@ name is available. Angad Kambli (angad-k) Anilforextra (AnilBK) Anish Bhobe (KidRigger) + Anni Ryynänen (anniryynanen) Anton Yabchinskiy (a12n) Anutrix Aren Villanueva (kurikaesu) Ariel Manzur (punto-) Arman Elgudzhyan (puchik) + Arseny Kapoulkine (zeux) AThousandShips aXu-AP Bartłomiej T. Listwon (Listwon) @@ -58,8 +67,8 @@ name is available. Bernhard Liebl (poke1024) Bhuvan Vemula (Bhu1-V) bitsawer - BlueCube3310 Błażej Szczygieł (zaps166) + BlueCube3310 Bojidar Marinov (bojidar-bg) Brian Semrau (briansemrau) Bruno Lourenço (MadEqua) @@ -70,8 +79,11 @@ name is available. Carter Anderson (cart) ChibiDenDen Chris Bradfield (cbscribe) + Chris Cranford (Naros) + Christian Kaiser (ckaiser) Clay John (clayjohn) ConteZero + CookieBadger Dana Olson (adolson) Daniel J. Ramirez (djrm) Daniel Rakos (aqnuep) @@ -82,13 +94,16 @@ name is available. David Cambré (Gallilus) David Sichma (DavidSichma) David Snopek (dsnopek) + derammo Dharkael (lupoDharkael) + Dirk Steinmetz (rsjtdrjgfuzkfg) Dmitry Koteroff (Krakean) Dmitry Maganov (vonagam) Dominik Jasiński (dreamsComeTrue) Douglas Leão (DeeJayLSP) DualMatrix Ellen Poe (ellenhp) + Emilio Coppola (coppolaemilio) Emmanuel Barroga (codecustard) Emmanuel Leblond (touilleMan) Eoin O'Neill (Eoin-ONeill-Yokai) @@ -112,6 +127,7 @@ name is available. Geequlim George Marques (vnen) Gerrit Großkopf (Grosskopf) + Giganzo Gilles Roudiere (groud) Gordon MacPherson (RevoluPowered) Guilherme Felipe de C. G. da Silva (guilhermefelipecgs) @@ -120,7 +136,7 @@ name is available. Haoyu Qiu (timothyqiu) Hein-Pieter van Braam-Stewart (hpvb) Hendrik Brucker (Geometror) - hilfazer + Hilderin Hiroshi Ogawa (hi-ogawa) HolonProduction homer666 @@ -128,10 +144,11 @@ name is available. Hugo Locurcio (Calinou) Ian Bishop (ianb96) Ibrahn Sahir (ibrahn) - Ignacio Etcheverry (neikeq) + Ignacio Roldán Etcheverry (neikeq) Igor Kordiukiewicz (IgorKordiukiewicz) Ilaria Cislaghi (QbieShay) Indah Sylvia (ISylvox) + Ivan Šachov (van800) J08nY Jake Young (Duroxxigar) Jakub Grzesik (kubecz3k) @@ -144,6 +161,7 @@ name is available. Jia Jun Chai (SkyLucilfer) jitspoe Joan Fons Sanchez (JFonS) + Johan Aires Rastén (JohanAR) Johan Manuel (29jm) Johannes Witt (HaSa1002) Jonathan Nicholl (jtnicholl) @@ -156,17 +174,21 @@ name is available. Jummit Justo Delgado (mrcdk) karroffel + Kassandra Pucher (PucklaJ) Kelly Thomas (KellyThomas) kleonc Kongfa Waroros (gongpha) Kostadin Damyanov (Max-Might) K. S. Ernest (iFire) Lee (fire) + Kyle Eichlin (likeich) lawnjelly Leon Krause (leonkrause) Liz Haas (27thLiz) Lucien Menassol (Kanabenki) Lyuma Maganty Rushyendra (mrushyendra) + Magian (magian1127) + Mai Lavelle (maiself) Malcolm Nixon (Malcolmnixon) Manuele Finocchiaro (m4nu3lf) Marcel Admiraal (madmiraal) @@ -176,9 +198,11 @@ name is available. Marcus Brummer (mbrlabs) Marcus Elg (MCrafterzz) Mariano Javier Suligoy (MarianoGnu) + Mario Liebisch (MarioLiebisch) Mario Schlack (hurikhan) Marios Staikopoulos (marstaik) Marius Hanl (Maran23) + Mark DiBarry (markdibarry) Mark Riedesel (klowner) Markus Sauermann (Sauermann) Martin Capitanio (capnm) @@ -188,6 +212,7 @@ name is available. Masoud BH (masoudbh3) Mateo Kuruk Miccino (kuruk-mm) Matias N. Goldberg (darksylinc) + Matthew Murphy (mashumafi) Matthew (skyace65) Matthias Hölzl (hoelzl) Max Hilbrunner (mhilbrunner) @@ -199,13 +224,15 @@ name is available. MichiRecRoom (LikeLakers2) Micky (Mickeon) Mikael Hermansson (mihe) + Mika Viskari (miv391) MinusKube MJacred - Morris "Tabor" Arroad (mortarroad) + Mounir Tohami (WhalesState) mrezai Muhammad Huri (CakHuri) muiroc myaaaaaaaaa + Nathalie Galla (MurderVeggie) Nathan Franke (nathanfranke) Nathan Lovato (NathanLovato) Nathan Warden (NathanWarden) @@ -223,6 +250,7 @@ name is available. Patrick Dawson (pkdawson) Patrick Exner (FlameLizard) Patrick (firefly2442) + patwork Paul Batty (Paulb23) Paul Joannon (paulloz) Paul Trojahn (ptrojahn) @@ -234,9 +262,10 @@ name is available. Pieter-Jan Briers (PJB3005) Poommetee Ketson (Noshyaar) Przemysław Gołąb (n-pigeon) + Radiant (RadiantUwU) Rafael M. G. (rafallus) - Raffaele Picca (RPicster) Rafał Mikrut (qarmin) + Raffaele Picca (RPicster) Ralf Hölzemer (rollenrolm) Ramesh Ravone (RameshRavone) Raphael2048 @@ -271,6 +300,7 @@ name is available. Stanislav Labzyuk (DarkMessiah) Stijn Hinlopen (hinlopen) stmSi + Stuart Carnie (stuartcarnie) Swarnim Arun (minraws) TC (floppyhammer) TechnoPorg @@ -278,6 +308,7 @@ name is available. Thakee Nathees (ThakeeNathees) thebestnom Theo Hallenius (TheoXD) + Thomas ten Cate (ttencate) Timo Schwarzer (timoschwarzer) Timothé Bonhoure (ajreckof) Timo (toger5) @@ -304,5 +335,7 @@ name is available. Zher Huei Lee (leezh) Zi Ye (MajorMcDoom) ZuBsPaCe + Дмитрий Сальников (DmitriySalnikov) + 忘忧の (Daylily-Zeleen) 谢天 (jsjtxietian) 风青山 (Rindbee) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4d95412f7aa..9bc91738137b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,12 @@ previous feature release. It is equivalent to the listings on our Changelogs for earlier feature releases are available in their respective Git branches, and linked at the [end of this file](#Past-releases). -## 4.2 - 2023-11-30 +## 4.3 - 2024-08-15 -- [Release announcement](https://godotengine.org/article/godot-4-2-arrives-in-style) -- [Migration guide](https://docs.godotengine.org/en/latest/tutorials/migrating/upgrading_to_godot_4.2.html) -- [Interactive changelog](https://godotengine.github.io/godot-interactive-changelog/#4.2) -- [Breaking changes](https://github.com/godotengine/godot/pulls?q=is%3Apr+is%3Amerged+label%3A%22breaks+compat%22+milestone%3A4.2) +- [Release announcement](https://godotengine.org/releases/4.3/) +- [Migration guide](https://docs.godotengine.org/en/latest/tutorials/migrating/upgrading_to_godot_4.3.html) +- [Interactive changelog](https://godotengine.github.io/godot-interactive-changelog/#4.3) +- [Breaking changes](https://github.com/godotengine/godot/pulls?q=is%3Apr+is%3Amerged+label%3A%22breaks+compat%22+milestone%3A4.3) Table of contents: @@ -48,1895 +48,3473 @@ Table of contents: #### 2D -- Greatly improve Y-sort performance on TileMaps ([GH-73813](https://github.com/godotengine/godot/pull/73813)). -- Add separate editor plugin for TileMap and TileSet ([GH-74717](https://github.com/godotengine/godot/pull/74717)). -- Cleanup tiles outside the texture ([GH-77986](https://github.com/godotengine/godot/pull/77986)). -- Move TileMap layers to their own class ([GH-78328](https://github.com/godotengine/godot/pull/78328)). -- Add option to swap default Alt+scroll zooming behavior in 2D editor ([GH-78451](https://github.com/godotengine/godot/pull/78451)). -- Add white rect to TileMap selection tool ([GH-78519](https://github.com/godotengine/godot/pull/78519)). -- Improve string drawing in the tiledata editor ([GH-78522](https://github.com/godotengine/godot/pull/78522)). -- Make sure the shortcut key respects the context in `TileSetAtlasSourceEditor` ([GH-78920](https://github.com/godotengine/godot/pull/78920)). -- Fix `Camera2D.rotating` not being converted and reversed properly ([GH-79264](https://github.com/godotengine/godot/pull/79264)). -- Streamline creating tile atlas sources ([GH-79285](https://github.com/godotengine/godot/pull/79285)). -- Rework modifying tile source ID ([GH-79419](https://github.com/godotengine/godot/pull/79419)). -- Allow using floating-point bone sizes and outline widths in the 2D editor ([GH-79434](https://github.com/godotengine/godot/pull/79434)). -- Add option to expand tile polygon editors ([GH-79512](https://github.com/godotengine/godot/pull/79512)). -- Add `is_conformal` method to Basis and Transform2D ([GH-79523](https://github.com/godotengine/godot/pull/79523)). -- Improve message when no tile is selected to edit ([GH-79562](https://github.com/godotengine/godot/pull/79562)). -- Fix crash when deleting tileset terrains ([GH-79618](https://github.com/godotengine/godot/pull/79618)). -- Fix Camera2D crash when edited scene root is null ([GH-79645](https://github.com/godotengine/godot/pull/79645)). -- Auto create tile for multiple atlases ([GH-79678](https://github.com/godotengine/godot/pull/79678)). -- Fix `CanvasModulate` logic for modulating the canvas ([GH-79747](https://github.com/godotengine/godot/pull/79747)). -- Fix `get_cursor_shape()` in tile atlas editor ([GH-79837](https://github.com/godotengine/godot/pull/79837)). -- Fix crash when executing `TileMap.fix_invalid_tiles` ([GH-79851](https://github.com/godotengine/godot/pull/79851)). -- Improve atlas tile size dragging ([GH-79899](https://github.com/godotengine/godot/pull/79899)). -- Add help label about creating multiple/big tiles ([GH-79904](https://github.com/godotengine/godot/pull/79904)). -- Properly clear scene tiles ([GH-79941](https://github.com/godotengine/godot/pull/79941)). -- Edit TileSet source on double click ([GH-80037](https://github.com/godotengine/godot/pull/80037)). -- Fix "a number is required" error when printing RID ([GH-80122](https://github.com/godotengine/godot/pull/80122)). -- Ignore null "id" in tile source proxy ([GH-80135](https://github.com/godotengine/godot/pull/80135)). -- Add per-tile flipping and transposing ([GH-80144](https://github.com/godotengine/godot/pull/80144)). -- Fix multiple usability issues in the texture region editor ([GH-80435](https://github.com/godotengine/godot/pull/80435)). -- Fix TileSet with TileMap handling ([GH-80462](https://github.com/godotengine/godot/pull/80462)). -- Fix TileSet not disappearing on deselecting TileMap ([GH-80529](https://github.com/godotengine/godot/pull/80529)). -- TileMap: Check for possible scenes to be erased ([GH-80658](https://github.com/godotengine/godot/pull/80658)). -- Pass missing arguments to `TileMap::get_used_cells_by_id` ([GH-80729](https://github.com/godotengine/godot/pull/80729)). -- Improve scene tiles workflow ([GH-80754](https://github.com/godotengine/godot/pull/80754)). -- Simplify making texture nodes in 2D editor ([GH-80771](https://github.com/godotengine/godot/pull/80771)). -- Add `px` suffix for TileSet `separation` property ([GH-80934](https://github.com/godotengine/godot/pull/80934)). -- Convert TileSet Atlas Merge input images to RGBA8 to match output, if needed ([GH-80943](https://github.com/godotengine/godot/pull/80943)). -- Call `add_child` after `set_rect` to fix size bug ([GH-80968](https://github.com/godotengine/godot/pull/80968)). -- Added checks to remove meta arrays when creating and undoing guides ([GH-81011](https://github.com/godotengine/godot/pull/81011)). -- Improve TileMap performances by using quadrants only for rendering ([GH-81070](https://github.com/godotengine/godot/pull/81070)). -- Allow configuring primary line X/Ys separately ([GH-81255](https://github.com/godotengine/godot/pull/81255)). -- Fix `TileMap::get_used_rect` incorrectly handling empty layers ([GH-81423](https://github.com/godotengine/godot/pull/81423)). -- Fix rotated 2D movement gizmo ([GH-81735](https://github.com/godotengine/godot/pull/81735)). -- Incorporate min and max zoom limits into the EditorZoomWidget ([GH-81812](https://github.com/godotengine/godot/pull/81812)). -- Fix TileMap editor so that pressing control deselects cells correctly ([GH-81925](https://github.com/godotengine/godot/pull/81925)). -- Don't allow transforming scene tiles ([GH-81971](https://github.com/godotengine/godot/pull/81971)). -- Fix animated tile time-slice calculation accumulating float errors ([GH-82360](https://github.com/godotengine/godot/pull/82360)). -- Fix transform calculations for drag-moving CanvasItems in editor ([GH-82667](https://github.com/godotengine/godot/pull/82667)). -- Prioritize points in polygon editor hover ([GH-82853](https://github.com/godotengine/godot/pull/82853)). -- Fixes undo/redo in tileset polygon editor ([GH-83093](https://github.com/godotengine/godot/pull/83093)). -- Warn users when TileMap is set as Y-sorted but no layer is ([GH-83144](https://github.com/godotengine/godot/pull/83144)). -- Fix tilemap live editing while game is running ([GH-83146](https://github.com/godotengine/godot/pull/83146)). -- Update `TileMap` layer draw index when it's dirty ([GH-83151](https://github.com/godotengine/godot/pull/83151)). -- Swap TileMap and TileSet buttons ([GH-83244](https://github.com/godotengine/godot/pull/83244)). -- Allow disabling the built-in tilemap navigation ([GH-83273](https://github.com/godotengine/godot/pull/83273)). -- Fix cannot update remote after disabling `use_global_coordinates` in `RemoteTransform2D` ([GH-83323](https://github.com/godotengine/godot/pull/83323)). -- Fix screen center position returned for rotated Camera2D ([GH-83427](https://github.com/godotengine/godot/pull/83427)). -- Fix bug where TileMap wouldn't update material correctly on assignment ([GH-83475](https://github.com/godotengine/godot/pull/83475)). -- Allow normal maps on TileMaps that use texture padding ([GH-83489](https://github.com/godotengine/godot/pull/83489)). -- Fix Polygon2D undo on transforming vertices ([GH-83659](https://github.com/godotengine/godot/pull/83659)). -- Fix TileSet painting options appear out of screen ([GH-83790](https://github.com/godotengine/godot/pull/83790)). -- Fix normals in TileSet when using CanvasTextures ([GH-83887](https://github.com/godotengine/godot/pull/83887)). -- Fix TileMap layer reverts and defaults ([GH-83888](https://github.com/godotengine/godot/pull/83888)). -- Fix `get_used_rect`, `get_used_cells` and `get_used_cells_by_id` in TileMap after a call to `clear()` ([GH-83890](https://github.com/godotengine/godot/pull/83890)). -- Fix Y-sort origin not working when set in TileMap runtime updates ([GH-84004](https://github.com/godotengine/godot/pull/84004)). -- Fix 2D bone weight editor not accounting for offset ([GH-84070](https://github.com/godotengine/godot/pull/84070)). -- Prevent crash and error spam related to Sprite2D with a region ([GH-84361](https://github.com/godotengine/godot/pull/84361)). -- TileMap: Fix compatibility code for old `cell_quadrant_size` property name ([GH-85463](https://github.com/godotengine/godot/pull/85463)). +- Add temporary pivot for rotating multiple 2D nodes ([GH-58375](https://github.com/godotengine/godot/pull/58375)). +- Reorganize some code to have 2D things grouped together ([GH-66744](https://github.com/godotengine/godot/pull/66744)). +- Add option to toggle visibility of Position gizmos in 2D editor, organize existing options ([GH-75005](https://github.com/godotengine/godot/pull/75005)). +- Changed the way the rotation of a curve at a point is evaluated to match PathFollow2D ([GH-78378](https://github.com/godotengine/godot/pull/78378)). +- Organize 2D audio, camera, and physics in Viewport ([GH-79183](https://github.com/godotengine/godot/pull/79183)). +- Extend minimum/maximum zoom level of TextureRegion editor ([GH-79436](https://github.com/godotengine/godot/pull/79436)). +- Add tooltips for tile source types ([GH-79918](https://github.com/godotengine/godot/pull/79918)). +- Add Texture2D and Texture3D icons ([GH-81169](https://github.com/godotengine/godot/pull/81169)). +- Add a button to clear curve points in the Path2D editor ([GH-81325](https://github.com/godotengine/godot/pull/81325)). +- Improve UV editor zoom behavior ([GH-83731](https://github.com/godotengine/godot/pull/83731)). +- Fix UV editor not using texture transform ([GH-84076](https://github.com/godotengine/godot/pull/84076)). +- Fix slow raycast editing ([GH-84164](https://github.com/godotengine/godot/pull/84164)). +- Add zoom controls to Sprite2DPlugin converter preview ([GH-84353](https://github.com/godotengine/godot/pull/84353)). +- Select newly added nodes on drag and drop in 2D viewport ([GH-84356](https://github.com/godotengine/godot/pull/84356)). +- Fix generating terrain icon with certain image formats ([GH-84507](https://github.com/godotengine/godot/pull/84507)). +- Move tile transforms handling cache to TileData ([GH-84660](https://github.com/godotengine/godot/pull/84660)). +- Add region rect and frames support to Sprite2DPlugin converter ([GH-84754](https://github.com/godotengine/godot/pull/84754)). +- Fix typo in TileMap editor tooltip ([GH-85452](https://github.com/godotengine/godot/pull/85452)). +- Keep scene tiles even if the TileMap is invisible ([GH-85753](https://github.com/godotengine/godot/pull/85753)). +- Move TileMapLayer to its own files ([GH-85791](https://github.com/godotengine/godot/pull/85791)). +- Add descriptions for tile properties ([GH-85868](https://github.com/godotengine/godot/pull/85868)). +- Fix TileMap occluders ([GH-85893](https://github.com/godotengine/godot/pull/85893)). +- Change suffix of SkeletonModification2DTwoBoneIK from m to px ([GH-86056](https://github.com/godotengine/godot/pull/86056)). +- Reset TileMap editor `drag_type` when the toolbar mode is not selected ([GH-86066](https://github.com/godotengine/godot/pull/86066)). +- Fix `UndoRedo history mismatch` when creating a new tile atlas ([GH-86387](https://github.com/godotengine/godot/pull/86387)). +- Fix potential infinite loop when calculating tile editor zoom level ([GH-86568](https://github.com/godotengine/godot/pull/86568)). +- Tweak tile atlas help label positions ([GH-86694](https://github.com/godotengine/godot/pull/86694)). +- Allow `ui_cancel` to unselect all nodes in all edit modes in 2D, matching 3D behavior ([GH-86805](https://github.com/godotengine/godot/pull/86805)). +- Fix `TileMap` quadrant canvas item position not being local ([GH-86847](https://github.com/godotengine/godot/pull/86847)). +- Fix 2D viewport texture drop issue with global history registration ([GH-86933](https://github.com/godotengine/godot/pull/86933)). +- Made tooltip on `TileSet` Paint Button give more information when disabled ([GH-86947](https://github.com/godotengine/godot/pull/86947)). +- Add `CanvasItem::get_canvas_layer_node()` ([GH-87095](https://github.com/godotengine/godot/pull/87095)). +- Make TileMapLayers extend Node2D and work as children of TileMap ([GH-87115](https://github.com/godotengine/godot/pull/87115)). +- Fix some `TileMap` debug drawing truncating to ints ([GH-87160](https://github.com/godotengine/godot/pull/87160)). +- Remove unnecessary `_set_global_invalid` added by mistake ([GH-87328](https://github.com/godotengine/godot/pull/87328)). +- Update the viewport if CanvasItem top level is changed ([GH-87343](https://github.com/godotengine/godot/pull/87343)). +- Change TileMapEditor to TileMapLayerEditor ([GH-87379](https://github.com/godotengine/godot/pull/87379)). +- Add new Parallax2D node ([GH-87391](https://github.com/godotengine/godot/pull/87391)). +- Editor: Fix threading problems with `TileMap` preview ([GH-87470](https://github.com/godotengine/godot/pull/87470)). +- Prevent threading problems in `TileMap` ([GH-87478](https://github.com/godotengine/godot/pull/87478)). +- Fix `Camera2D` is enabled when dragging scene files to the `CanvasItemEditor` ([GH-87743](https://github.com/godotengine/godot/pull/87743)). +- Fix `TextureRegionEditor::_pan_callback` deferred called with only one argument ([GH-87771](https://github.com/godotengine/godot/pull/87771)). +- Fix duplicating/copying `TileMap` ([GH-88105](https://github.com/godotengine/godot/pull/88105)). +- Fix `TileMap::move_layer` incorrectly moving child `TileMapLayer` nodes ([GH-88157](https://github.com/godotengine/godot/pull/88157)). +- Fix regression where a tile's custom material was ignored ([GH-88190](https://github.com/godotengine/godot/pull/88190)). +- Fix `CanvasItem`/`Node3D` editor plugin drag drop transform calculation ([GH-88279](https://github.com/godotengine/godot/pull/88279)). +- Fix TileSet sources duplication ([GH-88280](https://github.com/godotengine/godot/pull/88280)). +- Tweak TileMap editor's missing source message to use "bottom panel" term ([GH-88290](https://github.com/godotengine/godot/pull/88290)). +- Make TileMapLayers internal ([GH-88378](https://github.com/godotengine/godot/pull/88378)). +- Remember frames when selecting `SpriteFrame` frames ([GH-88413](https://github.com/godotengine/godot/pull/88413)). +- Expose pixel snapping settings add pixel-art notes ([GH-88456](https://github.com/godotengine/godot/pull/88456)). +- Fix a memory leak with TileMap runtime updates ([GH-88629](https://github.com/godotengine/godot/pull/88629)). +- Show instantiating or inherit message when using drag to instantiate in 2D ([GH-88829](https://github.com/godotengine/godot/pull/88829)). +- TileSet: Fix crash when deleting dragged polygon point ([GH-88912](https://github.com/godotengine/godot/pull/88912)). +- Remove almost all remaining dependencies of TileMapLayer on TileMap ([GH-88966](https://github.com/godotengine/godot/pull/88966)). +- Disable lock and group buttons when selected item is not CanvasItem ([GH-88997](https://github.com/godotengine/godot/pull/88997)). +- Fix editor crash when unsupported `Resource` is dropped in scene ([GH-89126](https://github.com/godotengine/godot/pull/89126)). +- Update lock and group button state when selection changed in CanvasItemEditor ([GH-89132](https://github.com/godotengine/godot/pull/89132)). +- Expose TileMapLayer ([GH-89179](https://github.com/godotengine/godot/pull/89179)). +- Make CanvasItem's "drawing outside of NOTIFICATION_DRAW" error a macro ([GH-89298](https://github.com/godotengine/godot/pull/89298)). +- Fix center view button appears outside the GenericTilePolygonEditor ([GH-89434](https://github.com/godotengine/godot/pull/89434)). +- Fix call queue problems when loading TileSet ([GH-89493](https://github.com/godotengine/godot/pull/89493)). +- Avoid passing zoom scale for ParallaxLayer mirror ([GH-89572](https://github.com/godotengine/godot/pull/89572)). +- Account for scale in scroll logic for `Parallax2D` ([GH-89627](https://github.com/godotengine/godot/pull/89627)). +- Fix Path2D's add new point's UndoRedo bug ([GH-89874](https://github.com/godotengine/godot/pull/89874)). +- TileSet: Expose `TileData.is_valid_terrain_peering_bit` ([GH-89911](https://github.com/godotengine/godot/pull/89911)). +- Replace Clipper1 library by Clipper2 library ([GH-90153](https://github.com/godotengine/godot/pull/90153)). +- Ensure `Camera2D.position_smoothing_speed` is non-negative ([GH-90167](https://github.com/godotengine/godot/pull/90167)). +- Correctly update TileMapLayer highlighting when disabling it ([GH-90204](https://github.com/godotengine/godot/pull/90204)). +- Fix "no cached rect" errors in TileMapLayer editor ([GH-90207](https://github.com/godotengine/godot/pull/90207)). +- Fix strange visual bug with camera and external change ([GH-90317](https://github.com/godotengine/godot/pull/90317)). +- TileSet: Don't save angular and linear physics velocities if they have their default values ([GH-90384](https://github.com/godotengine/godot/pull/90384)). +- Fix selection rect drawing in `TileSet` editor when create/remove tiles with separation ([GH-90709](https://github.com/godotengine/godot/pull/90709)). +- Fix rendering transform of Y-sorted branch-root ([GH-90749](https://github.com/godotengine/godot/pull/90749)). +- Fix TileMap enabling Y-sort on child nodes ([GH-90752](https://github.com/godotengine/godot/pull/90752)). +- Reuse single erase pattern in tile editor ([GH-90817](https://github.com/godotengine/godot/pull/90817)). +- Editor: Fix crash when editing TileMap ([GH-90849](https://github.com/godotengine/godot/pull/90849)). +- Don't store TileMapLayer data if empty ([GH-90907](https://github.com/godotengine/godot/pull/90907)). +- Fix typo in Camera2D node's anchor mode ([GH-91076](https://github.com/godotengine/godot/pull/91076)). +- Fix Parallax2D physics interpolation ([GH-91706](https://github.com/godotengine/godot/pull/91706)). +- Add support for AtlasTexture in `draw_polygon()` ([GH-91724](https://github.com/godotengine/godot/pull/91724)). +- Fix 2d editor selection persisting after application loses focus ([GH-91732](https://github.com/godotengine/godot/pull/91732)). +- Fix TileMap selection pattern being needlessly reorganized ([GH-91905](https://github.com/godotengine/godot/pull/91905)). +- Allow selecting TileMapLayers by clicking them ([GH-92016](https://github.com/godotengine/godot/pull/92016)). +- Fix tile polygon grid not covering whole tile ([GH-92171](https://github.com/godotengine/godot/pull/92171)). +- Remove some TileMap dependencies from TileMapLayer ([GH-92194](https://github.com/godotengine/godot/pull/92194)). +- Display custom data name instead of indices in TileData inspector ([GH-92322](https://github.com/godotengine/godot/pull/92322)). +- Fix TileSet caching wrong collision layer shapes for shapes comprising several polygons ([GH-92373](https://github.com/godotengine/godot/pull/92373)). +- Optimize usage of position icon in 2D editor ([GH-92392](https://github.com/godotengine/godot/pull/92392)). +- Fix incorrect cull boundary for scaled and repeated Parallax2D children ([GH-92763](https://github.com/godotengine/godot/pull/92763)). +- Implement X-draw-order switch in TileMapLayer ([GH-92787](https://github.com/godotengine/godot/pull/92787)). +- Make texture filtering in TileAtlasView consistent ([GH-92926](https://github.com/godotengine/godot/pull/92926)). +- Update Camera2D gizmos when screen size changes ([GH-92992](https://github.com/godotengine/godot/pull/92992)). +- Fix tile polygon editor grid and missing update ([GH-93047](https://github.com/godotengine/godot/pull/93047)). +- Allow canceling actions in Path2D editor ([GH-93087](https://github.com/godotengine/godot/pull/93087)). +- Store TileMapLayer selection in scene's history ([GH-93475](https://github.com/godotengine/godot/pull/93475)). +- Fix snapping lines don't disappearing after drag anchors ([GH-93527](https://github.com/godotengine/godot/pull/93527)). +- Fix TileSet property painter popup showing clear color ([GH-93609](https://github.com/godotengine/godot/pull/93609)). +- Prevent selecting when a CanvasItem is selected ([GH-93671](https://github.com/godotengine/godot/pull/93671)). +- Fix some TileMapLayer editing problems ([GH-93747](https://github.com/godotengine/godot/pull/93747)). +- Fix RMB erasing of tiles ([GH-93850](https://github.com/godotengine/godot/pull/93850)). +- Fix crash in tile physics editor ([GH-93971](https://github.com/godotengine/godot/pull/93971)). +- Fix crash in the TileMapLayer editor when using editable children ([GH-93974](https://github.com/godotengine/godot/pull/93974)). +- Add pixel snap for `Parallax2D` ([GH-94014](https://github.com/godotengine/godot/pull/94014)). +- Remove unused assignment in Parallax2D ([GH-94035](https://github.com/godotengine/godot/pull/94035)). +- Fixes/node configuration warning dialog text ([GH-94147](https://github.com/godotengine/godot/pull/94147)). +- Make sure that selected tile source is remembered ([GH-94356](https://github.com/godotengine/godot/pull/94356)). #### 3D -- Re-add a Camera3D icon gizmo to the 3D editor ([GH-53104](https://github.com/godotengine/godot/pull/53104)). -- Implement numeric blender-style transforms ([GH-58389](https://github.com/godotengine/godot/pull/58389)). -- Wrap mouse for blender-style transforms ([GH-59467](https://github.com/godotengine/godot/pull/59467)). -- Improve editing of box collision shapes ([GH-71092](https://github.com/godotengine/godot/pull/71092)). -- Show visual-oriented 3D node gizmos only when selected ([GH-75303](https://github.com/godotengine/godot/pull/75303)). -- Fix Camera3D `project_*` methods not accounting for frustum offset ([GH-75806](https://github.com/godotengine/godot/pull/75806)). -- Avoid reimporting lightmap textures every getter call ([GH-77788](https://github.com/godotengine/godot/pull/77788)). -- Fix 3D viewport grid disappearing on scene tab changes ([GH-78694](https://github.com/godotengine/godot/pull/78694)). -- Fix VoxelGI saving VoxelGIData as a built-in file, despite being prompted to save it to an external file ([GH-78772](https://github.com/godotengine/godot/pull/78772)). -- Expose `compute_convex_mesh_points` function to GDScript ([GH-78871](https://github.com/godotengine/godot/pull/78871)). -- Change property hint range for camera attributes exposure multiplier ([GH-79138](https://github.com/godotengine/godot/pull/79138)). -- Make CSGShape follow curve's tilt in Path mode ([GH-79355](https://github.com/godotengine/godot/pull/79355)). -- Convert some Callables to `callable_mp()` ([GH-79373](https://github.com/godotengine/godot/pull/79373)). -- Initialize View Frame Time estimates to match 120 FPS ([GH-80124](https://github.com/godotengine/godot/pull/80124)). -- Add helper for 3D gizmos and unify box ([GH-80278](https://github.com/godotengine/godot/pull/80278)). -- Add handles to control Curve3D tilt ([GH-80329](https://github.com/godotengine/godot/pull/80329)). -- Allow setting values greater than the maximum in TorusMesh inspector ([GH-80441](https://github.com/godotengine/godot/pull/80441)). -- Add `global_basis` property to `Node3D` ([GH-80512](https://github.com/godotengine/godot/pull/80512)). -- Cleanup MeshLibrary changed signals ([GH-80782](https://github.com/godotengine/godot/pull/80782)). -- Improve Path3D gizmo usability ([GH-80802](https://github.com/godotengine/godot/pull/80802)). -- GridMap: Ensure the visibility is updated when entering the tree ([GH-81106](https://github.com/godotengine/godot/pull/81106)). -- Fix some keys triggering their actions twice in GridMap ([GH-81531](https://github.com/godotengine/godot/pull/81531)). -- Add 3D editor gizmo icons for Decal, LightmapProbe and FogVolume ([GH-81554](https://github.com/godotengine/godot/pull/81554)). -- Fix local 3D translation editing ([GH-81609](https://github.com/godotengine/godot/pull/81609)). -- Fix Curve3D baking up vectors for nontrivial curves ([GH-81885](https://github.com/godotengine/godot/pull/81885)). -- Update mesh list UI immediately after setting mesh library in gridmap ([GH-81914](https://github.com/godotengine/godot/pull/81914)). -- Optimize and tweak some SVGs, improve consistency between icons, and fix broken masks in light mode ([GH-82133](https://github.com/godotengine/godot/pull/82133)). -- Fix grid snapping for box shape gizmos ([GH-82381](https://github.com/godotengine/godot/pull/82381)). -- Make 3D editor gizmos and debug shapes ignore fog ([GH-82413](https://github.com/godotengine/godot/pull/82413)). -- Tweak Camera3D `size` property hint to make dragging more useful ([GH-82604](https://github.com/godotengine/godot/pull/82604)). -- Make gizmo plugin handle `SpriteBase3D` instead of `Sprite3D` ([GH-82901](https://github.com/godotengine/godot/pull/82901)). -- Enable UV2 on primitive meshes when using the MeshInstance3D context menu ([GH-82937](https://github.com/godotengine/godot/pull/82937)). -- Add an editor tool to automatically upgrade and re-save meshes ([GH-83613](https://github.com/godotengine/godot/pull/83613)). -- Fix some `Node3DEditor` snapping issues ([GH-84049](https://github.com/godotengine/godot/pull/84049)). -- Fix PlaneMesh tangents for 'Face X' orientation ([GH-84097](https://github.com/godotengine/godot/pull/84097)). -- Hide CSGShape's `debug_collision_shape` when it is invisible ([GH-84174](https://github.com/godotengine/godot/pull/84174)). +- Fix PathFollow3D update issues ([GH-80233](https://github.com/godotengine/godot/pull/80233)). +- Make ShaderMaterial always the last option in inspector resource dropdowns ([GH-81996](https://github.com/godotengine/godot/pull/81996)). +- Prompt require editor restart to user when gizmo color changed ([GH-82872](https://github.com/godotengine/godot/pull/82872)). +- Reduce minimum capsule/cylinder mesh rings to 0 ([GH-82887](https://github.com/godotengine/godot/pull/82887)). +- Expose 3D Delaunay tetrahedralization in `Geometry3D` ([GH-83353](https://github.com/godotengine/godot/pull/83353)). +- Improve Curve3D debug drawing ([GH-83698](https://github.com/godotengine/godot/pull/83698)). +- Optimize Path3DGizmo mesh generation ([GH-83741](https://github.com/godotengine/godot/pull/83741)). +- Use screen-aligned quads for origin lines to avoid issues on NVidia ([GH-83895](https://github.com/godotengine/godot/pull/83895)). +- Select newly added nodes on drag and drop in 3D viewport ([GH-84347](https://github.com/godotengine/godot/pull/84347)). +- Fix material drag and drop ([GH-84486](https://github.com/godotengine/godot/pull/84486)). +- Fix `Node3D` children using `top_level` in different position in-editor versus runtime ([GH-84643](https://github.com/godotengine/godot/pull/84643)). +- Only allow MeshInstance3D-inherited nodes in MultiMesh Populate Surface dialog ([GH-84933](https://github.com/godotengine/godot/pull/84933)). +- Notify CSGPolygon about transform changes in Path3D ([GH-85455](https://github.com/godotengine/godot/pull/85455)). +- Prevent `Camera3D.current` from being set to `true` automatically in the editor ([GH-85594](https://github.com/godotengine/godot/pull/85594)). +- Add static body creation equivalent for all collision shape sibling creations ([GH-86627](https://github.com/godotengine/godot/pull/86627)). +- Clarify the FOV setting in the 3D editor camera is vertical FOV ([GH-86690](https://github.com/godotengine/godot/pull/86690)). +- Fix AABB Ray intersection - return inside ([GH-86755](https://github.com/godotengine/godot/pull/86755)). +- Prevent division by 0 when creating vertices of a PrismMesh ([GH-86931](https://github.com/godotengine/godot/pull/86931)). +- Use SceneStringNames in Skeleton3DEditorPlugin ([GH-87048](https://github.com/godotengine/godot/pull/87048)). +- Fix position and basis of 3D Scenes instantiated via drag and drop ([GH-87126](https://github.com/godotengine/godot/pull/87126)). +- Properly change GridMap floors while selecting ([GH-87131](https://github.com/godotengine/godot/pull/87131)). +- Do not commit transforms and handles if no changes were made ([GH-87161](https://github.com/godotengine/godot/pull/87161)). +- Rename camera `near` and `far` private members to avoid conflict with `Windows.h` defines ([GH-87164](https://github.com/godotengine/godot/pull/87164)). +- Show warning for GeometryInstance3D transparency in Mobile/Compatibility ([GH-87231](https://github.com/godotengine/godot/pull/87231)). +- Make viewport message dependent on framerate not physics step ([GH-87631](https://github.com/godotengine/godot/pull/87631)). +- Fix a regression that breaks gizmo transforming when 'View Gizmos' is off ([GH-87769](https://github.com/godotengine/godot/pull/87769)). +- Use subgizmos for Path3D position editing and declutter the UI ([GH-87901](https://github.com/godotengine/godot/pull/87901)). +- Fix a regression when multiple nodes are selected and drag transform is attempted w/o gizmo ([GH-87922](https://github.com/godotengine/godot/pull/87922)). +- Fix new region select with selection when over geometry ([GH-87948](https://github.com/godotengine/godot/pull/87948)). +- Show modifier key functionality on all the editor tools ([GH-87989](https://github.com/godotengine/godot/pull/87989)). +- Add ability to hide grid per viewport ([GH-88584](https://github.com/godotengine/godot/pull/88584)). +- Fix 3D editor project settings update ([GH-88645](https://github.com/godotengine/godot/pull/88645)). +- Show instantiating message with position when using to drag to instantiate in 3D ([GH-88774](https://github.com/godotengine/godot/pull/88774)). +- Include tangent in SurfaceTool vertex compare operator ([GH-88890](https://github.com/godotengine/godot/pull/88890)). +- Don't access Node3D/Node2D/Control global transform in `reparent` unless needed ([GH-89003](https://github.com/godotengine/godot/pull/89003)). +- Make `Label3D` obey auto translation ([GH-89056](https://github.com/godotengine/godot/pull/89056)). +- Expose PrimitiveMesh's `request_update` method ([GH-89170](https://github.com/godotengine/godot/pull/89170)). +- Match #89126 for 3D: check for `Resource` type instead of extension ([GH-89177](https://github.com/godotengine/godot/pull/89177)). +- Use 3D editor gizmo helper for FogVolume to allow dragging individual faces ([GH-89320](https://github.com/godotengine/godot/pull/89320)). +- GLTF export: Remove snapping and fix validation ([GH-89352](https://github.com/godotengine/godot/pull/89352)). +- GLTF export: Use sparse accessors for morph targets ([GH-89356](https://github.com/godotengine/godot/pull/89356)). +- Disable all 3D nodes, physics, and resources when compiling without 3D ([GH-89381](https://github.com/godotengine/godot/pull/89381)). +- Add Gizmo to display 3D custom AABB ([GH-89538](https://github.com/godotengine/godot/pull/89538)). +- UX and stability improvements for `Path3D` node ([GH-89847](https://github.com/godotengine/godot/pull/89847)). +- Fix Path3D picking working incorrectly when viewport is in half resolution ([GH-89901](https://github.com/godotengine/godot/pull/89901)). +- Support "clear points" function in Path3D topmenu bar ([GH-89933](https://github.com/godotengine/godot/pull/89933)). +- Allow wrapping for begin rotate transformation to bring it in line with Blender ([GH-90098](https://github.com/godotengine/godot/pull/90098)). +- Allow drag and dropping ShaderMaterial in 3D viewport ([GH-90102](https://github.com/godotengine/godot/pull/90102)). +- Fix gizmo on top material option having no effect ([GH-90183](https://github.com/godotengine/godot/pull/90183)). +- Fix 3d axes flickering in the negative direction when extremely zoomed out ([GH-90255](https://github.com/godotengine/godot/pull/90255)). +- Fix `Node3D.set_global_rotation()` resetting node scale ([GH-90584](https://github.com/godotengine/godot/pull/90584)). +- Fix `RayCast3D`'s debug draw transform not updating ([GH-90800](https://github.com/godotengine/godot/pull/90800)). +- Expose `create_from_arrays` in SurfaceTool and cleanup some naming ([GH-90834](https://github.com/godotengine/godot/pull/90834)). +- Subscribe to correct tracker signals ([GH-91031](https://github.com/godotengine/godot/pull/91031)). +- Fix `Path3D` tilt gizmo raycasting against local plane ([GH-91109](https://github.com/godotengine/godot/pull/91109)). +- Simplify the GPUParticles3D editor gizmo to improve readability ([GH-91226](https://github.com/godotengine/godot/pull/91226)). +- Add MultiNodeEdit support to MeshInstance3D editor ([GH-91620](https://github.com/godotengine/godot/pull/91620)). +- Disallow selection of ownerless nodes ([GH-92188](https://github.com/godotengine/godot/pull/92188)). +- Fix bounding box glitch ([GH-92275](https://github.com/godotengine/godot/pull/92275)). +- Fix null `debug_shape` being updated when `CollisionObject3D`'s transform changed ([GH-92302](https://github.com/godotengine/godot/pull/92302)). +- Make CSG shape dirty after changing Snap ([GH-93242](https://github.com/godotengine/godot/pull/93242)). +- Improve `SurfaceTool::generate_tangents` UV error message ([GH-93326](https://github.com/godotengine/godot/pull/93326)). +- Fix invalid inheritance of `OccluderInstance3D` ([GH-93354](https://github.com/godotengine/godot/pull/93354)). +- Fix Subviewport keeps using removed Camera3D child ([GH-93377](https://github.com/godotengine/godot/pull/93377)). +- Fix crash in Node3DEditorViewport selecting on empty scene ([GH-93404](https://github.com/godotengine/godot/pull/93404)). +- Improve viewport rotation gizmo drawing ([GH-93639](https://github.com/godotengine/godot/pull/93639)). +- Add alternative shortcut for Align Transform to View in the 3D editor ([GH-93675](https://github.com/godotengine/godot/pull/93675)). +- Fix "selectable nodes at position clicked" feature in 3D editor ([GH-94387](https://github.com/godotengine/godot/pull/94387)). #### Animation -- Skip keyframe creation dialog when holding Shift in the animation editor ([GH-54524](https://github.com/godotengine/godot/pull/54524)). -- Allow changing imported AnimationLibrary names in AnimationPlayer in the editor ([GH-67965](https://github.com/godotengine/godot/pull/67965)). -- Add animation playback preview to scene import settings ([GH-76367](https://github.com/godotengine/godot/pull/76367)). -- Additional cleanup of bone editors ([GH-77096](https://github.com/godotengine/godot/pull/77096)). -- Add `TileSetAtlasSource::TileAnimationMode` options and allow to shuffle tile animations ([GH-77257](https://github.com/godotengine/godot/pull/77257)). -- Include animation frames in tile atlas merge ([GH-77316](https://github.com/godotengine/godot/pull/77316)). -- Fix infinite loop state check in `AnimationStateMachine` ([GH-79141](https://github.com/godotengine/godot/pull/79141)). -- Add 3.x compatibility for animation loop mode ([GH-79155](https://github.com/godotengine/godot/pull/79155)). -- Fix `Animation::subtract_variant` for affine transforms ([GH-79279](https://github.com/godotengine/godot/pull/79279)). -- Fix `AnimationNodeTransition` with negative time scale ([GH-79403](https://github.com/godotengine/godot/pull/79403)). -- Fix `tween_property` on `Basis` to properly update its value ([GH-79426](https://github.com/godotengine/godot/pull/79426)). -- Fix the error when clicking AnimationTree in the editor ([GH-79588](https://github.com/godotengine/godot/pull/79588)). -- Make `AnimationNodeBlendTree` use `RBMap` instead `HashMap` ([GH-79595](https://github.com/godotengine/godot/pull/79595)). -- Fix rename animation in SpriteFramesEditor ([GH-79600](https://github.com/godotengine/godot/pull/79600)). -- SpriteFrames Editor: Fix FPS applied to two animations when switching animation ([GH-79692](https://github.com/godotengine/godot/pull/79692)). -- Make animation name list scroll to new animation in `SpriteEditor` ([GH-79743](https://github.com/godotengine/godot/pull/79743)). -- SpriteFrames Editor: Fix Frame Duration applied to wrong frame when switching frame ([GH-79872](https://github.com/godotengine/godot/pull/79872)). -- Improve and clarify paused Tweens ([GH-79879](https://github.com/godotengine/godot/pull/79879)). -- Avoid emitting signals if the animation is not ready to be processed ([GH-80367](https://github.com/godotengine/godot/pull/80367)). -- Fix initial value with delay in PropertyTweener ([GH-80702](https://github.com/godotengine/godot/pull/80702)). -- Ensure methods skipped by `AnimationPlayer::seek` are not called ([GH-80708](https://github.com/godotengine/godot/pull/80708)). -- Implement `AnimationMixer` as a base class of `AnimationPlayer` and `AnimationTree` ([GH-80813](https://github.com/godotengine/godot/pull/80813)). -- Revive onion skinning ([GH-80939](https://github.com/godotengine/godot/pull/80939)). -- Prevent errors if Tween callback's object is freed ([GH-81127](https://github.com/godotengine/godot/pull/81127)). -- Select node when clicked in AnimationPlayer timeline ([GH-81188](https://github.com/godotengine/godot/pull/81188)). -- Fix incorrect cast when animating `int` ([GH-81296](https://github.com/godotengine/godot/pull/81296)). -- Fix animation keyframes being skipped when played backwards ([GH-81452](https://github.com/godotengine/godot/pull/81452)). -- Check if property exists before tweening ([GH-81525](https://github.com/godotengine/godot/pull/81525)). -- Ignore method track when drawing line between keys ([GH-81563](https://github.com/godotengine/godot/pull/81563)). -- Hide animation toolbar above the viewport correctly when switching scenes ([GH-81606](https://github.com/godotengine/godot/pull/81606)). -- Defer updating the animations Tree in SpriteFramesEditor to avoid crashes ([GH-81643](https://github.com/godotengine/godot/pull/81643)). -- SceneTreeDock: Remove animation tracks with correct indices ([GH-81651](https://github.com/godotengine/godot/pull/81651)). -- Fix BoneAttachment3D signal connection ([GH-81695](https://github.com/godotengine/godot/pull/81695)). -- Fix crash when clicking on "Interpolation Mode" with nonexistent node path ([GH-81779](https://github.com/godotengine/godot/pull/81779)). -- Improve retarget auto-mapping algorithm ([GH-81843](https://github.com/godotengine/godot/pull/81843)). -- Fix theme access and improve UX in AnimationTree editor ([GH-82210](https://github.com/godotengine/godot/pull/82210)). -- Fix `SkeletonIK3D` editor preview when changing active node ([GH-82391](https://github.com/godotengine/godot/pull/82391)). -- Reimport bone attachment fixes ([GH-82471](https://github.com/godotengine/godot/pull/82471)). -- Fix "Some nodes are referenced by animation tracks" when deleting instance ([GH-82486](https://github.com/godotengine/godot/pull/82486)). -- Fix GroupedStateMachine reset ([GH-82563](https://github.com/godotengine/godot/pull/82563)). -- Fix crash when deleting the player in `AnimationPlayerEditorPlugin` ([GH-82573](https://github.com/godotengine/godot/pull/82573)). -- Limit animation audio clip inspector offset sliders to clip length ([GH-82627](https://github.com/godotengine/godot/pull/82627)). -- Tweak AnimationPlayer speed scale property hint to make dragging more useful ([GH-82641](https://github.com/godotengine/godot/pull/82641)). -- Fix `AnimationPlayer::play()` process unwanted start between the same animations ([GH-82898](https://github.com/godotengine/godot/pull/82898)). -- AnimationMixer: Fix non-numeric misc type (`Resource`, `Dictionary` & etc.) values cannot be blended with `UpdateMode.UPDATE_CONTINUOUS` ([GH-83030](https://github.com/godotengine/godot/pull/83030)). -- Move animation slice processing to `_post_fix_animations` ([GH-83036](https://github.com/godotengine/godot/pull/83036)). -- Set new SkeletonRestFixer tracks as imported ([GH-83076](https://github.com/godotengine/godot/pull/83076)). -- Fix editor crash when re-importing GLTF while animation is playing ([GH-83104](https://github.com/godotengine/godot/pull/83104)). -- Show AnimationMixer warning for non-numeric types only when relevant ([GH-83417](https://github.com/godotengine/godot/pull/83417)). -- Fix onion skinning internals activating audio/method/animation tracks ([GH-83430](https://github.com/godotengine/godot/pull/83430)). -- Remove AnimationMixer bindings only bound in the editor ([GH-83440](https://github.com/godotengine/godot/pull/83440)). -- Re-add close button for nodes in `AnimationNodeBlendTree` editor ([GH-83507](https://github.com/godotengine/godot/pull/83507)). -- Automatic reconnection of nodes in blend tree ([GH-83534](https://github.com/godotengine/godot/pull/83534)). -- Add vertical scrolling to bézier track editor ([GH-83776](https://github.com/godotengine/godot/pull/83776)). -- Ensure AnimationPlayer evaluate animations when autoplay is enabled and node becomes ready ([GH-83781](https://github.com/godotengine/godot/pull/83781)). -- Fix animation track paths updated by scene dock ([GH-83934](https://github.com/godotengine/godot/pull/83934)). -- Unpress buttons in AnimationTree when switching to read-only mode ([GH-84052](https://github.com/godotengine/godot/pull/84052)). -- Fix invalid return from some more `_get/_set` ([GH-84060](https://github.com/godotengine/godot/pull/84060)). -- Add descriptive warning for animation track hint fails ([GH-84129](https://github.com/godotengine/godot/pull/84129)). -- Fix AnimationTimeline time not updating when dragged ([GH-84170](https://github.com/godotengine/godot/pull/84170)). -- Avoid popping up dialogs excessively in the Animation editor ([GH-84208](https://github.com/godotengine/godot/pull/84208)). -- Fix perform_node_renames handling of AnimationMixers track paths ([GH-84282](https://github.com/godotengine/godot/pull/84282)). -- Unexpose internal data property of `AnimationLibrary` ([GH-84376](https://github.com/godotengine/godot/pull/84376)). -- Add `PackedArray` to the list of enforcing `Discrete` for `AnimationMixer` ([GH-84390](https://github.com/godotengine/godot/pull/84390)). -- Fix RESET not effective when saving inactive scene ([GH-84405](https://github.com/godotengine/godot/pull/84405)). -- Change AnimationLibEditor's mixer to actual Mixer ([GH-84551](https://github.com/godotengine/godot/pull/84551)). -- Remove AnimatedSprite pointer when clearing editor ([GH-84625](https://github.com/godotengine/godot/pull/84625)). -- Rework blending method in `Variant` animation for `Int`/`Array`/`String` ([GH-84815](https://github.com/godotengine/godot/pull/84815)). -- Fix ValueTrack with Resource is leaking ([GH-84942](https://github.com/godotengine/godot/pull/84942)). -- Fix seeking bug in AnimationPlayerEditor ([GH-85193](https://github.com/godotengine/godot/pull/85193)). -- Clear seeked/started flag after seeking/advancing in AnimationPlayer ([GH-85221](https://github.com/godotengine/godot/pull/85221)). -- Bind `_reset`/`_restore` in AnimationMixer ([GH-85254](https://github.com/godotengine/godot/pull/85254)). -- Fix TrackCache memory crash ([GH-85266](https://github.com/godotengine/godot/pull/85266)). -- Perform safe copies in `AnimatedValuesBackup::get_cache_copy()` ([GH-85302](https://github.com/godotengine/godot/pull/85302)). -- Fix a crash when trying to restore uncopyable animation tracks ([GH-85308](https://github.com/godotengine/godot/pull/85308)). -- Check the seeking if it is processed immediately after playback as a special case ([GH-85366](https://github.com/godotengine/godot/pull/85366)). -- Make AnimationPlaybackTrack keep state when stopping ([GH-85411](https://github.com/godotengine/godot/pull/85411)). -- AnimationMixer: Validate ObjectID before blend in case the object was freed ([GH-85461](https://github.com/godotengine/godot/pull/85461)). +- Autocomplete properties in `tween_property` ([GH-76591](https://github.com/godotengine/godot/pull/76591)). +- Add useful functions to `FilterEdit` in `AnimationBlendTreeEditor` ([GH-76654](https://github.com/godotengine/godot/pull/76654)). +- Simplify right-click track insertion code ([GH-80860](https://github.com/godotengine/godot/pull/80860)). +- Fix reset value when adding new Bezier track ([GH-82012](https://github.com/godotengine/godot/pull/82012)). +- Add `set_custom_interpolator()` to PropertyTweener ([GH-82306](https://github.com/godotengine/godot/pull/82306)). +- Refactor function `calculate_length_and_rotation()` from Skeleton2D ([GH-83397](https://github.com/godotengine/godot/pull/83397)). +- Fix setting bezier track handle mode from inspector ([GH-83533](https://github.com/godotengine/godot/pull/83533)). +- Make AnimationPlayerEditor read-only edit rules more permissive ([GH-84268](https://github.com/godotengine/godot/pull/84268)). +- Fix errors and warnings when loading Skeleton2D Modifications ([GH-84474](https://github.com/godotengine/godot/pull/84474)). +- Make AnimationTree reference AnimationPlayer instead of AnimationMixer ([GH-84583](https://github.com/godotengine/godot/pull/84583)). +- Replace memory allocation point of ValueTrack correctly in AnimationMixer ([GH-85001](https://github.com/godotengine/godot/pull/85001)). +- Fix imported track flag on sliced animations ([GH-85061](https://github.com/godotengine/godot/pull/85061)). +- Improve usability of zooming in the animation editor ([GH-85142](https://github.com/godotengine/godot/pull/85142)). +- Fix custom type icon sizes in animation tracks ([GH-85367](https://github.com/godotengine/godot/pull/85367)). +- Prevent a crash when calling `AnimationMixer::restore` with an invalid resource ([GH-85428](https://github.com/godotengine/godot/pull/85428)). +- Add multi-selection for `SpriteFramesEditor` ([GH-85494](https://github.com/godotengine/godot/pull/85494)). +- Copy track update mode when adding reset key ([GH-85540](https://github.com/godotengine/godot/pull/85540)). +- Fix AnimationPlayer seeking for Discrete keys ([GH-85569](https://github.com/godotengine/godot/pull/85569)). +- Make unstore AnimationLibrary if AnimationTree is assigned AnimationPlayer ([GH-85575](https://github.com/godotengine/godot/pull/85575)). +- Fix Tween loop initial value ([GH-85681](https://github.com/godotengine/godot/pull/85681)). +- Remove differences of the code between old AnimationTree and AnimationMixer ([GH-85794](https://github.com/godotengine/godot/pull/85794)). +- Fix linear interpolation not working with mixed (int/float) keyframes ([GH-86046](https://github.com/godotengine/godot/pull/86046)). +- Fix animated tile random start time not scaled to animation duration ([GH-86210](https://github.com/godotengine/godot/pull/86210)). +- Make default `blend_left` consider current blend amount ([GH-86221](https://github.com/godotengine/godot/pull/86221)). +- Fix discrete key retrieval method after start ([GH-86227](https://github.com/godotengine/godot/pull/86227)). +- Fix `blend_node` crash with invalid AnimationNode reference ([GH-86321](https://github.com/godotengine/godot/pull/86321)). +- Add `cubic_interpolate_in_time_variant()` to Animation ([GH-86601](https://github.com/godotengine/godot/pull/86601)). +- Add some options to Project Settings to silence warnings in AnimationMixer caching ([GH-86608](https://github.com/godotengine/godot/pull/86608)). +- Add a `CallbackModeDiscrete` property to `AnimationMixer` to handle the case of blending Continuous and Discrete tracks ([GH-86629](https://github.com/godotengine/godot/pull/86629)). +- Make default options of int value track refer to RESET animation ([GH-86630](https://github.com/godotengine/godot/pull/86630)). +- Fix some animation state corruptions on activate and reset on save ([GH-86644](https://github.com/godotengine/godot/pull/86644)). +- Fix invalid 3-to-4 renames of `add_animation` to `add_animation_library` ([GH-86647](https://github.com/godotengine/godot/pull/86647)). +- Make the retrieval of audio tracks consistent and implement trimming to AnimationTrackEditor shortcut and clean-up ([GH-86661](https://github.com/godotengine/godot/pull/86661)). +- Fix TrackCache conflict when tracks have same name but different type ([GH-86687](https://github.com/godotengine/godot/pull/86687)). +- Add `AnimationMixer::capture()` and `AnimationPlayer::play_with_capture()` as substitute of update mode capture ([GH-86715](https://github.com/godotengine/godot/pull/86715)). +- Add autocompletion options for AnimatedSprite's other play methods ([GH-86733](https://github.com/godotengine/godot/pull/86733)). +- Add icon, tooltip, rename button in AnimationLibraryEditor for clarity ([GH-86736](https://github.com/godotengine/godot/pull/86736)). +- Add autocompletion for SpriteFrames' methods ([GH-86754](https://github.com/godotengine/godot/pull/86754)). +- Add autocompletion for AnimationLibrary & AnimationMixer's methods ([GH-86799](https://github.com/godotengine/godot/pull/86799)). +- Copy InterpolationType / LoopMode for all track & UseBlend option for audio when adding reset keys ([GH-86867](https://github.com/godotengine/godot/pull/86867)). +- Add Autocompletion for AnimationNodeStateMachine & AnimationNodeBlendTree ([GH-86884](https://github.com/godotengine/godot/pull/86884)). +- Add autocompletion to AnimationNode ([GH-86888](https://github.com/godotengine/godot/pull/86888)). +- Skeleton3D: Convert 3.x skeletons ([GH-87050](https://github.com/godotengine/godot/pull/87050)). +- Add auto fit timeline and bezier scale on animation editor ([GH-87078](https://github.com/godotengine/godot/pull/87078)). +- Rework AnimationNode process for retrieving the semantic time info ([GH-87171](https://github.com/godotengine/godot/pull/87171)). +- Implement consistent functionality for select, copy, paste, and duplicate in AnimationPlayer ([GH-87250](https://github.com/godotengine/godot/pull/87250)). +- Fix passing int to tween's `from` with float property will be forced to interpolate as int ([GH-87459](https://github.com/godotengine/godot/pull/87459)). +- Allow `Node.create_tween()` outside SceneTree ([GH-87701](https://github.com/godotengine/godot/pull/87701)). +- Fix cubic interpolation wrong argument for the time ([GH-87772](https://github.com/godotengine/godot/pull/87772)). +- Fix quaternion keyframe optimization for collinear rotation over 180 degrees ([GH-87817](https://github.com/godotengine/godot/pull/87817)). +- Fix vertical zoom factor in Animation Bezier Editor ([GH-87857](https://github.com/godotengine/godot/pull/87857)). +- Fix unintentional translations in AnimationTree ([GH-87887](https://github.com/godotengine/godot/pull/87887)). +- Implement a base class `SkeletonModifier3D` as refactoring for nodes that may modify `Skeleton3D` ([GH-87888](https://github.com/godotengine/godot/pull/87888)). +- Fix converted 3.x `Skeleton3D` missing pose ([GH-88009](https://github.com/godotengine/godot/pull/88009)). +- Fix wrongly named compat binding ([GH-88110](https://github.com/godotengine/godot/pull/88110)). +- Improve AnimationMixer warnings ([GH-88247](https://github.com/godotengine/godot/pull/88247)). +- Remove unused signals in AnimationBezierTrackEdit ([GH-88302](https://github.com/godotengine/godot/pull/88302)). +- Implement Cut Selected Keys in AnimationPlayer ([GH-88350](https://github.com/godotengine/godot/pull/88350)). +- Fix Bezier Editor HandleMode UndoRedo History mismatch ([GH-88352](https://github.com/godotengine/godot/pull/88352)). +- Fix Bezier Editor throwing error when adding key with Ctrl+Click ([GH-88360](https://github.com/godotengine/godot/pull/88360)). +- Fix various bugs in Animation key right click actions ([GH-88445](https://github.com/godotengine/godot/pull/88445)). +- Fix crash with animation audio track offset ([GH-88446](https://github.com/godotengine/godot/pull/88446)). +- Fix Animation Bezier Editor key selection bugs ([GH-88459](https://github.com/godotengine/godot/pull/88459)). +- Fix some conditions for BezierTrack to distinguish between ValueTrack ([GH-88488](https://github.com/godotengine/godot/pull/88488)). +- Make `ANIMATION_CALLBACK_MODE_DISCRETE_DOMINANT` be default for AnimationPlayer ([GH-88492](https://github.com/godotengine/godot/pull/88492)). +- Fix snapping multiple keys in Animation ([GH-88498](https://github.com/godotengine/godot/pull/88498)). +- Fix AnimationMixer breaking animations with redundant check ([GH-88557](https://github.com/godotengine/godot/pull/88557)). +- Force non-numeric ValueTrack to use Discrete with Dominant ([GH-88661](https://github.com/godotengine/godot/pull/88661)). +- Make `Skeleton3D::add_bone` return the new bone index ([GH-88791](https://github.com/godotengine/godot/pull/88791)). +- Add new scene import option to import as Skeleton ([GH-88819](https://github.com/godotengine/godot/pull/88819)). +- Retargeting option to use a template for silhouette ([GH-88824](https://github.com/godotengine/godot/pull/88824)). +- Improvements to `Tween` memory management ([GH-88856](https://github.com/godotengine/godot/pull/88856)). +- Fix `BoneAttachment3D` responding to only local transform changes ([GH-88884](https://github.com/godotengine/godot/pull/88884)). +- Fix animation player error dialog focus ([GH-88926](https://github.com/godotengine/godot/pull/88926)). +- Fix wrong line of making flag to discrete in AnimationMixer ([GH-89329](https://github.com/godotengine/godot/pull/89329)). +- Make AnimationMixer consider Discrete for RESET track ([GH-89389](https://github.com/godotengine/godot/pull/89389)). +- Move the line of infinity loop checking in AnimationStateMachine ([GH-89575](https://github.com/godotengine/godot/pull/89575)). +- Add option to import skeleton rest as RESET animation ([GH-89629](https://github.com/godotengine/godot/pull/89629)). +- Fix AnimationPlayer pin behavior ([GH-89732](https://github.com/godotengine/godot/pull/89732)). +- Fix SpriteFrames editor visibility problems ([GH-89754](https://github.com/godotengine/godot/pull/89754)). +- Fix AnimationPlaybackTrack seeking behavior overall ([GH-89794](https://github.com/godotengine/godot/pull/89794)). +- Expose `SkeletonProfile.set/is_required` ([GH-89970](https://github.com/godotengine/godot/pull/89970)). +- Fix setting animation save paths on import breaking on Windows ([GH-90003](https://github.com/godotengine/godot/pull/90003)). +- Fix loop condition in bone mapping ([GH-90019](https://github.com/godotengine/godot/pull/90019)). +- Add tips detection to auto mapping in bone mapper ([GH-90050](https://github.com/godotengine/godot/pull/90050)). +- Apply "Remove Immutable Tracks" after post-import ([GH-90064](https://github.com/godotengine/godot/pull/90064)). +- Remove unavailable property binding `reset_on_save` from Skeleton3D ([GH-90231](https://github.com/godotengine/godot/pull/90231)). +- Fix Skeleton3D build error with `deprecated=no` ([GH-90308](https://github.com/godotengine/godot/pull/90308)). +- Separate value/bezier track caching process in AnimationMixer ([GH-90438](https://github.com/godotengine/godot/pull/90438)). +- Static allocation bones copy for SkeletonModifier ([GH-90517](https://github.com/godotengine/godot/pull/90517)). +- Remove `bone_pose_updated` signal and replace it with the `skeleton_updated` signal ([GH-90575](https://github.com/godotengine/godot/pull/90575)). +- Add SkeletonIK3D `get`/`set_interpolation` compat from #87888 ([GH-90780](https://github.com/godotengine/godot/pull/90780)). +- Set animation step from importers. Increase default step from 10 to 30FPS ([GH-90894](https://github.com/godotengine/godot/pull/90894)). +- Make seeking animation playback track consider internal seeking ([GH-90960](https://github.com/godotengine/godot/pull/90960)). +- Modify allocation process of the PhysicalBoneSimulator in Skeleton3D ([GH-91122](https://github.com/godotengine/godot/pull/91122)). +- Make adding track process to set interpolation type on creating RESET ([GH-91237](https://github.com/godotengine/godot/pull/91237)). +- Make activating on ready in AnimationPlayer respect the property value ([GH-91242](https://github.com/godotengine/godot/pull/91242)). +- Add `auto_capture` option to AnimationPlayer ([GH-91437](https://github.com/godotengine/godot/pull/91437)). +- Add argument options to AnimationPlayer for auto capture ([GH-91481](https://github.com/godotengine/godot/pull/91481)). +- Avoid incorrect computing anchor of Control node when reset on save with `saving` flag ([GH-91495](https://github.com/godotengine/godot/pull/91495)). +- Allow users to override `SkeletonModifier3D._process_modification` ([GH-91507](https://github.com/godotengine/godot/pull/91507)). +- Editor: Don't open `AnimationLibrary` as a scene ([GH-91522](https://github.com/godotengine/godot/pull/91522)). +- Make retarget keep global rest of unmapped bones if there are no mapped bones on the child ([GH-91560](https://github.com/godotengine/godot/pull/91560)). +- Make silhouette fixer option visibility dependent on availability ([GH-91641](https://github.com/godotengine/godot/pull/91641)). +- Invert start offset on AnimationNode custom timeline ([GH-91822](https://github.com/godotengine/godot/pull/91822)). +- Fix errors on pressing autoplay in sprite frames editor ([GH-91830](https://github.com/godotengine/godot/pull/91830)). +- Fix wrong usage of `parameters_base_path` StringName ([GH-91944](https://github.com/godotengine/godot/pull/91944)). +- Skeleton rest fixer: Apply orthonormalized scale to anims ([GH-92012](https://github.com/godotengine/godot/pull/92012)). +- Fix Deterministic blending with Dominant/Recessive doesn't have initial value even if there is no Discrete track ([GH-92126](https://github.com/godotengine/godot/pull/92126)). +- Replace List with LocalVector on Skeleton3D's bone transform update ([GH-92164](https://github.com/godotengine/godot/pull/92164)). +- Support Import As Skeleton Bones on glTF and AnimationLibrary import ([GH-92196](https://github.com/godotengine/godot/pull/92196)). +- Fix mesh instance not updated when changing blend shape values ([GH-92244](https://github.com/godotengine/godot/pull/92244)). +- Add `bake_fps` for FBXDocument, GLTFDocument and both import-export ([GH-92284](https://github.com/godotengine/godot/pull/92284)). +- Fix animation player controls being enabled when no player is selected ([GH-92473](https://github.com/godotengine/godot/pull/92473)). +- Fix error after create a new animation in an empty AnimationPlayer ([GH-92495](https://github.com/godotengine/godot/pull/92495)). +- Add blend point check to `AnimationNodeBlendSpace2D::_process()` ([GH-92636](https://github.com/godotengine/godot/pull/92636)). +- Fix unstable AnimationTrackEditor snapping value ([GH-92670](https://github.com/godotengine/godot/pull/92670)). +- Fix BlendSpace2D sync flagging line ([GH-92739](https://github.com/godotengine/godot/pull/92739)). +- Fix shader for SkeletonGizmo to follow renderer's reversed-z change ([GH-92774](https://github.com/godotengine/godot/pull/92774)). +- Fix seeking Animation immediately after playback for Discrete track ([GH-92861](https://github.com/godotengine/godot/pull/92861)). +- Don't allow creating invalid RESET keys ([GH-92870](https://github.com/godotengine/godot/pull/92870)). +- Expose `get_skeleton()` from `SkeletonModifier3D` ([GH-92896](https://github.com/godotengine/godot/pull/92896)). +- Add `get_concatenated_bone_names()` to `Skeleton3D` for `SkeletonModifier3D`'s enum hints ([GH-92925](https://github.com/godotengine/godot/pull/92925)). +- Fix unbound child bones of the PhysicalBone aren't modified ([GH-92931](https://github.com/godotengine/godot/pull/92931)). +- Restore "Confirm Insert Track" editor setting ([GH-92985](https://github.com/godotengine/godot/pull/92985)). +- Fix force continuous with un-interpolatable value is not applied correctly ([GH-93185](https://github.com/godotengine/godot/pull/93185)). +- AnimationTrackEdit: Cancel key drag when popup is shown ([GH-93257](https://github.com/godotengine/godot/pull/93257)). +- Fix displaying selected Bezier animation keys in inspector ([GH-93408](https://github.com/godotengine/godot/pull/93408)). +- Reset when disabling override pose in BoneAttachment3D ([GH-93482](https://github.com/godotengine/godot/pull/93482)). +- Fix animation Bezier editor crash when using undo after deleting AnimationPlayer ([GH-93492](https://github.com/godotengine/godot/pull/93492)). +- Optimize update flag by SkeletonModifier ([GH-93502](https://github.com/godotengine/godot/pull/93502)). +- Rework migration of `animate_physical_bones` for compatibility ([GH-93504](https://github.com/godotengine/godot/pull/93504)). +- Make AnimationTrackCaches invalid when animation is added ([GH-93505](https://github.com/godotengine/godot/pull/93505)). +- Fix `AnimatedSprite2D/3D::play` using wrong `end_frame` when playing backwards ([GH-93548](https://github.com/godotengine/godot/pull/93548)). +- Revert the default InterpolationType with angle property to Linear ([GH-93696](https://github.com/godotengine/godot/pull/93696)). +- Fix Bezier track init value on caching without RESET animation ([GH-93785](https://github.com/godotengine/godot/pull/93785)). +- Fix sprite frame editor crash with null `frames` pointer ([GH-93846](https://github.com/godotengine/godot/pull/93846)). +- Fix inconsistent behavior of Bezier editor undo operations upon selection of different animation ([GH-93860](https://github.com/godotengine/godot/pull/93860)). +- Fix AnimationPlayer `blend_times` sorting ([GH-93876](https://github.com/godotengine/godot/pull/93876)). +- Clamp bezier handle length to half the length of animation ([GH-93930](https://github.com/godotengine/godot/pull/93930)). +- Fix broken sync between animation TrackEditor and PlayerEditor ([GH-93980](https://github.com/godotengine/godot/pull/93980)). +- Fix property type of Sprite3D `frame_coords` to Vector2i from Vector2 ([GH-93982](https://github.com/godotengine/godot/pull/93982)). +- Fix focus shortcut when in the bezier curve editor ([GH-94054](https://github.com/godotengine/godot/pull/94054)). +- Re-add `Skeleton3D::animate_physical_bones` property ([GH-94291](https://github.com/godotengine/godot/pull/94291)). +- Fix the behavior of after selecting animation on AnimationPlayerEditor to reset position to `0` ([GH-94302](https://github.com/godotengine/godot/pull/94302)). +- Fix StateMachine process when transition to end & optimize StringName ([GH-94304](https://github.com/godotengine/godot/pull/94304)). +- Handle internal seek on AnimationPlayer to process discrete correctly ([GH-94420](https://github.com/godotengine/godot/pull/94420)). +- Add approximate comparing static methods to Animation and make Animation code use them ([GH-94554](https://github.com/godotengine/godot/pull/94554)). +- AnimationMixer: Fix `processed_hashes` type to `Animation::TypeHash` instead of `int` ([GH-94722](https://github.com/godotengine/godot/pull/94722)). +- Fix BlendShapeTrack insertion not working ([GH-94738](https://github.com/godotengine/godot/pull/94738)). +- Determine `break_loop_at_end` 1 frame earlier using prediction by delta ([GH-94858](https://github.com/godotengine/godot/pull/94858)). +- Make NodeTimeInfo be not stored in tscn to prevent AnimationTree version control contamination ([GH-94859](https://github.com/godotengine/godot/pull/94859)). +- Snap current position to the edge on animation finished ([GH-95023](https://github.com/godotengine/godot/pull/95023)). +- Fix crash on reimport scene with animations ([GH-95084](https://github.com/godotengine/godot/pull/95084)). +- Make `Skeleton3D` bone simulator an internal child ([GH-95239](https://github.com/godotengine/godot/pull/95239)). +- Make `Animation::capture_included` read-only ([GH-95377](https://github.com/godotengine/godot/pull/95377)). +- Editor: Fix missing bind for animation editor callback ([GH-95400](https://github.com/godotengine/godot/pull/95400)). +- Prevent to seek doubly on AnimationPlayerEditor ([GH-95405](https://github.com/godotengine/godot/pull/95405)). +- Editor: Fix `AnimationTrackEditor::timeline_changed` signal ([GH-95481](https://github.com/godotengine/godot/pull/95481)). #### Assetlib -- Fix long plugin names breaking the UI ([GH-80555](https://github.com/godotengine/godot/pull/80555)). -- Improve handling of archives when installing assets ([GH-81358](https://github.com/godotengine/godot/pull/81358)). -- Allow to specify target folder when installing assets ([GH-81620](https://github.com/godotengine/godot/pull/81620)). +- Improve error reporting in the asset library and in related types ([GH-87628](https://github.com/godotengine/godot/pull/87628)). +- Fix broken layout of asset library page ([GH-88761](https://github.com/godotengine/godot/pull/88761)). +- Rename Official support level to Featured in the editor asset library ([GH-89987](https://github.com/godotengine/godot/pull/89987)). #### Audio -- PulseAudio: Remove `get_latency()` caching ([GH-45152](https://github.com/godotengine/godot/pull/45152)). -- Context aware MIDI event printing ([GH-68820](https://github.com/godotengine/godot/pull/68820)). -- Add build option to enable MP1 and MP2 support in minimp3 ([GH-72729](https://github.com/godotengine/godot/pull/72729)). -- Add a `--audio-output-latency` command-line argument ([GH-78013](https://github.com/godotengine/godot/pull/78013)). -- Implement loading OGG files from buffer and file path ([GH-78084](https://github.com/godotengine/godot/pull/78084)). -- Simpler default values for AudioStreamRandomizer ([GH-80171](https://github.com/godotengine/godot/pull/80171)). -- Fix OGG audio loop offset pop ([GH-80452](https://github.com/godotengine/godot/pull/80452)). -- Add project settings for AVAudioSessionCategory on iOS ([GH-81196](https://github.com/godotengine/godot/pull/81196)). -- Remove some dead declarations in `audio_stream_player.h` ([GH-81485](https://github.com/godotengine/godot/pull/81485)). -- Fix audio stream generators getting freed accidentally ([GH-81508](https://github.com/godotengine/godot/pull/81508)). -- Add a `bus_renamed` AudioServer signal ([GH-81641](https://github.com/godotengine/godot/pull/81641)). -- Only warn once about OGG seeking issues ([GH-81704](https://github.com/godotengine/godot/pull/81704)). -- Tweak property order in the inspector for AudioStreamRandomizer ([GH-82411](https://github.com/godotengine/godot/pull/82411)). -- Fix `AudioStreamRandomizer.random_volume_offset_db` not working ([GH-82478](https://github.com/godotengine/godot/pull/82478)). -- Fix pausing stream on entering tree ([GH-83779](https://github.com/godotengine/godot/pull/83779)). -- Fix OGG Vorbis infinite error spam with corrupt file ([GH-84723](https://github.com/godotengine/godot/pull/84723)). +- Add interactive music support ([GH-64488](https://github.com/godotengine/godot/pull/64488)). +- Overhaul AudioStreamPlayer's documentation ([GH-81858](https://github.com/godotengine/godot/pull/81858)). +- Fix importing WAV files with odd chunk sizes ([GH-85556](https://github.com/godotengine/godot/pull/85556)). +- Fix permanently selected audio bus effects ([GH-85879](https://github.com/godotengine/godot/pull/85879)). +- Fix `OggPacketSequencePlayback::next_ogg_packet()` never returning false ([GH-85996](https://github.com/godotengine/godot/pull/85996)). +- Implement audio stream playback parameters ([GH-86473](https://github.com/godotengine/godot/pull/86473)). +- Optimize `AudioServer::_driver_process()` ([GH-86581](https://github.com/godotengine/godot/pull/86581)). +- Fix `AudioServer::start_playback_stream` does not iterate through given bus volumes ([GH-86584](https://github.com/godotengine/godot/pull/86584)). +- Add autocompletion for ClassDB & AudioServer ([GH-86777](https://github.com/godotengine/godot/pull/86777)). +- Fix playback position label update in Audio Stream Importer ([GH-86824](https://github.com/godotengine/godot/pull/86824)). +- Fix member names of `AudioFrame` to match extension ([GH-87006](https://github.com/godotengine/godot/pull/87006)). +- Fix Dummy audio driver initialization issue on WASAPI output device initialization failure ([GH-87010](https://github.com/godotengine/godot/pull/87010)). +- Add AudioStreamPlayerInternal to unify stream players ([GH-87061](https://github.com/godotengine/godot/pull/87061)). +- Fix a possible crash when importing an OGG file with zero-length packets ([GH-87246](https://github.com/godotengine/godot/pull/87246)). +- Fix AudioStreamPlayer3D autoplay and internal notifications ([GH-87732](https://github.com/godotengine/godot/pull/87732)). +- Fix wrong process method in AudioStreamPlayer ([GH-87830](https://github.com/godotengine/godot/pull/87830)). +- Fix data race regarding `prof_time` in `AudioDriver` and `AudioServer` ([GH-88005](https://github.com/godotengine/godot/pull/88005)). +- AudioEffectPitchShift: Prevent negative size memset (GCC warning) ([GH-88509](https://github.com/godotengine/godot/pull/88509)). +- AudioEffectPitchShift: Actually fix `-Wstringop-overflow warning` ([GH-88658](https://github.com/godotengine/godot/pull/88658)). +- Fix low volume sound output on iOS when Play and Record category is used ([GH-89006](https://github.com/godotengine/godot/pull/89006)). +- WAV importer: Use cubic interpolation on resampler ([GH-89071](https://github.com/godotengine/godot/pull/89071)). +- Add AudioEffectHardLimiter as a rework of audio limiter effect ([GH-89088](https://github.com/godotengine/godot/pull/89088)). +- Fix audio crackling issues due to incorrect WASAPI buffer size ([GH-89283](https://github.com/godotengine/godot/pull/89283)). +- Prevent crash in interactive playback ([GH-90481](https://github.com/godotengine/godot/pull/90481)). +- Move MIDI parsing up from ALSA driver to platform independent driver ([GH-90485](https://github.com/godotengine/godot/pull/90485)). +- Check for NaN in `set_volume_db` functions ([GH-90861](https://github.com/godotengine/godot/pull/90861)). +- Add QOA (Quite OK Audio) as a WAV compression mode ([GH-91014](https://github.com/godotengine/godot/pull/91014)). +- Don't ignore `audio/driver/output_latency.web` ([GH-91141](https://github.com/godotengine/godot/pull/91141)). +- Add sample playback support for Web exports ([GH-91382](https://github.com/godotengine/godot/pull/91382)). +- Use data length on QOA checks instead of min size ([GH-91714](https://github.com/godotengine/godot/pull/91714)). +- Fix error in AudioStreamPlayer2D ([GH-91929](https://github.com/godotengine/godot/pull/91929)). +- Use COM smart pointers in WASAPI driver ([GH-91975](https://github.com/godotengine/godot/pull/91975)). +- Fix polyphonic audio streams with id > 1 cannot be stopped or changed (MSVC mis-optimization) ([GH-93120](https://github.com/godotengine/godot/pull/93120)). +- Fix pausing issues when using Web Audio samples ([GH-93362](https://github.com/godotengine/godot/pull/93362)). +- Remove superfluous non-working sample playing check ([GH-93428](https://github.com/godotengine/godot/pull/93428)). +- Add vertical separation to audio bus ([GH-93507](https://github.com/godotengine/godot/pull/93507)). +- Fix Web samples finished missing signal ([GH-94044](https://github.com/godotengine/godot/pull/94044)). +- Fix audio samples not being able to be "finished" ([GH-94268](https://github.com/godotengine/godot/pull/94268)). +- Fix new stream types `mix()` not returning 0 when inactive ([GH-94514](https://github.com/godotengine/godot/pull/94514)). +- Fix typo that prevented samples finishing ([GH-94800](https://github.com/godotengine/godot/pull/94800)). +- Web: Gracefully handle non-finite audio volumes ([GH-94869](https://github.com/godotengine/godot/pull/94869)). +- Expand columns in the audio interactive transition editor ([GH-95134](https://github.com/godotengine/godot/pull/95134)). +- AudioStreamPolyphonic: Implement stopping with sample playback ([GH-95321](https://github.com/godotengine/godot/pull/95321)). #### Buildsystem -- SCons: Add `object_prefix` option ([GH-62652](https://github.com/godotengine/godot/pull/62652)). -- Allow unbundling OpenXR (for Linux distros) ([GH-73443](https://github.com/godotengine/godot/pull/73443)). -- Add a Linux ThreadSanitizer job to CI ([GH-73777](https://github.com/godotengine/godot/pull/73777)). -- libpng: Enable intrinsics on x86/SSE2, ppc64/VSX, and all arm/NEON ([GH-78325](https://github.com/godotengine/godot/pull/78325)). -- Add static check for overzealous .gitignores and fix an example of such ([GH-78908](https://github.com/godotengine/godot/pull/78908)). -- SCons : Add `scu_limit` argument ([GH-78959](https://github.com/godotengine/godot/pull/78959)). -- Linux: Fix build with `use_sowrap=no` and various warnings/errors ([GH-79097](https://github.com/godotengine/godot/pull/79097)). -- Linux: Allow unbundling brotli to use system library ([GH-79101](https://github.com/godotengine/godot/pull/79101)). -- Linux: Link libsquish directly when unbundling, .pc file unreliable ([GH-79105](https://github.com/godotengine/godot/pull/79105)). -- Fix build options configuration for Visual Studio projects ([GH-79238](https://github.com/godotengine/godot/pull/79238)). -- CI: Allow skipping our GHA workflows with `DISABLE_GODOT_CI` variable ([GH-79321](https://github.com/godotengine/godot/pull/79321)). -- Fix `doc_status.py` trying to get removed `version` tag from XML ([GH-79406](https://github.com/godotengine/godot/pull/79406)). -- Have `core_bind.h` Thread type syntax match `core_bind.cpp` ([GH-79466](https://github.com/godotengine/godot/pull/79466)). -- Web: Use `fvisibility=hidden` for side module when `dlink_enabled` ([GH-79578](https://github.com/godotengine/godot/pull/79578)). -- Header formatting commits to `.git-blame-ignore-revs` ([GH-79615](https://github.com/godotengine/godot/pull/79615)). -- Fix gcc builds failing on Windows ([GH-79724](https://github.com/godotengine/godot/pull/79724)). -- Windows: Try using objcopy and strip with prefix and without prefix ([GH-79871](https://github.com/godotengine/godot/pull/79871)). -- CI: Extract godot-cpp testing into its own job ([GH-80091](https://github.com/godotengine/godot/pull/80091)). -- CI: Free disk space on Linux runners ([GH-80115](https://github.com/godotengine/godot/pull/80115)). -- CI: Compare API compatibility against both 4.0 and 4.1 ([GH-80354](https://github.com/godotengine/godot/pull/80354)). -- Suppress NavigationServer race conditions ([GH-80392](https://github.com/godotengine/godot/pull/80392)). -- Fix API validation script on macOS ([GH-80471](https://github.com/godotengine/godot/pull/80471)). -- SCons: Disable misbehaving MSVC incremental linking ([GH-80482](https://github.com/godotengine/godot/pull/80482)). -- SCons: Carry over the `windows_subsystem` setting to the generated vsproj ([GH-80547](https://github.com/godotengine/godot/pull/80547)). -- SCons: Disable C++ exception handling ([GH-80612](https://github.com/godotengine/godot/pull/80612)). -- Fix GCC `-Wmaybe-uninitialized` warnings ([GH-80615](https://github.com/godotengine/godot/pull/80615)). -- SCons: Enable `/WX` on LINKFLAGS for MSVC with `werror=yes` ([GH-80711](https://github.com/godotengine/godot/pull/80711)). -- SCons: Make ktx module require basis_universal ([GH-80789](https://github.com/godotengine/godot/pull/80789)). -- Windows: Add main executable to the console wrapper dependencies to prevent simultaneous linking ([GH-80918](https://github.com/godotengine/godot/pull/80918)). -- Assign extension validation files to the GDExtension and .NET teams in CODEOWNERS ([GH-81116](https://github.com/godotengine/godot/pull/81116)). -- Remove too greedy gcov/lcov ignores from `.gitignore` ([GH-81120](https://github.com/godotengine/godot/pull/81120)). -- SCons: Add option for MSVC incremental linking ([GH-81144](https://github.com/godotengine/godot/pull/81144)). -- CI: Bump version for `actions/checkout@v4` and `actions/setup-dotnet@v3` ([GH-81302](https://github.com/godotengine/godot/pull/81302)). -- CI: Compat checks: Make fetching the reference API more robust ([GH-81337](https://github.com/godotengine/godot/pull/81337)). -- Web: Workaround Emscripten 3.1.42+ LTO regression ([GH-81340](https://github.com/godotengine/godot/pull/81340)). -- UWP: Remove platform port, needs to be redone from scratch for 4.x ([GH-81416](https://github.com/godotengine/godot/pull/81416)). -- Haiku: Remove remnants of past WIP platform port ([GH-81420](https://github.com/godotengine/godot/pull/81420)). -- Web: Fix version check for missing scalbnf LTO workaround ([GH-81869](https://github.com/godotengine/godot/pull/81869)). -- macOS: Workaround Xcode 15 linker bug ([GH-81968](https://github.com/godotengine/godot/pull/81968)). -- SCons: Fix Python 3.12 SyntaxError with regex escape sequences ([GH-82290](https://github.com/godotengine/godot/pull/82290)). -- Windows: Remove `MSVC` define redundant with `_MSC_VER` ([GH-82304](https://github.com/godotengine/godot/pull/82304)). -- Updated compiler version detection ([GH-82325](https://github.com/godotengine/godot/pull/82325)). -- Fix compiler detection ([GH-82352](https://github.com/godotengine/godot/pull/82352)). -- Fix build on MSVC 2017 ([GH-82450](https://github.com/godotengine/godot/pull/82450)). -- iOS: Fix build with Xcode 15 ([GH-82458](https://github.com/godotengine/godot/pull/82458)). -- Web: Fix `dlink_enabled` build ([GH-82633](https://github.com/godotengine/godot/pull/82633)). -- SCons: Change `check_c_headers` from tuple array to dictionary ([GH-82638](https://github.com/godotengine/godot/pull/82638)). -- Validate `code` tags for class and member references ([GH-82691](https://github.com/godotengine/godot/pull/82691)). -- Fix building without GDScript ([GH-82985](https://github.com/godotengine/godot/pull/82985)). -- CI: Switch mesa PPA from kisak-mesa to turtle ([GH-83147](https://github.com/godotengine/godot/pull/83147)). -- CI: Workaround recently broken add-apt-repository on GHA ([GH-83214](https://github.com/godotengine/godot/pull/83214)). -- X11: Fix unused variables warning when `touch` is disabled ([GH-83265](https://github.com/godotengine/godot/pull/83265)). -- Bump the java version to version 17 ([GH-83515](https://github.com/godotengine/godot/pull/83515)). -- SCons: Use CXXFLAGS to disable exceptions, it's only for C++ ([GH-83618](https://github.com/godotengine/godot/pull/83618)). -- Web: Fix closure compiler builds using BIGINT ([GH-83720](https://github.com/godotengine/godot/pull/83720)). -- SCons: Reduce and cleanup verbose output for SCU builds ([GH-83996](https://github.com/godotengine/godot/pull/83996)). -- Use colored output on CI for Doctest ([GH-84100](https://github.com/godotengine/godot/pull/84100)). -- Linux: Remove hardcoded lib path for x86 cross-compilation ([GH-84307](https://github.com/godotengine/godot/pull/84307)). -- Replace the use of the `ANDROID_SDK_ROOT` env variable with `ANDROID_HOME` ([GH-84316](https://github.com/godotengine/godot/pull/84316)). -- CI: Pin Emscripten to 3.1.39 ([GH-84717](https://github.com/godotengine/godot/pull/84717)). -- Donors: Change tiers to match Dev Fund, sync latest data ([GH-84884](https://github.com/godotengine/godot/pull/84884)). -- makerst: Disallow user-contributed notes on the class index page ([GH-85006](https://github.com/godotengine/godot/pull/85006)). -- Use mingw-std-threads in MinGW builds ([GH-85039](https://github.com/godotengine/godot/pull/85039)). -- Avoid conflict between mingw-std-threads and Clang's own ([GH-85208](https://github.com/godotengine/godot/pull/85208)). -- Fix generating vsproj with SCons 4.6.0+ ([GH-85357](https://github.com/godotengine/godot/pull/85357)). -- Add unsigned char cast ifdef ([GH-85500](https://github.com/godotengine/godot/pull/85500)). +- Add option in SCons to clone env variables ([GH-70770](https://github.com/godotengine/godot/pull/70770)). +- SCons: Add `stack_size` and `default_pthread_stack_size` options to Web target ([GH-75166](https://github.com/godotengine/godot/pull/75166)). +- SCons: Add `-ffile-prefix-map` GCC/Clang option to make debug file paths relative ([GH-78232](https://github.com/godotengine/godot/pull/78232)). +- MinGW: Force separate debug symbols if executable size is larger than 1.9 GB ([GH-79875](https://github.com/godotengine/godot/pull/79875)). +- Remove lgtm.yml since LGTM is now replaced by Github Code Scanning ([GH-81874](https://github.com/godotengine/godot/pull/81874)). +- Identify pull request builds from GitHub Actions with the PR number ([GH-83448](https://github.com/godotengine/godot/pull/83448)). +- CI: Enable ANGLE static linking ([GH-84175](https://github.com/godotengine/godot/pull/84175)). +- Add `generate_apk=yes` to generate an APK after building ([GH-84440](https://github.com/godotengine/godot/pull/84440)). +- Use Python venv if detected when building VS project ([GH-84593](https://github.com/godotengine/godot/pull/84593)). +- Only build glslang if Vulkan or Direct3D 12 rendering is enabled ([GH-84613](https://github.com/godotengine/godot/pull/84613)). +- Add parameter to allow generation of the Godot native shared libraries from gradle ([GH-84674](https://github.com/godotengine/godot/pull/84674)). +- New Visual Studio project generation logic that supports any platform that wants to opt in ([GH-84885](https://github.com/godotengine/godot/pull/84885)). +- Alias `platform=javascript` SCons option to `platform=web` ([GH-84979](https://github.com/godotengine/godot/pull/84979)). +- SCons: Add two new `COMSTR` environment variables ([GH-85153](https://github.com/godotengine/godot/pull/85153)). +- SCons: Update mypy ([GH-85192](https://github.com/godotengine/godot/pull/85192)). +- Run `Clean` in Windows SCsub to clean up debug files ([GH-85197](https://github.com/godotengine/godot/pull/85197)). +- macOS: Check Apple specific version instead of generic clang version ([GH-85206](https://github.com/godotengine/godot/pull/85206)). +- SCons: Change `Environment` type hints to `SConsEnvironment` ([GH-85322](https://github.com/godotengine/godot/pull/85322)). +- Fix the Web platform team's codeowners link ([GH-85746](https://github.com/godotengine/godot/pull/85746)). +- Refactor and fix `make_virtuals.py` ([GH-85770](https://github.com/godotengine/godot/pull/85770)). +- Fix invalid Python escape sequences ([GH-85818](https://github.com/godotengine/godot/pull/85818)). +- Instruct users to add code/errors as text in issues ([GH-86006](https://github.com/godotengine/godot/pull/86006)). +- Set what were default values for Web platform linker flags `-sSTACK_SIZE` and `-sDEFAULT_PTHREAD_STACK_SIZE` ([GH-86036](https://github.com/godotengine/godot/pull/86036)). +- D3D12: Add missing DLL architecture paths for the 32-bit builds ([GH-86107](https://github.com/godotengine/godot/pull/86107)). +- Mention `etcpak` changes in thirdparty/README.md ([GH-86236](https://github.com/godotengine/godot/pull/86236)). +- [iOS/macOS] Add option to automatically build (and sign / archive) bundles ([GH-86255](https://github.com/godotengine/godot/pull/86255)). +- Allow detecting when building as an engine module ([GH-86269](https://github.com/godotengine/godot/pull/86269)). +- Fix Clang `-Winconsistent-missing-override` warning ([GH-86392](https://github.com/godotengine/godot/pull/86392)). +- Add a python script to install Direct3D 12 SDK components ([GH-86717](https://github.com/godotengine/godot/pull/86717)). +- Fix some build errors with `disable_3d=yes` ([GH-86874](https://github.com/godotengine/godot/pull/86874)). +- SCons: Fix `CCFLAGS`, `LINKFLAGS`, etc. command line overrides ([GH-86964](https://github.com/godotengine/godot/pull/86964)). +- Add `tests/python_build` to clang-format pre-commit hook ignore list ([GH-87000](https://github.com/godotengine/godot/pull/87000)). +- Revamp `godot.natvis` to improve VS debugging experience ([GH-87053](https://github.com/godotengine/godot/pull/87053)). +- SCons: Silence redundant MSVC output ([GH-87154](https://github.com/godotengine/godot/pull/87154)). +- makerst: Suggest using `[code skip-lint]` to skip warnings if intended ([GH-87218](https://github.com/godotengine/godot/pull/87218)). +- Windows: Remove `dxc_path` check ([GH-87247](https://github.com/godotengine/godot/pull/87247)). +- macOS: Fix MoltenVK SDK detection after file location changes in 1.3.275.0 ([GH-87305](https://github.com/godotengine/godot/pull/87305)). +- Update Android dependencies for the project ([GH-87346](https://github.com/godotengine/godot/pull/87346)). +- iOS: Update linker flags for Xcode 15.2 ([GH-87358](https://github.com/godotengine/godot/pull/87358)). +- Linux: Add support for PCK embedding section with non GNU-ld linkers ([GH-87464](https://github.com/godotengine/godot/pull/87464)). +- CI: Update `mymindstorm/setup-emsdk` to v14, should fix cache folder conflicts ([GH-87575](https://github.com/godotengine/godot/pull/87575)). +- SCons: Fix Windows cross-compilation from Linux after #86717 ([GH-87609](https://github.com/godotengine/godot/pull/87609)). +- SCons: Add proper MinGW support to D3D12 deps install script ([GH-87619](https://github.com/godotengine/godot/pull/87619)). +- D3D12: Add support for building with pre-11.0.0 MinGW versions, make PIX runtime opt-in ([GH-87624](https://github.com/godotengine/godot/pull/87624)). +- Undefine yet another macro from Windows headers ([GH-87627](https://github.com/godotengine/godot/pull/87627)). +- Avoid non-constant-expression cannot be narrowed on Windows on mingw ([GH-87720](https://github.com/godotengine/godot/pull/87720)). +- Use raw strings for D3D12 install messages ([GH-87734](https://github.com/godotengine/godot/pull/87734)). +- Wayland: Disable backend at build-time if wayland-scanner is missing ([GH-87765](https://github.com/godotengine/godot/pull/87765)). +- Fix `godot.natvis` after CowData 64-bit promotion ([GH-87848](https://github.com/godotengine/godot/pull/87848)). +- CI scripts: Fix `printf` for format checks ([GH-87864](https://github.com/godotengine/godot/pull/87864)). +- Add basic Emacs `.gitignore` entries ([GH-87878](https://github.com/godotengine/godot/pull/87878)). +- macOS: Check Vulkan SDK version when looking for MoltenVK libs ([GH-87960](https://github.com/godotengine/godot/pull/87960)). +- Fix emscripten 3.1.51 breaking change about `*glGetProcAddress()` ([GH-87981](https://github.com/godotengine/godot/pull/87981)). +- Web: Bump closure compiler spec to `ECMASCRIPT_2021` ([GH-88010](https://github.com/godotengine/godot/pull/88010)). +- SCons: Fix incremental builds breaking when querying the dependency tree from a SCsub ([GH-88025](https://github.com/godotengine/godot/pull/88025)). +- Silence wayland-scanner check in buildsystem ([GH-88028](https://github.com/godotengine/godot/pull/88028)). +- SCons: Use r-strings for wayland-scanner builder command ([GH-88134](https://github.com/godotengine/godot/pull/88134)). +- Add first interaction action to better inform newcomers ([GH-88137](https://github.com/godotengine/godot/pull/88137)). +- Remove 3.x references in the pull request template ([GH-88159](https://github.com/godotengine/godot/pull/88159)). +- Visual Studio: Don't override user options. Add additional vs hint information ([GH-88244](https://github.com/godotengine/godot/pull/88244)). +- C#: Let platforms signal if they support the mono module or not ([GH-88245](https://github.com/godotengine/godot/pull/88245)). +- Visual Studio: Fix user workflows with custom user VS configurations ([GH-88253](https://github.com/godotengine/godot/pull/88253)). +- Avoid unqualified-id "near" and "far" in Node3DEditor/Viewport ([GH-88270](https://github.com/godotengine/godot/pull/88270)). +- Fix gradle build errors when the build path contains non-ASCII characters ([GH-88304](https://github.com/godotengine/godot/pull/88304)). +- Always enable debug symbols when developing with Android Studio ([GH-88382](https://github.com/godotengine/godot/pull/88382)). +- Fix running tests in template builds ([GH-88452](https://github.com/godotengine/godot/pull/88452)). +- Fix formatting in bug report template ([GH-88457](https://github.com/godotengine/godot/pull/88457)). +- Windows: Make D3D12 loading dynamic to support pre-Windows 10 versions ([GH-88496](https://github.com/godotengine/godot/pull/88496)). +- Disable the crash handler if `execinfo=no` scons option is set ([GH-88520](https://github.com/godotengine/godot/pull/88520)). +- OS_LinuxBSD: Add missing RenderServer include for `get_video_adapter_driver_info` ([GH-88525](https://github.com/godotengine/godot/pull/88525)). +- Add `WASM_BIGINT` linker flag to the web build ([GH-88594](https://github.com/godotengine/godot/pull/88594)). +- CI: Update actions to latest versions, use default runner .NET version ([GH-88671](https://github.com/godotengine/godot/pull/88671)). +- Fix some additional errors with 3D disabled ([GH-88704](https://github.com/godotengine/godot/pull/88704)). +- Replace hand-written pre-commit hooks with `pre-commit` Python tool ([GH-88866](https://github.com/godotengine/godot/pull/88866)). +- Visual Studio: Improve performance of parsing project file ([GH-88949](https://github.com/godotengine/godot/pull/88949)). +- Fix compilation errors when `DISABLE_DEPRECATED` is defined ([GH-88958](https://github.com/godotengine/godot/pull/88958)). +- Pre-commit: Update to clang-format 17.0.6 and black 24.2.0 ([GH-88959](https://github.com/godotengine/godot/pull/88959)). +- Fix linking NavigationServer2D/3D with all classes disabled in build profile ([GH-88986](https://github.com/godotengine/godot/pull/88986)). +- macOS: Fix some deprecation warnings ([GH-88987](https://github.com/godotengine/godot/pull/88987)). +- SCons: Set `silence_msvc` to false by default ([GH-89159](https://github.com/godotengine/godot/pull/89159)). +- Fix build on MSVC 2017 ([GH-89168](https://github.com/godotengine/godot/pull/89168)). +- Fix POT generation missing some strings when built-in ones are enabled ([GH-89227](https://github.com/godotengine/godot/pull/89227)). +- Windows: Avoid `scale_with_dpi` constexpr compiler error ([GH-89303](https://github.com/godotengine/godot/pull/89303)). +- Fix MoltenVK detection ([GH-89327](https://github.com/godotengine/godot/pull/89327)). +- Enforce `\n` eol for Python writes ([GH-89333](https://github.com/godotengine/godot/pull/89333)). +- SCons: Ensure `with` statement where applicable ([GH-89361](https://github.com/godotengine/godot/pull/89361)). +- SCons: Convert remaining `run_in_subprocess` to `env.Run` ([GH-89365](https://github.com/godotengine/godot/pull/89365)). +- SCons: Remove `run_in_subprocess` & `subprocess_main` dependencies ([GH-89393](https://github.com/godotengine/godot/pull/89393)). +- Pre-commit: Fix `copyright_headers.py` to run on all relevant files ([GH-89421](https://github.com/godotengine/godot/pull/89421)). +- SCons: Enable the experimental Ninja backend and minimize timestamp changes to generated code ([GH-89452](https://github.com/godotengine/godot/pull/89452)). +- Fix GCC build warning ([GH-89453](https://github.com/godotengine/godot/pull/89453)). +- Fix `compiledb` SCons tool availability ([GH-89481](https://github.com/godotengine/godot/pull/89481)). +- SCons: Disable verbose output for SCU build ([GH-89483](https://github.com/godotengine/godot/pull/89483)). +- CI: Enable submodules on the checkout action ([GH-89552](https://github.com/godotengine/godot/pull/89552)). +- Fix some build errors with `disable_3d=yes` ([GH-89760](https://github.com/godotengine/godot/pull/89760)). +- Fix encoding when reading files ([GH-89858](https://github.com/godotengine/godot/pull/89858)). +- CI: Work around diff size limit for static checks ([GH-89944](https://github.com/godotengine/godot/pull/89944)). +- CI: Improve fetching of changed files ([GH-89980](https://github.com/godotengine/godot/pull/89980)). +- SCons: Fix Ninja compilation with MSVC ([GH-90208](https://github.com/godotengine/godot/pull/90208)). +- SCons: Refactor `selected_platform` conditional ([GH-90214](https://github.com/godotengine/godot/pull/90214)). +- Fix first interaction line breaks ([GH-90221](https://github.com/godotengine/godot/pull/90221)). +- Remove buggy first interaction ([GH-90261](https://github.com/godotengine/godot/pull/90261)). +- SCons: Ensure *all* generated files can be cleaned ([GH-90270](https://github.com/godotengine/godot/pull/90270)). +- Bump GitHub workflows to SCons 4.7 ([GH-90304](https://github.com/godotengine/godot/pull/90304)). +- SCons: Fix SCU build regression on Windows ([GH-90450](https://github.com/godotengine/godot/pull/90450)). +- Replace `black` formatter with `ruff` ([GH-90457](https://github.com/godotengine/godot/pull/90457)). +- Ensure all Visual Studio files are generated with CRLF ([GH-90495](https://github.com/godotengine/godot/pull/90495)). +- mbedTLS: Add patch to fix build errors with some MSVC versions ([GH-90535](https://github.com/godotengine/godot/pull/90535)). +- SCons: Silence MSVC output bloat without hiding errors ([GH-90551](https://github.com/godotengine/godot/pull/90551)). +- Visual Studio: Fix indentation in sln file, VS is VERY PICKY ([GH-90579](https://github.com/godotengine/godot/pull/90579)). +- Fix infinite while loop on empty added file ([GH-90588](https://github.com/godotengine/godot/pull/90588)). +- SCons: Fix `silence_msvc` regression ([GH-90626](https://github.com/godotengine/godot/pull/90626)). +- mbedTLS: Fix build without the module on MinGW ([GH-90691](https://github.com/godotengine/godot/pull/90691)). +- SCons: Make new `debug_paths_relative` option opt-in ([GH-90692](https://github.com/godotengine/godot/pull/90692)). +- Only define `ENGINE_UPDATE_CHECK_ENABLED` in editor builds ([GH-90781](https://github.com/godotengine/godot/pull/90781)). +- SCons: Convert `env_base` to `env` ([GH-90814](https://github.com/godotengine/godot/pull/90814)). +- SCons: Utilize native Variable alias functionality ([GH-90857](https://github.com/godotengine/godot/pull/90857)). +- SCons: Disable `show_progress` with Ninja ([GH-90858](https://github.com/godotengine/godot/pull/90858)). +- Web: Fix building for web on Windows ([GH-90939](https://github.com/godotengine/godot/pull/90939)). +- SCons: Only use alias if SCons v4.3 or later ([GH-91072](https://github.com/godotengine/godot/pull/91072)). +- CI: [macOS] Fix CI with new GitHub runners ([GH-91074](https://github.com/godotengine/godot/pull/91074)). +- SCons: `scons_version` to environment variable ([GH-91080](https://github.com/godotengine/godot/pull/91080)). +- CI: [macOS] Build for both `arm64` and `x86_64` ([GH-91106](https://github.com/godotengine/godot/pull/91106)). +- Web: Fix closure compiler typedef annotation ([GH-91202](https://github.com/godotengine/godot/pull/91202)). +- Fix GCC 14 `-Wtemplate-id-cdtor` warnings ([GH-91208](https://github.com/godotengine/godot/pull/91208)). +- SCons: Colorize warnings/errors during generation ([GH-91220](https://github.com/godotengine/godot/pull/91220)). +- Add a GDB pretty printer to aid in debugging ([GH-91280](https://github.com/godotengine/godot/pull/91280)). +- SCons: Fixes for warn/error colorization ([GH-91318](https://github.com/godotengine/godot/pull/91318)). +- Fix for Android build on Windows ([GH-91339](https://github.com/godotengine/godot/pull/91339)). +- mbedtls: Disable AESCE on Linux ARM32, doesn't compile on our target arch ([GH-91356](https://github.com/godotengine/godot/pull/91356)). +- Fix arm64/Windows build ([GH-91360](https://github.com/godotengine/godot/pull/91360)). +- Update dependencies in D3D12 SDK installer script ([GH-91416](https://github.com/godotengine/godot/pull/91416)). +- CI: Speedup `pre-commit` static check ([GH-91417](https://github.com/godotengine/godot/pull/91417)). +- Remove "AnalyzeTemporaryDtors" from clang-tidy file ([GH-91559](https://github.com/godotengine/godot/pull/91559)). +- Fix missing space in missing sdkmanager error message ([GH-91574](https://github.com/godotengine/godot/pull/91574)). +- CI: Overhaul static checks to use `pre-commit` ([GH-91597](https://github.com/godotengine/godot/pull/91597)). +- SCons: Generate all scripts natively, implement wrapper function ([GH-91624](https://github.com/godotengine/godot/pull/91624)). +- miniupnpc: Disable socket timeout on Windows, matching upstream ([GH-91636](https://github.com/godotengine/godot/pull/91636)). +- Fix `builtin_embree=no` build linking the wrong version of Embree ([GH-91684](https://github.com/godotengine/godot/pull/91684)). +- CI: Use Emscripten 3.1.59 for Web platform ([GH-91687](https://github.com/godotengine/godot/pull/91687)). +- SCons: Process platform-specific flags earlier ([GH-91791](https://github.com/godotengine/godot/pull/91791)). +- SCons: Preserve `Environment` values when updating `Variables` ([GH-91792](https://github.com/godotengine/godot/pull/91792)). +- Web: Fix debug symbols in web builds ([GH-91800](https://github.com/godotengine/godot/pull/91800)). +- Set `execinfo=no` by default when compiling for Linux/*BSD ([GH-91817](https://github.com/godotengine/godot/pull/91817)). +- SCons: Bump minimum supported GCC version to GCC 9 ([GH-91833](https://github.com/godotengine/godot/pull/91833)). +- CI: Re-add `CHANGED_FILES` logic for pre-commit checks ([GH-91835](https://github.com/godotengine/godot/pull/91835)). +- Don't define `NO_EDITOR_SPLASH` in export templates ([GH-91866](https://github.com/godotengine/godot/pull/91866)). +- SCons: Fix generation of `disabled_classes.gen.h` after #91624 ([GH-91870](https://github.com/godotengine/godot/pull/91870)). +- SCons: Fix `silence_msvc` implementation errors ([GH-91890](https://github.com/godotengine/godot/pull/91890)). +- thorvg: Disable webp loader if corresponding module is disabled ([GH-91901](https://github.com/godotengine/godot/pull/91901)). +- CI: Consolidate pysettings via `pyproject.toml` ([GH-91954](https://github.com/godotengine/godot/pull/91954)). +- SCons: Add options to override AR, AR and RC flags ([GH-91972](https://github.com/godotengine/godot/pull/91972)). +- CI: Fix for jsdoc hook in pre-commit ([GH-92013](https://github.com/godotengine/godot/pull/92013)). +- SCons: Minor fixes/adjustments for web compilation ([GH-92026](https://github.com/godotengine/godot/pull/92026)). +- SCons: Restore compatibility with SCons < 4.0.0 ([GH-92041](https://github.com/godotengine/godot/pull/92041)). +- SCons: Bump min version to 3.1.2, test it on CI with one Linux job ([GH-92043](https://github.com/godotengine/godot/pull/92043)). +- SCons: Fix potential Windows ANSI exception ([GH-92087](https://github.com/godotengine/godot/pull/92087)). +- SCons: Convert platform `get_flags` to dictionary ([GH-92124](https://github.com/godotengine/godot/pull/92124)). +- Fix detecting when Gradle is invoked from Studio ([GH-92176](https://github.com/godotengine/godot/pull/92176)). +- Pre-commit: Allow adding downstream hooks without (less) risk of conflicts ([GH-92204](https://github.com/godotengine/godot/pull/92204)). +- Linux: Enable build config `wayland=yes use_sowrap=no` ([GH-92324](https://github.com/godotengine/godot/pull/92324)). +- SCons: Fix `RES` race condition ([GH-92325](https://github.com/godotengine/godot/pull/92325)). +- Fix build with `vulkan=no` and `d3d12=no` after #91505 ([GH-92364](https://github.com/godotengine/godot/pull/92364)). +- Fix use of undeclared identifier `__cpuidex` error on MinGW ([GH-92488](https://github.com/godotengine/godot/pull/92488)). +- Fix multichar warning in `windows_utils.cpp` ([GH-92541](https://github.com/godotengine/godot/pull/92541)). +- SCons: Fix `mono` dependency ([GH-92661](https://github.com/godotengine/godot/pull/92661)). +- CI: Make local python hooks multi-platform ([GH-92697](https://github.com/godotengine/godot/pull/92697)). +- CI: Migrate codespell logic to `pyproject.toml` ([GH-92728](https://github.com/godotengine/godot/pull/92728)). +- Windows: Fix 32-bit MinGW LTO build ([GH-92753](https://github.com/godotengine/godot/pull/92753)). +- Style: Optimize `.svg` files via `svgo`; add as pre-commit hook ([GH-92766](https://github.com/godotengine/godot/pull/92766)). +- Ignore Kate's build file ([GH-92803](https://github.com/godotengine/godot/pull/92803)). +- Fix building glslang on platforms without `` ([GH-92819](https://github.com/godotengine/godot/pull/92819)). +- Android: Change the way `doNotStrip` is set ([GH-92859](https://github.com/godotengine/godot/pull/92859)). +- Replace deprecated `USE_WEBGL2` linker flag ([GH-92988](https://github.com/godotengine/godot/pull/92988)). +- CI: Hotfix for build error with newer clang++ ([GH-92993](https://github.com/godotengine/godot/pull/92993)). +- Web: Fix thread+dlink builds with emscripten 3.1.61+git ([GH-93143](https://github.com/godotengine/godot/pull/93143)). +- Enable usage of asan-enabled versions of prebuilt libraries ([GH-93152](https://github.com/godotengine/godot/pull/93152)). +- CI: Add manual pre-commit hook for `clang-tidy` ([GH-93271](https://github.com/godotengine/godot/pull/93271)). +- Fix building with `use_volk=yes` on MacOS ([GH-93331](https://github.com/godotengine/godot/pull/93331)). +- Fix not using `encoding="utf-8"` when writing to files or reading from them ([GH-93342](https://github.com/godotengine/godot/pull/93342)). +- [Windows/ARM64] Fix raycast/embree ARM64 build with LLVM/MinGW ([GH-93364](https://github.com/godotengine/godot/pull/93364)). +- [LLVM/MinGW] Fix/suppress DX12 related warnings ([GH-93369](https://github.com/godotengine/godot/pull/93369)). +- CI: Keep GHA artifacts for 60 days ([GH-93421](https://github.com/godotengine/godot/pull/93421)). +- Remove private glslang include ([GH-93471](https://github.com/godotengine/godot/pull/93471)). +- Disable `*glGetProcAddress()` on the web ([GH-93489](https://github.com/godotengine/godot/pull/93489)). +- Fix type-limits warning in `windows_utils` ([GH-93491](https://github.com/godotengine/godot/pull/93491)). +- Style: Relocate `godot_gdb_pretty_print.py` ([GH-93511](https://github.com/godotengine/godot/pull/93511)). +- CI: Add editor target to Android builds config ([GH-93553](https://github.com/godotengine/godot/pull/93553)). +- Windows: Fix arch detection via `VCTOOLSINSTALLDIR` if not first in `PATH` ([GH-93589](https://github.com/godotengine/godot/pull/93589)). +- SCons: Fix output with `vsproj=yes` ([GH-93753](https://github.com/godotengine/godot/pull/93753)). +- Web: Remove unnecessary `EMCC_FORCE_STDLIBS` in dlink builds ([GH-93853](https://github.com/godotengine/godot/pull/93853)). +- SCons: Don't override cl flags on msvc ([GH-94078](https://github.com/godotengine/godot/pull/94078)). +- SCons: Default `optimize` to `auto`, fixing `target`/`dev_build` inference for Web ([GH-94107](https://github.com/godotengine/godot/pull/94107)). +- SCons: Pass optimization flags to the linker too, needed by Emscripten ([GH-94109](https://github.com/godotengine/godot/pull/94109)). +- SCons: Fix build fetching `git_timestamp` if git `log.showsignature=true` ([GH-94115](https://github.com/godotengine/godot/pull/94115)). +- Fix VS project generation with SCons 4.8.0+ ([GH-94117](https://github.com/godotengine/godot/pull/94117)). +- Fix a couple GCC 14 `-Wmaybe-uninitialized` warnings ([GH-94133](https://github.com/godotengine/godot/pull/94133)). +- CI: Upload build cache before running tests ([GH-94314](https://github.com/godotengine/godot/pull/94314)). +- CI: Bump SCons version (4.7.0→4.8.0) ([GH-94444](https://github.com/godotengine/godot/pull/94444)). +- Windows: Fix release export template build for ARM64 Windows ([GH-94533](https://github.com/godotengine/godot/pull/94533)). +- Fix `header_guards.py` so it detects the copyright header properly ([GH-94652](https://github.com/godotengine/godot/pull/94652)). +- Web: Fix closure compiler builds, enable it in CI ([GH-94789](https://github.com/godotengine/godot/pull/94789)). +- Automatically enable `doNotStrip` for dev builds ([GH-94887](https://github.com/godotengine/godot/pull/94887)). +- Enable ASTC encoder build when building with ANGLE ([GH-94903](https://github.com/godotengine/godot/pull/94903)). +- SCons: Load optional ninja tool before setting its options ([GH-94993](https://github.com/godotengine/godot/pull/94993)). +- macOS: Fix `generate_bundle` build flag for .NET builds ([GH-95189](https://github.com/godotengine/godot/pull/95189)). +- CI: Update Emscripten to 3.1.64 ([GH-95277](https://github.com/godotengine/godot/pull/95277)). +- Make sure not to generate the compile_commands.json when not asked ([GH-95338](https://github.com/godotengine/godot/pull/95338)). #### C# -- Allow readonly and writeonly C# properties to be accessed from GDScript ([GH-67304](https://github.com/godotengine/godot/pull/67304)). -- Support exporting for Android ([GH-73257](https://github.com/godotengine/godot/pull/73257)). -- Fix crash with `DisposablesTracker_OnGodotShuttingDown` ([GH-78157](https://github.com/godotengine/godot/pull/78157)). -- Add `PropertyHint.Enum` support to `Array` ([GH-78264](https://github.com/godotengine/godot/pull/78264)). -- Check if JetBrains Rider editor path is empty ([GH-78516](https://github.com/godotengine/godot/pull/78516)). -- Automatically generate version defines ([GH-78722](https://github.com/godotengine/godot/pull/78722)). -- Update the RiderPathLocator to support the JetBrains Toolbox 2.0 ([GH-78832](https://github.com/godotengine/godot/pull/78832)). -- Add platform name to the exported data directory ([GH-78846](https://github.com/godotengine/godot/pull/78846)). -- Fix deserialization of delegates that are 0-parameter overloads ([GH-78877](https://github.com/godotengine/godot/pull/78877)). -- Add a Roslyn analyzer for global classes ([GH-79007](https://github.com/godotengine/godot/pull/79007)). -- Add missing `useModelFront` parameter to GodotSharp Basis and Transform ([GH-79082](https://github.com/godotengine/godot/pull/79082)). -- Compare symbol names without null flow state ([GH-79094](https://github.com/godotengine/godot/pull/79094)). -- Add null check before calling `UnregisterGodotObject` ([GH-79151](https://github.com/godotengine/godot/pull/79151)). -- Fix command line exporting ([GH-79173](https://github.com/godotengine/godot/pull/79173)). -- Add a warning about C# differences to the class reference ([GH-79206](https://github.com/godotengine/godot/pull/79206)). -- Document generated members ([GH-79239](https://github.com/godotengine/godot/pull/79239)). -- Print error when MethodBind/Callable call fails ([GH-79249](https://github.com/godotengine/godot/pull/79249)). -- Improve `GD.PushError` and `GD.PushWarning` ([GH-79280](https://github.com/godotengine/godot/pull/79280)). -- Fix MSVC dotnet builds failing if running `dev_mode` ([GH-79351](https://github.com/godotengine/godot/pull/79351)). -- Move build button to EditorRunBar ([GH-79357](https://github.com/godotengine/godot/pull/79357)). -- Fix line in OpenInExternalEditor ([GH-79404](https://github.com/godotengine/godot/pull/79404)). -- Generate instance types for singletons ([GH-79470](https://github.com/godotengine/godot/pull/79470)). -- Suppress NU5128 warning ([GH-79501](https://github.com/godotengine/godot/pull/79501)). -- Fix issues in C# documentation comments ([GH-79748](https://github.com/godotengine/godot/pull/79748)). -- Delegate opening files for Rider to the RiderPathLocator NuGet package ([GH-79958](https://github.com/godotengine/godot/pull/79958)). -- Mono: Avoid dictionary lookup for common colors ([GH-80047](https://github.com/godotengine/godot/pull/80047)). -- Show alert if .NET assemblies dir does not exist ([GH-80212](https://github.com/godotengine/godot/pull/80212)). -- Redesign MSBuild panel ([GH-80260](https://github.com/godotengine/godot/pull/80260)). -- Fix typo in parameter name in documentation ([GH-80303](https://github.com/godotengine/godot/pull/80303)). -- Improve diagnostic messages and add help link ([GH-80489](https://github.com/godotengine/godot/pull/80489)). -- Fix exporting for Android ([GH-80521](https://github.com/godotengine/godot/pull/80521)). -- Generate and use compat methods ([GH-80527](https://github.com/godotengine/godot/pull/80527)). -- Implement `proxy_name` for EnumInterface ([GH-80628](https://github.com/godotengine/godot/pull/80628)). -- Include argument types in generated methods ([GH-80629](https://github.com/godotengine/godot/pull/80629)). -- paramref now properly tagged in documentation ([GH-80630](https://github.com/godotengine/godot/pull/80630)). -- Fixed delegate docstring logic ([GH-80631](https://github.com/godotengine/godot/pull/80631)). -- Dereference editor types in core documentation ([GH-80632](https://github.com/godotengine/godot/pull/80632)). -- CI: Propagate error code when glue generation fails ([GH-80846](https://github.com/godotengine/godot/pull/80846)). -- Updated C# example of AddPropertyInfo ([GH-80851](https://github.com/godotengine/godot/pull/80851)). -- Replace `StringNameCache` with `SNAME` ([GH-81073](https://github.com/godotengine/godot/pull/81073)). -- Add abstract class support ([GH-81101](https://github.com/godotengine/godot/pull/81101)). -- Replace usage of deprecated `project_settings_changed` signal ([GH-81175](https://github.com/godotengine/godot/pull/81175)). -- Fix int's C# documentation ([GH-81227](https://github.com/godotengine/godot/pull/81227)). -- Expose `asinh`, `acosh` and `atanh` in Mathf ([GH-81229](https://github.com/godotengine/godot/pull/81229)). -- Fix double unregistration on dispose of Array ([GH-81230](https://github.com/godotengine/godot/pull/81230)). -- Hide hostfxr not found error ([GH-81690](https://github.com/godotengine/godot/pull/81690)). -- Move `bindings_generator` warnings to `.editorconfig` ([GH-81703](https://github.com/godotengine/godot/pull/81703)). -- Make C# static methods accessible ([GH-81783](https://github.com/godotengine/godot/pull/81783)). -- Fixed VS 2022 Mac compatibility ([GH-81802](https://github.com/godotengine/godot/pull/81802)). -- Add Vector2/3/4i.MAX and MIN ([GH-81819](https://github.com/godotengine/godot/pull/81819)). -- Implemented `{project}` placeholder for external dotnet editor ([GH-81847](https://github.com/godotengine/godot/pull/81847)). -- CS1591 from `NoWarn` to `suggestion` ([GH-81934](https://github.com/godotengine/godot/pull/81934)). -- Use `HashCode.Combine()` for basic composite types instead of xor ([GH-82240](https://github.com/godotengine/godot/pull/82240)). -- Remove compat method that is now generated ([GH-82375](https://github.com/godotengine/godot/pull/82375)). -- Fixed an error in `Vector3.BezierDerivative` in mono module ([GH-82664](https://github.com/godotengine/godot/pull/82664)). -- Fix C# editor dialogs ([GH-82683](https://github.com/godotengine/godot/pull/82683)). -- Add C# iOS support ([GH-82729](https://github.com/godotengine/godot/pull/82729)). -- Add C# compat members for 4.2 changes ([GH-82740](https://github.com/godotengine/godot/pull/82740)). -- Add checks to Android export ([GH-82762](https://github.com/godotengine/godot/pull/82762)). -- Report diagnostic for Node exports in a type that doesn't derive from Node ([GH-82918](https://github.com/godotengine/godot/pull/82918)). -- Fix unresolved `inheritdoc` links in `Compat.cs` ([GH-83001](https://github.com/godotengine/godot/pull/83001)). -- Untyped to typed `ArgumentNullException` ([GH-83051](https://github.com/godotengine/godot/pull/83051)). -- Fix MSVC dotnet `dev_mode` regression ([GH-83114](https://github.com/godotengine/godot/pull/83114)). -- Fix lookup for singleton instance types ([GH-83249](https://github.com/godotengine/godot/pull/83249)). -- Fallback to the latest SDK ([GH-83325](https://github.com/godotengine/godot/pull/83325)). -- Fix converting default Callables to native ([GH-83357](https://github.com/godotengine/godot/pull/83357)). -- Allow exporting games without C# ([GH-83422](https://github.com/godotengine/godot/pull/83422)). -- Clarify C# docs for operators performing `xform_inv` ([GH-83514](https://github.com/godotengine/godot/pull/83514)). -- Fix C# docs to use the proper XML ([GH-83529](https://github.com/godotengine/godot/pull/83529)). -- Fix generated nested class order ([GH-83532](https://github.com/godotengine/godot/pull/83532)). -- Add `NOTIFICATION_PREDELETE_CLEANUP` notification to fix C# `Dispose()` ([GH-83670](https://github.com/godotengine/godot/pull/83670)). -- Free dialogs when exiting the editor ([GH-83809](https://github.com/godotengine/godot/pull/83809)). -- Fix node names of submenu items across the editor ([GH-84617](https://github.com/godotengine/godot/pull/84617)). -- Rename `Vector2/3/4I.Min/Max` to `MinValue/MaxValue` ([GH-84663](https://github.com/godotengine/godot/pull/84663)). -- Fail `callp` silently if script is not valid ([GH-84897](https://github.com/godotengine/godot/pull/84897)). -- iOS: Fix dotnet export ([GH-84945](https://github.com/godotengine/godot/pull/84945)). +- Add analyzer release tracking ([GH-80343](https://github.com/godotengine/godot/pull/80343)). +- Allow Editor to reload external changes of scripts ([GH-82113](https://github.com/godotengine/godot/pull/82113)). +- Add unit tests for C# source generators ([GH-82955](https://github.com/godotengine/godot/pull/82955)). +- [C#] Enable nullability for variant structs ([GH-82980](https://github.com/godotengine/godot/pull/82980)). +- [C#] Enable nullability for variant classes ([GH-82983](https://github.com/godotengine/godot/pull/82983)). +- [.NET] Fix serialization of delegates capturing variables ([GH-83217](https://github.com/godotengine/godot/pull/83217)). +- Bindings generator langword check ([GH-83504](https://github.com/godotengine/godot/pull/83504)). +- Disable "Activate now" when creating addons ([GH-83578](https://github.com/godotengine/godot/pull/83578)). +- Use `get_instance_binding` instead of set ([GH-84947](https://github.com/godotengine/godot/pull/84947)). +- Bump the `JetBrains.Rider.PathLocator` PackageReference to 1.0.8 ([GH-85460](https://github.com/godotengine/godot/pull/85460)). +- Fix C# script loader does not work reliably ([GH-85504](https://github.com/godotengine/godot/pull/85504)). +- .NET: Add a warning in the inspector when properties might be out of sync ([GH-85869](https://github.com/godotengine/godot/pull/85869)). +- Allow using `[MustBeVariant]` in generic typed attributes ([GH-85908](https://github.com/godotengine/godot/pull/85908)). +- Implement function to throw on null pointers ([GH-85975](https://github.com/godotengine/godot/pull/85975)). +- Correctly free relevant scripts when closing scene tabs ([GH-86008](https://github.com/godotengine/godot/pull/86008)). +- Use string literal instead of nameof ([GH-86373](https://github.com/godotengine/godot/pull/86373)). +- Upgrade TFM for `net472` and some `netstandard2.0` projects ([GH-86454](https://github.com/godotengine/godot/pull/86454)). +- Add unit tests for C# diagnostic analyzers ([GH-86528](https://github.com/godotengine/godot/pull/86528)). +- Fix typo in GD0103 error link ([GH-86592](https://github.com/godotengine/godot/pull/86592)). +- Add code sample language parity check to `make_rst.py` ([GH-86971](https://github.com/godotengine/godot/pull/86971)). +- Fix return type hint for methods ([GH-86972](https://github.com/godotengine/godot/pull/86972)). +- Enforce globalization code quality rules ([GH-87133](https://github.com/godotengine/godot/pull/87133)). +- Enable nullable environment for `GodotTools` ([GH-87137](https://github.com/godotengine/godot/pull/87137)). +- Provide a roslyn analyzers corresponding to the GD0001 and GD0002 ([GH-87253](https://github.com/godotengine/godot/pull/87253)). +- [C#] Fix `Encloses` failing on shared upper bound for `AABB` and `Rect2(I)` ([GH-87264](https://github.com/godotengine/godot/pull/87264)). +- Use SymbolEqualityComparer ([GH-87342](https://github.com/godotengine/godot/pull/87342)). +- Clean a number of C# warnings ([GH-87518](https://github.com/godotengine/godot/pull/87518)). +- Fix incorrect GC handle for non-instantiable types ([GH-87526](https://github.com/godotengine/godot/pull/87526)). +- Fix sorting for generic types when reloading assemblies ([GH-87550](https://github.com/godotengine/godot/pull/87550)). +- Fix not assigning `runtime_initialized` when initializing with AOT ([GH-87597](https://github.com/godotengine/godot/pull/87597)). +- Fix possible deadlock when creating scripts during a background garbage collection ([GH-87669](https://github.com/godotengine/godot/pull/87669)). +- Remove unused code ([GH-87679](https://github.com/godotengine/godot/pull/87679)). +- Fix issues for StringName reference in `CSharpInstanceBridge.Get` ([GH-87682](https://github.com/godotengine/godot/pull/87682)). +- Fix incorrect condition for error filtering ([GH-87790](https://github.com/godotengine/godot/pull/87790)). +- Throw exception when solution file is missing during exporting ([GH-87829](https://github.com/godotengine/godot/pull/87829)). +- Fix duplicate key issue on reload ([GH-87838](https://github.com/godotengine/godot/pull/87838)). +- Improve handling of generic C# types ([GH-87890](https://github.com/godotengine/godot/pull/87890)). +- Add `Callable` `call_deferred()` C# example ([GH-87928](https://github.com/godotengine/godot/pull/87928)). +- Disable signal callback generation in C# ([GH-87952](https://github.com/godotengine/godot/pull/87952)). +- Fix crash when reloading scripts ([GH-88048](https://github.com/godotengine/godot/pull/88048)). +- Fix C# "out of sync" notice with external editors ([GH-88076](https://github.com/godotengine/godot/pull/88076)). +- Fix processing exclusions during export ([GH-88238](https://github.com/godotengine/godot/pull/88238)). +- Fix missing CowData 64-bit promotion for `PackedInt32Array` ([GH-88268](https://github.com/godotengine/godot/pull/88268)). +- Run source generators tests in CI ([GH-88295](https://github.com/godotengine/godot/pull/88295)). +- Various fixes to generic scripts ([GH-88371](https://github.com/godotengine/godot/pull/88371)). +- Match Core implementation of `BinToInt` & `HexToInt` ([GH-88453](https://github.com/godotengine/godot/pull/88453)). +- [.NET] Clean diagnostic rules ([GH-88469](https://github.com/godotengine/godot/pull/88469)). +- Fix building OpenVisualStudio executable ([GH-88475](https://github.com/godotengine/godot/pull/88475)). +- [.NET] Test and fix exports diagnostics ([GH-88495](https://github.com/godotengine/godot/pull/88495)). +- Bump `Rider.PathLocator` nuget version, which provides a fix for detecting Rider installations ([GH-88544](https://github.com/godotengine/godot/pull/88544)). +- [.NET] Better `.editorconfig` setup in `modules/mono/` ([GH-88570](https://github.com/godotengine/godot/pull/88570)). +- Fix Script Editor saves C# files as embedded scripts ([GH-88692](https://github.com/godotengine/godot/pull/88692)). +- Add deprecated message to generated bindings ([GH-88730](https://github.com/godotengine/godot/pull/88730)). +- Revise implementation of C# `Aabb.GetSupport` to match the implementation in `core` ([GH-88919](https://github.com/godotengine/godot/pull/88919)). +- Only check for empty deprecation message if deprecated ([GH-88921](https://github.com/godotengine/godot/pull/88921)). +- Move dotnet-format script to pre-commit ([GH-88933](https://github.com/godotengine/godot/pull/88933)). +- Fix C# epsilon compiler error on double precision build ([GH-88994](https://github.com/godotengine/godot/pull/88994)). +- [.NET] Fix interpolated strings in ScriptPropertyDefVal ([GH-89007](https://github.com/godotengine/godot/pull/89007)). +- Hint fallback property as node when it is a node ([GH-89175](https://github.com/godotengine/godot/pull/89175)). +- Fix warnings in GodotSharp ([GH-89317](https://github.com/godotengine/godot/pull/89317)). +- Implement `InvariantCulture` on Variant strings ([GH-89547](https://github.com/godotengine/godot/pull/89547)). +- Add property `UsingGodotNETSdk` to Godot.NET.Sdk ([GH-89652](https://github.com/godotengine/godot/pull/89652)). +- Fix errors when creating `Variant` from null array ([GH-89756](https://github.com/godotengine/godot/pull/89756)). +- [C#] Fix `Transform3D.InterpolateWith` applying rotation before scale ([GH-89843](https://github.com/godotengine/godot/pull/89843)). +- Fix regression with C# build editor crash due to `EditorHelpHighlighter` ([GH-89861](https://github.com/godotengine/godot/pull/89861)). +- Make internal properties and property accessors public (but hidden) ([GH-90002](https://github.com/godotengine/godot/pull/90002)). +- Add DebugView for Array and Dictionary, based of the DebugView from the .NET Foundation ([GH-90060](https://github.com/godotengine/godot/pull/90060)). +- Fix "Create C# solution" dialog ([GH-90118](https://github.com/godotengine/godot/pull/90118)). +- [.NET] Disable output embedding on macOS, move it to the advanced options on other platforms ([GH-90422](https://github.com/godotengine/godot/pull/90422)). +- Fix ExprMatch for case sensitive matching ([GH-90678](https://github.com/godotengine/godot/pull/90678)). +- Change order of operation for C# types reloading ([GH-90837](https://github.com/godotengine/godot/pull/90837)). +- Don't return MethodInfo for overloaded methods ([GH-90968](https://github.com/godotengine/godot/pull/90968)). +- Enforce using .NET SDK >= 8 ([GH-91079](https://github.com/godotengine/godot/pull/91079)). +- Fill copyright field in .csproj files to ensure that nuget packages will have both license and copyright fields filled ([GH-91144](https://github.com/godotengine/godot/pull/91144)). +- Fix `StringExtensions.CompareTo` IndexOutOfRangeException ([GH-91203](https://github.com/godotengine/godot/pull/91203)). +- Ignore late bound methods in MustBeVariantAnalyzer ([GH-91368](https://github.com/godotengine/godot/pull/91368)). +- Fix generator crash w/ generic arrays ([GH-91375](https://github.com/godotengine/godot/pull/91375)). +- Fix attributes for `sln`/`csproj` files ([GH-91479](https://github.com/godotengine/godot/pull/91479)). +- .NET: Prevent generating mono glue in project folder ([GH-91509](https://github.com/godotengine/godot/pull/91509)). +- [C#] Unexpose `GodotSharp` ([GH-91557](https://github.com/godotengine/godot/pull/91557)). +- CSharpScript should not own method infos of the base class ([GH-91564](https://github.com/godotengine/godot/pull/91564)). +- Fix C# Hint NodeType and ResourceType HintString ([GH-91645](https://github.com/godotengine/godot/pull/91645)). +- Specify a runtime rollforward for OpenVisualStudio ([GH-91670](https://github.com/godotengine/godot/pull/91670)). +- Fix comparison warnings in `StringExtensions.cs` ([GH-91763](https://github.com/godotengine/godot/pull/91763)). +- [C#] Remove useless `isFirstEntry` and useless `source.Append("else ")` ([GH-91924](https://github.com/godotengine/godot/pull/91924)). +- Fix ContextMenu `Copy Error` is off in `MSBuild` Panel ([GH-91996](https://github.com/godotengine/godot/pull/91996)). +- Skip method name when checking CallError ([GH-92800](https://github.com/godotengine/godot/pull/92800)). +- Fix freeze after building C# project with a lot of files ([GH-92893](https://github.com/godotengine/godot/pull/92893)). +- Escape generated members ([GH-93198](https://github.com/godotengine/godot/pull/93198)). +- macOS: Fix codesigning of .NET helper executables when sandboxing is disabled ([GH-94518](https://github.com/godotengine/godot/pull/94518)). +- Replace .NET detection code with `ClassDB::class_exists("CSharpScript")` ([GH-94680](https://github.com/godotengine/godot/pull/94680)). #### Codestyle -- Made hidden ProjectSettings groups more explicit ([GH-61818](https://github.com/godotengine/godot/pull/61818)). -- Extract StyleBoxFlat, StyleBoxTexture and StyleBoxLine in their own file ([GH-68396](https://github.com/godotengine/godot/pull/68396)). -- Extract and reorganize texture resource classes ([GH-68460](https://github.com/godotengine/godot/pull/68460)). -- Add command-line option to run a `MainLoop` by its global class name ([GH-78045](https://github.com/godotengine/godot/pull/78045)). -- Remove unnecessary value assignments throughout the codebase ([GH-78538](https://github.com/godotengine/godot/pull/78538)). -- Remove uses of `vformat()` with no placeholders ([GH-78797](https://github.com/godotengine/godot/pull/78797)). -- Unify and streamline connecting to Resource changes ([GH-78993](https://github.com/godotengine/godot/pull/78993)). -- Remove unused struct from NavigationMesh ([GH-79713](https://github.com/godotengine/godot/pull/79713)). -- Update NavObstacle creation to new Mutex style ([GH-79916](https://github.com/godotengine/godot/pull/79916)). -- Use compile-time Unicode string conversion ([GH-80362](https://github.com/godotengine/godot/pull/80362)). -- Undefine `typed_array.h` templates after use ([GH-80792](https://github.com/godotengine/godot/pull/80792)). -- Remove debug print ([GH-81129](https://github.com/godotengine/godot/pull/81129)). -- Extract `ScriptInstance` into its own file to simplify includes ([GH-81388](https://github.com/godotengine/godot/pull/81388)). -- Don't use auto where not warranted ([GH-81414](https://github.com/godotengine/godot/pull/81414)). -- Core: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81487](https://github.com/godotengine/godot/pull/81487)). -- [Scene,Main] Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81568](https://github.com/godotengine/godot/pull/81568)). -- [Drivers,Platform] Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81583](https://github.com/godotengine/godot/pull/81583)). -- Editor: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81705](https://github.com/godotengine/godot/pull/81705)). -- Modules: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-81760](https://github.com/godotengine/godot/pull/81760)). -- Fix typo in `heuristic_euclidian` helper in AStarGrid2D ([GH-82297](https://github.com/godotengine/godot/pull/82297)). -- Servers: Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-82313](https://github.com/godotengine/godot/pull/82313)). -- Fix some typos in source ([GH-82779](https://github.com/godotengine/godot/pull/82779)). -- Replace `sanity` with `safety` for checks ([GH-83002](https://github.com/godotengine/godot/pull/83002)). -- Replace `ERR_FAIL_COND` with `ERR_FAIL_NULL` where applicable ([GH-83003](https://github.com/godotengine/godot/pull/83003)). -- Fix incorrect null check ([GH-83068](https://github.com/godotengine/godot/pull/83068)). -- Clean up some Editor, OpenXR, VideoStream code ([GH-83683](https://github.com/godotengine/godot/pull/83683)). -- Solve race condition between AThousandShips and Akien ([GH-83740](https://github.com/godotengine/godot/pull/83740)). -- Don't use TTR/RTR for ERR/WARN prints ([GH-84774](https://github.com/godotengine/godot/pull/84774)). +- Move 2D and 3D resources to their own folders ([GH-50148](https://github.com/godotengine/godot/pull/50148)). +- Add const lvalue ref to container parameters ([GH-51156](https://github.com/godotengine/godot/pull/51156)). +- Use `Packed*Array` over `Vector` in Variant ([GH-67220](https://github.com/godotengine/godot/pull/67220)). +- Use `Packed*Array` over `Vector` in TypedArray ([GH-67226](https://github.com/godotengine/godot/pull/67226)). +- Add shorthand for using singleton string names ([GH-81303](https://github.com/godotengine/godot/pull/81303)). +- Add deprecation notice to a duplicate method of class `Window` ([GH-83014](https://github.com/godotengine/godot/pull/83014)). +- Move 2D-only and 3D-only navigation code to its own subfolder ([GH-83133](https://github.com/godotengine/godot/pull/83133)). +- Add const references in `String` class ([GH-84375](https://github.com/godotengine/godot/pull/84375)). +- Clean unnecessary copy detected by clang-tidy ([GH-84508](https://github.com/godotengine/godot/pull/84508)). +- Remove unnecessary assignments ([GH-85071](https://github.com/godotengine/godot/pull/85071)). +- Unify parameter names for RendererCanvasCull ([GH-85421](https://github.com/godotengine/godot/pull/85421)). +- Remove GridMap navigation_layers leftover ([GH-85447](https://github.com/godotengine/godot/pull/85447)). +- Improve message about resources in use at exit ([GH-85464](https://github.com/godotengine/godot/pull/85464)). +- Style: Mark clang-format 16 as supported for pre-commit hook ([GH-85837](https://github.com/godotengine/godot/pull/85837)). +- Improve DynamicBVH code to make it clearer how the stack/heap works ([GH-86059](https://github.com/godotengine/godot/pull/86059)). +- Update deferred calls to use Callables ([GH-86301](https://github.com/godotengine/godot/pull/86301)). +- Fix various spelling errors across engine solution ([GH-86787](https://github.com/godotengine/godot/pull/86787)). +- Change AudioStreamPlayer autoplay and GLTFBufferView getters to be const ([GH-86907](https://github.com/godotengine/godot/pull/86907)). +- Add const lvalue ref to `core/*` container parameters ([GH-86966](https://github.com/godotengine/godot/pull/86966)). +- Fix `#if *_ENABLED` inconsistencies, should check if defined ([GH-87286](https://github.com/godotengine/godot/pull/87286)). +- Simplify RefCounted check in `free()` ([GH-87331](https://github.com/godotengine/godot/pull/87331)). +- Remove unused `prev_rot` variable ([GH-87345](https://github.com/godotengine/godot/pull/87345)). +- Null check improvements ([GH-87370](https://github.com/godotengine/godot/pull/87370)). +- Replace error checks against `size` with `is_empty` ([GH-87371](https://github.com/godotengine/godot/pull/87371)). +- Remove unnecessary `this->` expressions ([GH-87688](https://github.com/godotengine/godot/pull/87688)). +- Use `_v` shorthand for type traits and `if constexpr` where appropriate ([GH-87871](https://github.com/godotengine/godot/pull/87871)). +- Add PropertyListHelper in all simple cases ([GH-88306](https://github.com/godotengine/godot/pull/88306)). +- Fixed binary representation typo in comment ([GH-88326](https://github.com/godotengine/godot/pull/88326)). +- Remove `_HashUnion` from `StringName` ([GH-88339](https://github.com/godotengine/godot/pull/88339)). +- Core: Codestyle improvements to math types ([GH-88467](https://github.com/godotengine/godot/pull/88467)). +- Use `ED_IS_SHORTCUT` macro instead of `matches_event` ([GH-88547](https://github.com/godotengine/godot/pull/88547)). +- Remove word duplicates in comments and strings, and fix casing and punctuation ([GH-88733](https://github.com/godotengine/godot/pull/88733)). +- Remove self includes in some files ([GH-88918](https://github.com/godotengine/godot/pull/88918)). +- Use `Vector*` component-wise `min/max/clamp` functions where applicable ([GH-89111](https://github.com/godotengine/godot/pull/89111)). +- Core: Move `#includes` from `project_settings.h` into `project_settings.cpp` ([GH-89113](https://github.com/godotengine/godot/pull/89113)). +- Enforce template syntax `typename` over `class` ([GH-89270](https://github.com/godotengine/godot/pull/89270)). +- Refactor how file cache entries are stored ([GH-89301](https://github.com/godotengine/godot/pull/89301)). +- Wayland: Stop unreachable warning ([GH-89306](https://github.com/godotengine/godot/pull/89306)). +- clang-tidy: Enforce `modernize-use-nullptr` ([GH-89422](https://github.com/godotengine/godot/pull/89422)). +- Rename some arguments called "position" ([GH-89721](https://github.com/godotengine/godot/pull/89721)). +- Remove pointless `_notification()` function in `EditorPropertyOTVariation` ([GH-89823](https://github.com/godotengine/godot/pull/89823)). +- Add `override` mark to ResourceFormat class ([GH-89863](https://github.com/godotengine/godot/pull/89863)). +- Android: Remove redundant semicolons from Kotlin/gradle files ([GH-90147](https://github.com/godotengine/godot/pull/90147)). +- Update lingering `do/while(0)` defines ([GH-90218](https://github.com/godotengine/godot/pull/90218)). +- Core: Replace `_NO_DISCARD_` macro with `[[nodiscard]]` ([GH-90582](https://github.com/godotengine/godot/pull/90582)). +- Remove some unused SceneTree properties ([GH-90598](https://github.com/godotengine/godot/pull/90598)). +- Move NavigationMeshSourceGeometryData(2D/3D) to the 2D/3D subfolders ([GH-90729](https://github.com/godotengine/godot/pull/90729)). +- Rename internal `is_ascii_char` to `is_ascii_alphabet_char` ([GH-90931](https://github.com/godotengine/godot/pull/90931)). +- Redefine `GetSimpleTypeT<>` in terms of `` ([GH-91104](https://github.com/godotengine/godot/pull/91104)). +- Misc code cleanup ([GH-91183](https://github.com/godotengine/godot/pull/91183)). +- ResourceImporterWAV: Remove unnecessary var declaration ([GH-91214](https://github.com/godotengine/godot/pull/91214)). +- Remove unused variable `Viewport::gui.last_mouse_focus` ([GH-91400](https://github.com/godotengine/godot/pull/91400)). +- Remove unused code to convert text resource format to binary ([GH-91488](https://github.com/godotengine/godot/pull/91488)). +- Replace `find` with `contains/has` where applicable ([GH-91619](https://github.com/godotengine/godot/pull/91619)). +- Fix various typos with codespell ([GH-91650](https://github.com/godotengine/godot/pull/91650)). +- Style: Trim trailing whitespace and ensure newline at EOF ([GH-91696](https://github.com/godotengine/godot/pull/91696)). +- Web: Update to eslint 9 ([GH-91863](https://github.com/godotengine/godot/pull/91863)). +- Use Core/Scene stringnames consistently ([GH-91909](https://github.com/godotengine/godot/pull/91909)). +- Cleanup unused/underused singleton StringNames ([GH-91948](https://github.com/godotengine/godot/pull/91948)). +- CI: Fix incorrect executable perms ([GH-92053](https://github.com/godotengine/godot/pull/92053)). +- Automatically use property count in PropertyListHelper ([GH-92283](https://github.com/godotengine/godot/pull/92283)). +- Replace `.bind(...).call_deferred()` with `.call_deferred(...)` ([GH-92427](https://github.com/godotengine/godot/pull/92427)). +- Style: Change esthetic -> aesthetic ([GH-93977](https://github.com/godotengine/godot/pull/93977)). #### Core -- Check parameter validity in `Object::set_script` ([GH-46125](https://github.com/godotengine/godot/pull/46125)). -- Add `settings_changed` signal to ProjectSettings ([GH-62038](https://github.com/godotengine/godot/pull/62038)). -- Fix the behavior of the resource property of the sub-scene root node on instantiation ([GH-65011](https://github.com/godotengine/godot/pull/65011)). -- Disallow invalid escape sequences in `JSON.parse` ([GH-66170](https://github.com/godotengine/godot/pull/66170)). -- Reimplement Resource.`_setup_local_to_scene` & deprecate signal ([GH-67080](https://github.com/godotengine/godot/pull/67080)). -- Deprecate `Resource.setup_local_to_scene` ([GH-67082](https://github.com/godotengine/godot/pull/67082)). -- Fix crash when saving resources with circular references ([GH-68281](https://github.com/godotengine/godot/pull/68281)). -- Add `type_string()` utility ([GH-69624](https://github.com/godotengine/godot/pull/69624)). -- Add a type conversion method to Variant Utility and expose to scripting ([GH-70080](https://github.com/godotengine/godot/pull/70080)). -- Ensure `MainLoop` and its custom script is set right after it's resolved ([GH-70771](https://github.com/godotengine/godot/pull/70771)). -- Ensure that SceneTree is initialized and finalized at correct time ([GH-72248](https://github.com/godotengine/godot/pull/72248)). -- Avoid sorting CallableCustomMethodPointers by their actual address values ([GH-72346](https://github.com/godotengine/godot/pull/72346)). -- Remove unused `threaded_array_processor.h` ([GH-74012](https://github.com/godotengine/godot/pull/74012)). -- Expose and document `Image.get_mipmap_count()` ([GH-74142](https://github.com/godotengine/godot/pull/74142)). -- Fix `Image.convert()` overwriting custom mipmaps ([GH-74238](https://github.com/godotengine/godot/pull/74238)). -- Support numeric/binary hash comparison for floats derived from Variants (as well as existing semantic comparison) ([GH-74588](https://github.com/godotengine/godot/pull/74588)). -- Expose `_validate_property()` for scripting ([GH-75778](https://github.com/godotengine/godot/pull/75778)). -- Add function `ZIPReader::file_exists` ([GH-76860](https://github.com/godotengine/godot/pull/76860)). -- Add `Node.get_tree_string` and `Node.get_tree_string_pretty` ([GH-77072](https://github.com/godotengine/godot/pull/77072)). -- Add a `--max-fps` command-line argument to set a FPS limit ([GH-78012](https://github.com/godotengine/godot/pull/78012)). -- Make a header for VariantUtilityFunctions ([GH-78108](https://github.com/godotengine/godot/pull/78108)). -- Added `Image::load_svg_from_(buffer|string)` ([GH-78248](https://github.com/godotengine/godot/pull/78248)). -- Add inverse hyperbolic functions `asinh()`, `acosh()` & `atanh()` ([GH-78404](https://github.com/godotengine/godot/pull/78404)). -- Add `String.reverse` method ([GH-78529](https://github.com/godotengine/godot/pull/78529)). -- Refactor CallQueue flushing for clarity ([GH-78612](https://github.com/godotengine/godot/pull/78612)). -- Fix `Object::notification` order ([GH-78634](https://github.com/godotengine/godot/pull/78634)). -- Allow renaming child nodes in `_ready` ([GH-78706](https://github.com/godotengine/godot/pull/78706)). -- Support loading of translations on threads ([GH-78747](https://github.com/godotengine/godot/pull/78747)). -- Fix zero-sized WorkerThreadPool not processing group tasks ([GH-78845](https://github.com/godotengine/godot/pull/78845)). -- Fix `Node::add_sibling` parent check ([GH-78847](https://github.com/godotengine/godot/pull/78847)). -- Fix error when non-ASCII characters in resource pack path ([GH-78935](https://github.com/godotengine/godot/pull/78935)). -- Reimplement scene change ([GH-78988](https://github.com/godotengine/godot/pull/78988)). -- Improve error message for `Node.set_owner` ([GH-79000](https://github.com/godotengine/godot/pull/79000)). -- Fix range error for `Array.slice` ([GH-79103](https://github.com/godotengine/godot/pull/79103)). -- TextServer: Remove excessive Dictionary checks ([GH-79166](https://github.com/godotengine/godot/pull/79166)). -- Fix erroneous `pad_zeros()` warning ([GH-79202](https://github.com/godotengine/godot/pull/79202)). -- Fix `PackedScene::get_last_modified_time()` always returns `0` ([GH-79237](https://github.com/godotengine/godot/pull/79237)). -- Add vararg `call()` method to C++ Callable ([GH-79341](https://github.com/godotengine/godot/pull/79341)). -- Fix byte to float color conversion in `DisplayServerWindows::screen_get_pixel` ([GH-79350](https://github.com/godotengine/godot/pull/79350)). -- Fix recursion level check for array stringification ([GH-79370](https://github.com/godotengine/godot/pull/79370)). -- Fix script name of Hant and Hans ([GH-79654](https://github.com/godotengine/godot/pull/79654)). -- Mention expected resource type in ResourceLoader load error ([GH-79737](https://github.com/godotengine/godot/pull/79737)). -- Add determinant check for minimized windows ([GH-79766](https://github.com/godotengine/godot/pull/79766)). -- FastNoiseLite: Fix cellular jitter using incorrect default value ([GH-79922](https://github.com/godotengine/godot/pull/79922)). -- Disable error condition for accessing safe rect ([GH-79937](https://github.com/godotengine/godot/pull/79937)). -- Fix life cycle of ResourceImporterTexture not tracked properly ([GH-79954](https://github.com/godotengine/godot/pull/79954)). -- String: Fix Unicode parsing error message encoding and related JSON tests ([GH-79980](https://github.com/godotengine/godot/pull/79980)). -- Fix life cycle of ResourceImporterTexture better ([GH-79981](https://github.com/godotengine/godot/pull/79981)). -- Fix global transform validity for `Node2D` and `Control` ([GH-80105](https://github.com/godotengine/godot/pull/80105)). -- Fix typo in modulo error message ([GH-80114](https://github.com/godotengine/godot/pull/80114)). -- Actually store safe-rect in embedder ([GH-80117](https://github.com/godotengine/godot/pull/80117)). -- Usage notes for DEV_ASSERT macro ([GH-80156](https://github.com/godotengine/godot/pull/80156)). -- Avoid crash on exiting due to late prints ([GH-80161](https://github.com/godotengine/godot/pull/80161)). -- Add `rotate_toward` and `angle_difference` methods ([GH-80225](https://github.com/godotengine/godot/pull/80225)). -- Avoid retrieving the object ID of a stack variable if it is nil ([GH-80256](https://github.com/godotengine/godot/pull/80256)). -- Remove `CanvasItem::_invalidate_global_transform` ([GH-80320](https://github.com/godotengine/godot/pull/80320)). -- Use StringName consistently to refer to the Master audio bus name ([GH-80381](https://github.com/godotengine/godot/pull/80381)). -- Deprecate `project_settings_changed` signal ([GH-80450](https://github.com/godotengine/godot/pull/80450)). -- Remove `DDS_INDEXED` from DDSFormat ([GH-80669](https://github.com/godotengine/godot/pull/80669)). -- Allow to get a list of visible embedded `Window`s ([GH-80673](https://github.com/godotengine/godot/pull/80673)). -- Fix CanvasItem notification thread guard ([GH-80752](https://github.com/godotengine/godot/pull/80752)). -- Optimize `String.left()` and `String.right()` ([GH-80824](https://github.com/godotengine/godot/pull/80824)). -- Implement center window function ([GH-81012](https://github.com/godotengine/godot/pull/81012)). -- Fix `JavaScriptBridge.eval()` never returning PackedByteArray ([GH-81015](https://github.com/godotengine/godot/pull/81015)). -- Add check to ensure registered classes are declared ([GH-81020](https://github.com/godotengine/godot/pull/81020)). -- Fix recursion level check for `VariantWriter::write()` with objects ([GH-81123](https://github.com/godotengine/godot/pull/81123)). -- Fix comparison of `Callable`s with binds ([GH-81131](https://github.com/godotengine/godot/pull/81131)). -- Fix consistency of GradientTexture changes ([GH-81137](https://github.com/godotengine/godot/pull/81137)). -- Fix for non-deterministic behavior in PCKPacker ([GH-81280](https://github.com/godotengine/godot/pull/81280)). -- String: Fix string conversion for -0.0 float values ([GH-81328](https://github.com/godotengine/godot/pull/81328)). -- Fix `SIGN(NAN)` returning 1 ([GH-81464](https://github.com/godotengine/godot/pull/81464)). -- Use pass by reference in ZIPPacker & ZIPReader signatures ([GH-81501](https://github.com/godotengine/godot/pull/81501)). -- Add `Vector2/3/4i.MAX` and `MIN` ([GH-81741](https://github.com/godotengine/godot/pull/81741)). -- Crypto: Fix `generate_random_bytes` for large chunks ([GH-81884](https://github.com/godotengine/godot/pull/81884)). -- Fix allocation size overflow check in `CowData` ([GH-81917](https://github.com/godotengine/godot/pull/81917)). -- Remove unnecessary line from `Projection::get_z_far` ([GH-81986](https://github.com/godotengine/godot/pull/81986)). -- Make all render driver project settings require restart ([GH-82008](https://github.com/godotengine/godot/pull/82008)). -- Add support for ImageTexture3D serialization ([GH-82055](https://github.com/godotengine/godot/pull/82055)). -- Made signal handling more uniform during crashes ([GH-82163](https://github.com/godotengine/godot/pull/82163)). -- Replace `radians` range hint with `radians_as_degrees` ([GH-82195](https://github.com/godotengine/godot/pull/82195)). -- Fix not being able to set Node process priority in certain cases ([GH-82358](https://github.com/godotengine/godot/pull/82358)). -- Fix axis getting mixed up when split leaf ([GH-82436](https://github.com/godotengine/godot/pull/82436)). -- Error handling for `FileAccess.get_file_as_*` ([GH-82595](https://github.com/godotengine/godot/pull/82595)). -- Do not replace starting digit with underscore when making identifier ([GH-82786](https://github.com/godotengine/godot/pull/82786)). -- Fix `RBMap`'s, iterator-based, `remove()` ([GH-82797](https://github.com/godotengine/godot/pull/82797)). -- Add missing double-precision flag for Vector4 & Projection in `encode_variant` ([GH-83202](https://github.com/godotengine/godot/pull/83202)). -- Update `triangulate_delaunay()` to avoid needless reallocations ([GH-83434](https://github.com/godotengine/godot/pull/83434)). -- Fix heap-use-after-free when resource loaded with `load_threaded_request` is never fetched ([GH-83782](https://github.com/godotengine/godot/pull/83782)). -- Fix `FastNoiseLite.get_seamless_image` function crash with bad param ([GH-83978](https://github.com/godotengine/godot/pull/83978)). -- Fix invalid return from some `_get/_set` ([GH-84054](https://github.com/godotengine/godot/pull/84054)). -- Prevent `encode_variant` doing `memcpy` from `nullptr` ([GH-84155](https://github.com/godotengine/godot/pull/84155)). -- Fix uninitialized variable in `Image::fix_alpha_edges()` ([GH-84173](https://github.com/godotengine/godot/pull/84173)). -- Fix `FastNoiseLite.get_image` crashes with bad param ([GH-84181](https://github.com/godotengine/godot/pull/84181)). -- Add comment why off-by-one error is hard to fix ([GH-84297](https://github.com/godotengine/godot/pull/84297)). -- Remove unused `NOTIFICATION_NODE_RECACHE_REQUESTED` notification ([GH-84419](https://github.com/godotengine/godot/pull/84419)). -- Keep Variant type after `zero()` ([GH-84597](https://github.com/godotengine/godot/pull/84597)). -- Make languages bookkeeping thread-safe ([GH-84657](https://github.com/godotengine/godot/pull/84657)). -- Fix crash when saving compressed image as JPG & WebP ([GH-84758](https://github.com/godotengine/godot/pull/84758)). -- Fix translation remapping check for imported resources ([GH-84791](https://github.com/godotengine/godot/pull/84791)). -- Let languages init & finish run without locks held ([GH-84847](https://github.com/godotengine/godot/pull/84847)). -- Fix `sizeof` usage for Variant pointers in `alloca` ([GH-84925](https://github.com/godotengine/godot/pull/84925)). -- Let scene replacement benefit from certain late pieces of frame logic ([GH-85184](https://github.com/godotengine/godot/pull/85184)). -- Prevent read-after-free in the queued CallableCustomStaticMethodPointer, fixes `slot >= slot_max` errors in release templates ([GH-85280](https://github.com/godotengine/godot/pull/85280)). +- Add colors to the command-line help ([GH-36252](https://github.com/godotengine/godot/pull/36252)). +- Rename `VariantZeroAssigner` to `VariantDefaultInitializer` ([GH-59186](https://github.com/godotengine/godot/pull/59186)). +- Add `merged` method to allow returning Dictionary after merging ([GH-65526](https://github.com/godotengine/godot/pull/65526)). +- Fix recursive resource local to scene (array/dictionary properties on resources) ([GH-71578](https://github.com/godotengine/godot/pull/71578)). +- Add Unicode support to `String.to_*_case()` methods ([GH-75846](https://github.com/godotengine/godot/pull/75846)). +- Optimize `Color::find_named_color()` ([GH-75860](https://github.com/godotengine/godot/pull/75860)). +- Add a `get_or_add` method to Dictionary ([GH-78095](https://github.com/godotengine/godot/pull/78095)). +- Add SceneTree.get_node_count_in_group() ([GH-78206](https://github.com/godotengine/godot/pull/78206)). +- Add typed array support for binary serialization ([GH-78219](https://github.com/godotengine/godot/pull/78219)). +- Set language encoding flag when using `ZIPPacker` ([GH-78732](https://github.com/godotengine/godot/pull/78732)). +- Fix crash caused by stale owner ([GH-78997](https://github.com/godotengine/godot/pull/78997)). +- TextServer: Fix `get_word_breaks` and its uses ([GH-79054](https://github.com/godotengine/godot/pull/79054)). +- Add `--no-header` option ([GH-79179](https://github.com/godotengine/godot/pull/79179)). +- Expose `Vector*` component-wise and scalar `min/max` to scripting ([GH-80223](https://github.com/godotengine/godot/pull/80223)). +- Expose `Script.get_global_name()` ([GH-80487](https://github.com/godotengine/godot/pull/80487)). +- Fix `reparent()` losing owner ([GH-81506](https://github.com/godotengine/godot/pull/81506)). +- Add `is_valid_letter()` to `TextServer` ([GH-81639](https://github.com/godotengine/godot/pull/81639)). +- Add `NodePath::slice` method ([GH-81822](https://github.com/godotengine/godot/pull/81822)). +- Merge `uid_cache.bin` and `global_script_class_cache.cfg` after mounting PCKs ([GH-82084](https://github.com/godotengine/godot/pull/82084)). +- Help compilers optimize `Object::cast_to()` ([GH-82903](https://github.com/godotengine/godot/pull/82903)). +- Implement `Vector2i/3i/4i` methods: `distance_to` and `distance_squared_to` ([GH-83163](https://github.com/godotengine/godot/pull/83163)). +- Fix Basis `is_orthogonal` and `is_rotation` methods, add `is_orthonormal` ([GH-83229](https://github.com/godotengine/godot/pull/83229)). +- Add `const char *` overloads to String class ([GH-84379](https://github.com/godotengine/godot/pull/84379)). +- Add const references detected by clang-tidy ([GH-84445](https://github.com/godotengine/godot/pull/84445)). +- Optimize `String.humanize_size()` ([GH-84462](https://github.com/godotengine/godot/pull/84462)). +- Make `varray()` variadic ([GH-84581](https://github.com/godotengine/godot/pull/84581)). +- Prevent encoding/decoding objects that cannot be instantiated ([GH-84611](https://github.com/godotengine/godot/pull/84611)). +- Prevent crash on conversion of invalid data in `Image` ([GH-84782](https://github.com/godotengine/godot/pull/84782)). +- Fix duplicating sub-scene may get two copies of internal node ([GH-84824](https://github.com/godotengine/godot/pull/84824)). +- When saving a resource with an exported typed array, check whether the type is an external resource ([GH-85024](https://github.com/godotengine/godot/pull/85024)). +- Prevent copying of `SelfList` and `SelfList::List` ([GH-85180](https://github.com/godotengine/godot/pull/85180)). +- Fix crash when hashing empty `CharString` ([GH-85389](https://github.com/godotengine/godot/pull/85389)). +- UndoRedo: Fix `MERGE_ALL` commit from repeating actions ([GH-85390](https://github.com/godotengine/godot/pull/85390)). +- Prevent infinite recursion when printing errors ([GH-85397](https://github.com/godotengine/godot/pull/85397)). +- Add `PackedVector4Array` Variant type ([GH-85474](https://github.com/godotengine/godot/pull/85474)). +- Fix property groups overriding real properties ([GH-85486](https://github.com/godotengine/godot/pull/85486)). +- Issue template: Change version field to "Tested versions", asking to test earlier versions ([GH-85554](https://github.com/godotengine/godot/pull/85554)). +- Fix RegEx `search_all` for zero length matches/lookahead ([GH-85783](https://github.com/godotengine/godot/pull/85783)). +- Do not reload resources and send notification if locale is not changed ([GH-85787](https://github.com/godotengine/godot/pull/85787)). +- Fix `FileAccessPack::get_buffer` updating position past the length of file ([GH-85991](https://github.com/godotengine/godot/pull/85991)). +- Fix `RegEx.sub` truncating string when `end` is used ([GH-86052](https://github.com/godotengine/godot/pull/86052)). +- Include `name` field in MethodInfo operator == ([GH-86259](https://github.com/godotengine/godot/pull/86259)). +- Add `PackedRealArray` as an alias for `Vector` ([GH-86324](https://github.com/godotengine/godot/pull/86324)). +- Improve error message in text resource format parser ([GH-86350](https://github.com/godotengine/godot/pull/86350)). +- Add and expose Basis/Transform2D/3D division by float operator ([GH-86364](https://github.com/godotengine/godot/pull/86364)). +- Suggest `--headless` CLI argument in DisplayServer not found error message ([GH-86409](https://github.com/godotengine/godot/pull/86409)). +- Fix data race in PagedArray ([GH-86412](https://github.com/godotengine/godot/pull/86412)). +- Ensure special characters are escaped in TSCN connections and editable hint ([GH-86417](https://github.com/godotengine/godot/pull/86417)). +- Add iteration support to `Array` ([GH-86518](https://github.com/godotengine/godot/pull/86518)). +- Remove traces of the extinct RID preallocate feature ([GH-86570](https://github.com/godotengine/godot/pull/86570)). +- Enhance & fix `WorkerThreadPool` ([GH-86587](https://github.com/godotengine/godot/pull/86587)). +- Initialize pointers in `a_star.cpp` ([GH-86590](https://github.com/godotengine/godot/pull/86590)). +- Improve GDExtension Tools Integration with Editor Debug Tooling ([GH-86721](https://github.com/godotengine/godot/pull/86721)). +- Promote CowData to 64 bits ([GH-86730](https://github.com/godotengine/godot/pull/86730)). +- Optimize comparisons for Object's `get_argument_options` ([GH-86743](https://github.com/godotengine/godot/pull/86743)). +- Add autocompletion for `Engine.get_singleton` & similar ([GH-86753](https://github.com/godotengine/godot/pull/86753)). +- Pseudolocalization: Prevent out of bounds reads ([GH-86827](https://github.com/godotengine/godot/pull/86827)). +- Avoid regressing in progress reporting in resource load ([GH-86845](https://github.com/godotengine/godot/pull/86845)). +- Add autocompletion to `get_node_or_null` ([GH-86891](https://github.com/godotengine/godot/pull/86891)). +- Fix wrong fail condition in compressed texture's `_set_data` ([GH-86950](https://github.com/godotengine/godot/pull/86950)). +- Fix ZIPPacker storing file permissions unexpectedly ([GH-86985](https://github.com/godotengine/godot/pull/86985)). +- Fix² behavior of ResourceFormatLoader `CACHE_MODE_REPLACE` ([GH-87008](https://github.com/godotengine/godot/pull/87008)). +- Give EXR saving methods a default value of false like the bindings ([GH-87062](https://github.com/godotengine/godot/pull/87062)). +- Fix `AABB.encloses` failing on shared upper bound ([GH-87118](https://github.com/godotengine/godot/pull/87118)). +- Fix deadlock in `RemoteDebugger::debug` ([GH-87169](https://github.com/godotengine/godot/pull/87169)). +- Fix inaccuracies in the report of leaked objects ([GH-87222](https://github.com/godotengine/godot/pull/87222)). +- Fix renaming a node to the name of its siblings breaking NodePath ([GH-87252](https://github.com/godotengine/godot/pull/87252)). +- Fix `resource_local_to_scene` in arrays and dictionaries ([GH-87268](https://github.com/godotengine/godot/pull/87268)). +- Display values in vector/quaternion math function errors ([GH-87300](https://github.com/godotengine/godot/pull/87300)). +- Implement maximum undo steps in UndoRedo ([GH-87353](https://github.com/godotengine/godot/pull/87353)). +- Add `--log-file` command line argument to write output log to a file ([GH-87373](https://github.com/godotengine/godot/pull/87373)). +- Fix property of type Node duplication when script is attached to a child node ([GH-87387](https://github.com/godotengine/godot/pull/87387)). +- Explicitly initialize all of `FileAccess::create_func[ACCESS_MAX]` ([GH-87389](https://github.com/godotengine/godot/pull/87389)). +- Add check for negative `buffer_size` inside `StreamPeerGZIP::start_(de)compression` ([GH-87448](https://github.com/godotengine/godot/pull/87448)). +- Remove now unused `year` member from `version.py` ([GH-87543](https://github.com/godotengine/godot/pull/87543)). +- Fix `FileAccessMemory` off by one error in `eof_reached` ([GH-87571](https://github.com/godotengine/godot/pull/87571)). +- Manage time singleton in `register_core_types` ([GH-87635](https://github.com/godotengine/godot/pull/87635)). +- Add methods to get argument count of methods ([GH-87680](https://github.com/godotengine/godot/pull/87680)). +- Fix `ResourceLoader.load_threaded_get_status` returning `[0]` constantly in exported projects ([GH-87711](https://github.com/godotengine/godot/pull/87711)). +- Make Callable `bind` method const ([GH-87778](https://github.com/godotengine/godot/pull/87778)). +- Improve `CowData` and `Memory` metadata alignment ([GH-87814](https://github.com/godotengine/godot/pull/87814)). +- Implement a XOR operator for BitField ([GH-87831](https://github.com/godotengine/godot/pull/87831)). +- Update visuals immediately after resizing `Placeholder*` textures ([GH-87854](https://github.com/godotengine/godot/pull/87854)). +- Fix `rpc` call from name based `Callable`s ([GH-87858](https://github.com/godotengine/godot/pull/87858)). +- Extract `SafeBinaryMutex` to separate header ([GH-87893](https://github.com/godotengine/godot/pull/87893)). +- [TextServer / Font] Do not duplicate images to prevent unnecessary embedding ([GH-87971](https://github.com/godotengine/godot/pull/87971)). +- Add newer Variant types to `typed_array.h` ([GH-87992](https://github.com/godotengine/godot/pull/87992)). +- Expose scene unique id functionality in Resource ([GH-88111](https://github.com/godotengine/godot/pull/88111)). +- Link hash table primes externally to prevent data duplication in binary ([GH-88178](https://github.com/godotengine/godot/pull/88178)). +- Allow Ref `instantiate` to accept constructor args ([GH-88183](https://github.com/godotengine/godot/pull/88183)). +- Link `xid_start` and `xid_continue` externally to prevent data duplication in binary ([GH-88203](https://github.com/godotengine/godot/pull/88203)). +- Fix inherited scenes produce errors in editor when `editable_children` is true ([GH-88426](https://github.com/godotengine/godot/pull/88426)). +- Fix owner when importing meshes ([GH-88497](https://github.com/godotengine/godot/pull/88497)). +- Upgrade some array helper classes to 64 bits ([GH-88551](https://github.com/godotengine/godot/pull/88551)). +- Improve thread safety of resource loading ([GH-88561](https://github.com/godotengine/godot/pull/88561)). +- Enhance cache modes in resource loading ([GH-88664](https://github.com/godotengine/godot/pull/88664)). +- Remove spammy dev-mode message about load deadlock prevention ([GH-88706](https://github.com/godotengine/godot/pull/88706)). +- Fix shared exported variables of inherited scenes ([GH-88741](https://github.com/godotengine/godot/pull/88741)). +- Add all `Viewport.debug_draw` enum options to dropdown ([GH-88755](https://github.com/godotengine/godot/pull/88755)). +- Image: Add static `is_format_compressed` function ([GH-88763](https://github.com/godotengine/godot/pull/88763)). +- Fix inefficient list iteration in Node ([GH-88785](https://github.com/godotengine/godot/pull/88785)). +- Do overflow check in when generating NoiseTexture3D ([GH-88823](https://github.com/godotengine/godot/pull/88823)). +- Add `RandomNumberGenerator::rand_weighted` method ([GH-88883](https://github.com/godotengine/godot/pull/88883)). +- Fix `RandomNumberGenerator::rand_weighted` return type ([GH-89104](https://github.com/godotengine/godot/pull/89104)). +- Add scalar versions of `Vector*` `min/max/clamp/snap(ped)` ([GH-89114](https://github.com/godotengine/godot/pull/89114)). +- Save PackedByteArrays as base64 encoded ([GH-89186](https://github.com/godotengine/godot/pull/89186)). +- Fix `String::begins_with` when both strings are empty ([GH-89194](https://github.com/godotengine/godot/pull/89194)). +- Fix sharing of typed arrays from constructor ([GH-89197](https://github.com/godotengine/godot/pull/89197)). +- Refactor OS exit code to be `EXIT_SUCCESS` by default ([GH-89229](https://github.com/godotengine/godot/pull/89229)). +- Clarify bounce and reflect docs and update param names ([GH-89404](https://github.com/godotengine/godot/pull/89404)). +- Fix error where update wouldn't reconnect the signal it should have reconnected and led to errors and crash ([GH-89447](https://github.com/godotengine/godot/pull/89447)). +- Disconnect one-shot signals before calling callbacks ([GH-89451](https://github.com/godotengine/godot/pull/89451)). +- Add output type to DAP `output` events ([GH-89475](https://github.com/godotengine/godot/pull/89475)). +- Prevent further infinite recursion when printing errors ([GH-89490](https://github.com/godotengine/godot/pull/89490)). +- Fix `rand_weighted` not using the current state ([GH-89619](https://github.com/godotengine/godot/pull/89619)). +- Fix crash on `reparent()` with Node containing internal children ([GH-89628](https://github.com/godotengine/godot/pull/89628)). +- Fix property access on read-only `Dictionary` ([GH-89647](https://github.com/godotengine/godot/pull/89647)). +- Stop possible underrun when processing a string ([GH-89671](https://github.com/godotengine/godot/pull/89671)). +- Properly skip printing version header with `--no-header` ([GH-89679](https://github.com/godotengine/godot/pull/89679)). +- Always look for unique node names in owner if not found in owned nodes ([GH-89686](https://github.com/godotengine/godot/pull/89686)). +- Fix incorrect file sort method ([GH-89857](https://github.com/godotengine/godot/pull/89857)). +- Remove a redundant `MAX` comparison within a loop in `compute_image_metrics` ([GH-89889](https://github.com/godotengine/godot/pull/89889)). +- Return `ERR_UNAVAILABLE` if native dialog is not supported ([GH-89902](https://github.com/godotengine/godot/pull/89902)). +- Fix regression when duplicating a node with a resource attached ([GH-89957](https://github.com/godotengine/godot/pull/89957)). +- Use fixed-width integer types in Variant ([GH-89984](https://github.com/godotengine/godot/pull/89984)). +- Fix `ResourceLoader.load` cache with relative paths ([GH-90038](https://github.com/godotengine/godot/pull/90038)). +- Fix some uses of `float` and `real_t` in `core/math` ([GH-90063](https://github.com/godotengine/godot/pull/90063)). +- Don't allow copying file into its own path ([GH-90069](https://github.com/godotengine/godot/pull/90069)). +- Fix load subtask not being registered leading to false progress values ([GH-90091](https://github.com/godotengine/godot/pull/90091)). +- Fix `Variant::construct` of `Object` ([GH-90134](https://github.com/godotengine/godot/pull/90134)). +- Use WorkerThreadPool for Server threads (enhanced) ([GH-90268](https://github.com/godotengine/godot/pull/90268)). +- Make InstancePlaceholders in charge of resolving node references in instances ([GH-90306](https://github.com/godotengine/godot/pull/90306)). +- IO: Fix marshall decoding when script is NIL ([GH-90335](https://github.com/godotengine/godot/pull/90335)). +- Expose `ClassDB::is_enum_bitfield` as `ClassDB::is_class_enum_bitfield` ([GH-90368](https://github.com/godotengine/godot/pull/90368)). +- Fix `ZIPReader.get_files()` error on empty zip files ([GH-90404](https://github.com/godotengine/godot/pull/90404)). +- CommandQueueMT: Fix flush re-entrancy ([GH-90470](https://github.com/godotengine/godot/pull/90470)). +- Revert pack trimming introduced by #82084 ([GH-90476](https://github.com/godotengine/godot/pull/90476)). +- Use `` where applicable ([GH-90540](https://github.com/godotengine/godot/pull/90540)). +- Don't print warning messages for DisplayServer functions in headless mode ([GH-90549](https://github.com/godotengine/godot/pull/90549)). +- Fix incorrect comparison for `Array` const iterator ([GH-90631](https://github.com/godotengine/godot/pull/90631)). +- Fix `Window.hide()` crash when `force_native` changes ([GH-90637](https://github.com/godotengine/godot/pull/90637)). +- Implement `Object.remove_user_signal(signal: StringName)` ([GH-90674](https://github.com/godotengine/godot/pull/90674)). +- Fix `RefCounted` handling in `marshalls.cpp` ([GH-90693](https://github.com/godotengine/godot/pull/90693)). +- Reduce and prevent unnecessary random-access to `List` ([GH-90705](https://github.com/godotengine/godot/pull/90705)). +- Fix incorrect name of internal Basis global scale getter ([GH-90748](https://github.com/godotengine/godot/pull/90748)). +- Fix binary serialization of objects in typed arrays ([GH-90751](https://github.com/godotengine/godot/pull/90751)). +- CommandQueueMT: Optimize & fix handling of sync/ret commands ([GH-90760](https://github.com/godotengine/godot/pull/90760)). +- WorkerThreadPool: Polish yielding (fix corner case, remove misleading warning) ([GH-90809](https://github.com/godotengine/godot/pull/90809)). +- WorkerThreadPool: Fix yield-over for not-yet-started tasks ([GH-90865](https://github.com/godotengine/godot/pull/90865)). +- Utilize initializer lists in Variant constructors ([GH-90866](https://github.com/godotengine/godot/pull/90866)). +- Use compatible text resource format when possible ([GH-90889](https://github.com/godotengine/godot/pull/90889)). +- Strip ANSI escape codes from file logging ([GH-90900](https://github.com/godotengine/godot/pull/90900)). +- Fix `SurfaceTool.create_from_arrays` crash with bad index ([GH-91198](https://github.com/godotengine/godot/pull/91198)). +- Use unztell64 in FileAccessZIP to ensure 64 bit return ([GH-91210](https://github.com/godotengine/godot/pull/91210)). +- Fix unsafe uses of `Callable.is_null()` ([GH-91247](https://github.com/godotengine/godot/pull/91247)). +- Add a note for `String::reverse` to warn about its implementation ([GH-91321](https://github.com/godotengine/godot/pull/91321)). +- Fix a performance regression when duplicating a node ([GH-91329](https://github.com/godotengine/godot/pull/91329)). +- Revert premul alpha to spell without the T ([GH-91399](https://github.com/godotengine/godot/pull/91399)). +- Fix crash when executing `Image.save_jpg_to_buffer` ([GH-91590](https://github.com/godotengine/godot/pull/91590)). +- Add case-insensitive `String::containsn` ([GH-91611](https://github.com/godotengine/godot/pull/91611)). +- Add `LocalVector::has` for convenience ([GH-91621](https://github.com/godotengine/godot/pull/91621)). +- Let materials' shaders update happen on loader threads ([GH-91630](https://github.com/godotengine/godot/pull/91630)). +- Fix crash when adding a child while duplicating a node ([GH-91677](https://github.com/godotengine/godot/pull/91677)). +- CommandQueueMT: Fix sync command awaiters missing the chance ([GH-91725](https://github.com/godotengine/godot/pull/91725)). +- CommandQueueMT: Pre-allocate memory to avoid a bunch of allocations at startup ([GH-91727](https://github.com/godotengine/godot/pull/91727)). +- Fix memory leak when ASTC compression fails ([GH-91745](https://github.com/godotengine/godot/pull/91745)). +- Add an identity check to resource unregistration from cache ([GH-91897](https://github.com/godotengine/godot/pull/91897)). +- Fix `DisplayServer` overrides ([GH-91900](https://github.com/godotengine/godot/pull/91900)). +- Scene: Add `SceneStringNames::pressed` ([GH-91939](https://github.com/godotengine/godot/pull/91939)). +- Scene: Add `SceneStringNames::id_pressed` ([GH-91949](https://github.com/godotengine/godot/pull/91949)). +- Scene: Add `SceneStringNames::panel` ([GH-91950](https://github.com/godotengine/godot/pull/91950)). +- Use `CoreStringNames::normal` in more places ([GH-91953](https://github.com/godotengine/godot/pull/91953)). +- Re-add Variant class initializer, fix comment ([GH-91955](https://github.com/godotengine/godot/pull/91955)). +- Scene: Add `SceneStringNames::font(_size/_color)` ([GH-92588](https://github.com/godotengine/godot/pull/92588)). +- Scene: Add `SceneStringNames::confirmed` ([GH-92639](https://github.com/godotengine/godot/pull/92639)). +- Scene: Add `SceneStringNames::text/value_changed` ([GH-92640](https://github.com/godotengine/godot/pull/92640)). +- Duplicate properties first before remapping resources ([GH-92678](https://github.com/godotengine/godot/pull/92678)). +- Fix callable not clearing freed pointer ([GH-92722](https://github.com/godotengine/godot/pull/92722)). +- Fix some incorrect uses of `String` over `StringName` ([GH-92723](https://github.com/godotengine/godot/pull/92723)). +- Release Engine before unregistering core types ([GH-92733](https://github.com/godotengine/godot/pull/92733)). +- ResourceLoader: Avoid deadlock when awaiting a loader thread that failed early ([GH-93082](https://github.com/godotengine/godot/pull/93082)). +- Remove no longer needed thread safety measures ([GH-93091](https://github.com/godotengine/godot/pull/93091)). +- ResourceLoader: Let the caller thread use its own message queue override ([GH-93124](https://github.com/godotengine/godot/pull/93124)). +- Crypto: Expose `OS.get_entropy` ([GH-93177](https://github.com/godotengine/godot/pull/93177)). +- Improve PO plural translation rules handling ([GH-93262](https://github.com/godotengine/godot/pull/93262)). +- Fix missing cleanup and null checks for various singletons ([GH-93292](https://github.com/godotengine/godot/pull/93292)). +- Fix cleanup order in `unregister_core_types()` ([GH-93293](https://github.com/godotengine/godot/pull/93293)). +- Fix typo in preprocessor symbol ([GH-93367](https://github.com/godotengine/godot/pull/93367)). +- Fix storing of Node Array properties ([GH-93430](https://github.com/godotengine/godot/pull/93430)). +- Lookup method also in base scripts of a PlaceHolderScriptInstance ([GH-93452](https://github.com/godotengine/godot/pull/93452)). +- ResourceLoader: Fix handling of uncached loads ([GH-93540](https://github.com/godotengine/godot/pull/93540)). +- Fix duplicating nodes with Array properties ([GH-93672](https://github.com/godotengine/godot/pull/93672)). +- ResourceLoader: Support polling and get-before-complete on the main thread ([GH-93695](https://github.com/godotengine/godot/pull/93695)). +- WorkerThreadPool: Fix wrong pointer used in the case of BinaryMutex ([GH-93709](https://github.com/godotengine/godot/pull/93709)). +- Improve `vformat` error reporting on `sprintf` failure ([GH-93897](https://github.com/godotengine/godot/pull/93897)). +- ResourceLoader: Fixup management of thread-specific status ([GH-93928](https://github.com/godotengine/godot/pull/93928)). +- Add a check to prevent user to call `AStarGrid2D::update` when its not needed ([GH-93993](https://github.com/godotengine/godot/pull/93993)). +- Fix UTF-8 misinterpreted as Latin-1 when logging to file ([GH-94006](https://github.com/godotengine/godot/pull/94006)). +- ResourceLoader: Fix error message due to already-awaited tasks being re-awaited ([GH-94070](https://github.com/godotengine/godot/pull/94070)). +- Optimize `Node::is_readable_from_caller_thread()` by prioritizing the most common case ([GH-94230](https://github.com/godotengine/godot/pull/94230)). +- Fix TypedArray encoding when full objects is disabled ([GH-94379](https://github.com/godotengine/godot/pull/94379)). +- Batch of fixes for WorkerThreadPool and ResourceLoader (safe set) ([GH-94526](https://github.com/godotengine/godot/pull/94526)). +- End benchmark of `Main::setup` properly before calling `setup2` ([GH-94587](https://github.com/godotengine/godot/pull/94587)). +- Apply `prefer_wayland` only if no display driver is set ([GH-94774](https://github.com/godotengine/godot/pull/94774)). +- Fix use-after-free in WorkerThreadPool ([GH-94832](https://github.com/godotengine/godot/pull/94832)). +- ResourceLoader: Let resource setup late steps invoke loading in turn ([GH-94910](https://github.com/godotengine/godot/pull/94910)). +- ResourceLoader: Add check to prevent double free crashes ([GH-95186](https://github.com/godotengine/godot/pull/95186)). +- Fix use-after-free in `FileAccess::exists` ([GH-95311](https://github.com/godotengine/godot/pull/95311)). +- ResourceLoader: Fix error on querying progress for uncached loads ([GH-95476](https://github.com/godotengine/godot/pull/95476)). #### Documentation -- Document when to use `_unhandled_key_input` over `_unhandled_input` ([GH-42100](https://github.com/godotengine/godot/pull/42100)). -- Overhaul Rect2 & Rect2i Documentation ([GH-69816](https://github.com/godotengine/godot/pull/69816)). -- Improve documentation of `nearest_po2()` ([GH-72091](https://github.com/godotengine/godot/pull/72091)). -- Improve the top docs sections of VFX classes ([GH-78865](https://github.com/godotengine/godot/pull/78865)). -- Fix a typo in the `String.to_float` description ([GH-78989](https://github.com/godotengine/godot/pull/78989)). -- Fix a typo in the TLSOptions documentation ([GH-79048](https://github.com/godotengine/godot/pull/79048)). -- Doctool: Remove version attribute from XML header ([GH-79092](https://github.com/godotengine/godot/pull/79092)). -- Fix incorrect documentation for `Engine.get_architecture_name()` ([GH-79174](https://github.com/godotengine/godot/pull/79174)). -- Fix various typos in documentation ([GH-79223](https://github.com/godotengine/godot/pull/79223)). -- Fix rigid body `contact_monitor` property description ([GH-79250](https://github.com/godotengine/godot/pull/79250)). -- Add performance note for parsing source geometry ([GH-79252](https://github.com/godotengine/godot/pull/79252)). -- Clarify return value of `get_dependencies()` ([GH-79306](https://github.com/godotengine/godot/pull/79306)). -- Clarify `EditorExportPlugin::add_file` only remaps in `_export_file` ([GH-79310](https://github.com/godotengine/godot/pull/79310)). -- Fix documentation for consistency ([GH-79353](https://github.com/godotengine/godot/pull/79353)). -- Add detail to NavigationAgent signal descriptions ([GH-79401](https://github.com/godotengine/godot/pull/79401)). -- Fill in descriptions for import options in the class reference ([GH-79405](https://github.com/godotengine/godot/pull/79405)). -- Clarify the purpose of RichTextLabel text highlight padding ([GH-79571](https://github.com/godotengine/godot/pull/79571)). -- Clarify when the `changed` signal is emitted for `Resource` and `Material` ([GH-79656](https://github.com/godotengine/godot/pull/79656)). -- Fix many typos in documentation ([GH-79661](https://github.com/godotengine/godot/pull/79661)). -- Add detail to emitting docs for particles ([GH-79720](https://github.com/godotengine/godot/pull/79720)). -- Clarify `set_multiplayer_authority` documentation regarding propagation ([GH-79764](https://github.com/godotengine/godot/pull/79764)). -- Fix some mixups between 2D/3D in documentation ([GH-79781](https://github.com/godotengine/godot/pull/79781)). -- Update outdated C# code sample in `AStarGrid2D` documentation ([GH-79794](https://github.com/godotengine/godot/pull/79794)). -- Document `linear_stiffness` in SoftBody3D ([GH-79933](https://github.com/godotengine/godot/pull/79933)). -- Add note about mouse movement input events in `MouseFilter` constants ([GH-79934](https://github.com/godotengine/godot/pull/79934)). -- Update C# example of `tween_method` with a parameter to the lambda method ([GH-79962](https://github.com/godotengine/godot/pull/79962)). -- Avoid punning `[param enabled]` in documentation ([GH-80066](https://github.com/godotengine/godot/pull/80066)). -- Fix invalid use of markdown syntax in classref ([GH-80109](https://github.com/godotengine/godot/pull/80109)). -- Overhaul bool documentation ([GH-80141](https://github.com/godotengine/godot/pull/80141)). -- Fix packet details of ENetConnection `EventType` `EVENT_RECEIVE` documentation ([GH-80182](https://github.com/godotengine/godot/pull/80182)). -- Document that `Input.is_action_*` should not be used during input-handling ([GH-80185](https://github.com/godotengine/godot/pull/80185)). -- Revert incorrect `Rect2.expand` description ([GH-80217](https://github.com/godotengine/godot/pull/80217)). -- Fix various typos in classref ([GH-80243](https://github.com/godotengine/godot/pull/80243)). -- Fix wrong example output of `float*Color` in classref ([GH-80245](https://github.com/godotengine/godot/pull/80245)). -- Clarify relationship between `basis` and `transform` properties of `Node3D` ([GH-80254](https://github.com/godotengine/godot/pull/80254)). -- Clarify `SceneTree.current_scene` functionality ([GH-80264](https://github.com/godotengine/godot/pull/80264)). -- Consistency for NodePath doc code examples ([GH-80443](https://github.com/godotengine/godot/pull/80443)). -- Document `RenderingServer.get_video_adapter_name()` may report a fixed name ([GH-80445](https://github.com/godotengine/godot/pull/80445)). -- Fixed tiny spelling error in NavigationAgent2D docs ([GH-80474](https://github.com/godotengine/godot/pull/80474)). -- Fix example for `Object._set` documentation ([GH-80475](https://github.com/godotengine/godot/pull/80475)). -- Document behavior of the `application/config/version` project setting ([GH-80511](https://github.com/godotengine/godot/pull/80511)). -- Clarify the behavior of CSGMesh using ArrayMesh ([GH-80543](https://github.com/godotengine/godot/pull/80543)). -- Change documentation spelling of macOS key 'Command' to match guidelines ([GH-80567](https://github.com/godotengine/godot/pull/80567)). -- docs: Fix link to two's complement wiki page ([GH-80608](https://github.com/godotengine/godot/pull/80608)). -- Add missing tutorials to documentation classes ([GH-80653](https://github.com/godotengine/godot/pull/80653)). -- Clarify existence of groups ([GH-80677](https://github.com/godotengine/godot/pull/80677)). -- Document `pick_random` for empty arrays ([GH-80694](https://github.com/godotengine/godot/pull/80694)). -- Fix empty XML tag doc in XMLParser.xml ([GH-80698](https://github.com/godotengine/godot/pull/80698)). -- Add missing RenderingDevice method descriptions ([GH-80716](https://github.com/godotengine/godot/pull/80716)). -- Document mouse-picking limit of 64 objects ([GH-80875](https://github.com/godotengine/godot/pull/80875)). -- Fix various typos in classref ([GH-80884](https://github.com/godotengine/godot/pull/80884)). -- Clarify Array class methods that return error ([GH-80936](https://github.com/godotengine/godot/pull/80936)). -- Rephrase ConfigFile class methods error description ([GH-80970](https://github.com/godotengine/godot/pull/80970)). -- Improve XMLParser's documentation ([GH-80997](https://github.com/godotengine/godot/pull/80997)). -- Improve Line2D documentation ([GH-81084](https://github.com/godotengine/godot/pull/81084)). -- Add a note about `SceneTree.create_tween()` method ([GH-81087](https://github.com/godotengine/godot/pull/81087)). -- Improve `MeshDataTool.get_face_vertex()` method description ([GH-81088](https://github.com/godotengine/godot/pull/81088)). -- Improve `Object.get_property_list()` method description ([GH-81093](https://github.com/godotengine/godot/pull/81093)). -- Some grammar and punctuation enhancements in the class reference ([GH-81097](https://github.com/godotengine/godot/pull/81097)). -- Grammatical improvements for the RayCast 2D and 3D class references ([GH-81132](https://github.com/godotengine/godot/pull/81132)). -- Fix typo in WebRTCPeerConnection documentation ([GH-81157](https://github.com/godotengine/godot/pull/81157)). -- Document integer scaling functionality and limitation ([GH-81176](https://github.com/godotengine/godot/pull/81176)). -- Fix typos in NavigationAgent3D documentation ([GH-81190](https://github.com/godotengine/godot/pull/81190)). -- Fix misleading description of `MeshDataTool.get_vertex()` method ([GH-81212](https://github.com/godotengine/godot/pull/81212)). -- Use `[constant]` instead of `[code]` when possible ([GH-81228](https://github.com/godotengine/godot/pull/81228)). -- Fix typos in LineEdit documentation ([GH-81232](https://github.com/godotengine/godot/pull/81232)). -- docs: Update AABB `get_support` description ([GH-81249](https://github.com/godotengine/godot/pull/81249)). -- Improve canvas layer index documentation ([GH-81270](https://github.com/godotengine/godot/pull/81270)). -- Fix unmatched brackets in the documentation ([GH-81330](https://github.com/godotengine/godot/pull/81330)). -- Fix description of dock slot usage in the documentation ([GH-81445](https://github.com/godotengine/godot/pull/81445)). -- Document ScrollContainer signals being emitted for touch events only ([GH-81517](https://github.com/godotengine/godot/pull/81517)). -- Doc: Reference String <-> PackedByteArray conversions from each other ([GH-81564](https://github.com/godotengine/godot/pull/81564)). -- Fix typos in EditorDebuggerPlugin and RDShaderSPIRV classref ([GH-81565](https://github.com/godotengine/godot/pull/81565)). -- Add an example for `Dictionary.merge()`, mention lack of recursion ([GH-81622](https://github.com/godotengine/godot/pull/81622)). -- Add missing `is_deprecated` flag on the `SurfaceTool.generate_lod` function ([GH-81634](https://github.com/godotengine/godot/pull/81634)). -- Add note about format to splash image description ([GH-81672](https://github.com/godotengine/godot/pull/81672)). -- Add missing documentation for `Skeleton3D` methods ([GH-81697](https://github.com/godotengine/godot/pull/81697)). -- Improve VisibleOnScreen classes' docs ([GH-81774](https://github.com/godotengine/godot/pull/81774)). -- Fix required parameter values for 2D textures in `RenderingDevice.texture_clear()` ([GH-81936](https://github.com/godotengine/godot/pull/81936)). -- Fix example in gravity project settings doc ([GH-81967](https://github.com/godotengine/godot/pull/81967)). -- docs: Fix incorrect GL format code for 16 bit float formats ([GH-82050](https://github.com/godotengine/godot/pull/82050)). -- Fix documentation on how to get the keycode string from a `physical_keycode` ([GH-82092](https://github.com/godotengine/godot/pull/82092)). -- Docs: Update and sync Window and DisplayServer window mode descriptions ([GH-82179](https://github.com/godotengine/godot/pull/82179)). -- Document that `resource_name` is not always supported ([GH-82406](https://github.com/godotengine/godot/pull/82406)). -- Clarify difference between surface material and surface override material ([GH-82499](https://github.com/godotengine/godot/pull/82499)). -- Fix metadata name in MovieWriter.xml ([GH-82541](https://github.com/godotengine/godot/pull/82541)). -- Improve SeparationRayShape docs ([GH-82544](https://github.com/godotengine/godot/pull/82544)). -- Fix `RefCounted.unreference()` documentation providing wrong info ([GH-82557](https://github.com/godotengine/godot/pull/82557)). -- Document `get_time_zone_from_system` will return a localized timezone name ([GH-82609](https://github.com/godotengine/godot/pull/82609)). -- Improve `NavigationAgent3D.target_position` documentation readability ([GH-82671](https://github.com/godotengine/godot/pull/82671)). -- Add docs for Node3DGizmo to clarify its link to EditorNode3DGizmo ([GH-82681](https://github.com/godotengine/godot/pull/82681)). -- Clarify `AStarGrid2D.is_in_bounds` functionality ([GH-82724](https://github.com/godotengine/godot/pull/82724)). -- Fix typos in documentation: `than/then` and `loose/lose` ([GH-82748](https://github.com/godotengine/godot/pull/82748)). -- Add a recommendation to turn on type hints with untyped declaration warning ([GH-82801](https://github.com/godotengine/godot/pull/82801)). -- Clarify `change_dir()` and access scopes ([GH-82849](https://github.com/godotengine/godot/pull/82849)). -- Specify the behavior of `get_tree()` when the node is not in the scene tree ([GH-82863](https://github.com/godotengine/godot/pull/82863)). -- Added docs for DRAW_ORDER_REVERSE_LIFETIME constant and minor XR log improvement ([GH-82866](https://github.com/godotengine/godot/pull/82866)). -- Fixed a missing word ([GH-82883](https://github.com/godotengine/godot/pull/82883)). -- Add `sdf_collision` property description to LightOccluder2D ([GH-82906](https://github.com/godotengine/godot/pull/82906)). -- Explain circular references and how to break them ([GH-82942](https://github.com/godotengine/godot/pull/82942)). -- Update `draw_polyline` documentation to clarify negative width behavior ([GH-82991](https://github.com/godotengine/godot/pull/82991)). -- Add documentation on which buttons JOY_BUTTON_START corresponds to ([GH-83013](https://github.com/godotengine/godot/pull/83013)). -- Update SpinBox documentation to include resetting to min/max behavior ([GH-83038](https://github.com/godotengine/godot/pull/83038)). -- Add semicolon to OS documentation case statement ([GH-83066](https://github.com/godotengine/godot/pull/83066)). -- Cleanup various repository documentation files ([GH-83095](https://github.com/godotengine/godot/pull/83095)). -- Make error suggestion less ambiguous ([GH-83327](https://github.com/godotengine/godot/pull/83327)). -- Document UID behavior in ResourceSaver's save function ([GH-83388](https://github.com/godotengine/godot/pull/83388)). -- Docs: Fix link to Android Gradle build tutorial ([GH-83433](https://github.com/godotengine/godot/pull/83433)). -- Document `AudioStreamGeneratorPlayback.get_skips()` ([GH-83435](https://github.com/godotengine/godot/pull/83435)). -- Fix description of `Animation::copy_track` ([GH-83441](https://github.com/godotengine/godot/pull/83441)). -- Clarify docs for operators performing `xform_inv` ([GH-83461](https://github.com/godotengine/godot/pull/83461)). -- Doc: Change return type of `_Set` method from `void` to `bool` in C# code example ([GH-83602](https://github.com/godotengine/godot/pull/83602)). -- Fix Object class C# syntax error ([GH-83609](https://github.com/godotengine/godot/pull/83609)). -- Clarify `NOTIFICATION_SCROLL_BEGIN/END` behavior ([GH-83636](https://github.com/godotengine/godot/pull/83636)). -- Fill remaining global scope constant descriptions ([GH-83652](https://github.com/godotengine/godot/pull/83652)). -- ProjectSettings: Fix description of physics jitter ([GH-83768](https://github.com/godotengine/godot/pull/83768)). -- Add C# Example to ImmediateMesh.xml ([GH-83839](https://github.com/godotengine/godot/pull/83839)). -- Improve documentation related for particle subemitters, collision and attractors ([GH-83916](https://github.com/godotengine/godot/pull/83916)). -- Fill out Material documentation and clarify `render_priority` and `next_pass` sorting ([GH-83931](https://github.com/godotengine/godot/pull/83931)). -- Fixed `window_width_override` description ([GH-84101](https://github.com/godotengine/godot/pull/84101)). -- Fix typo in ConcavePolygonShape2D/3D description ([GH-84111](https://github.com/godotengine/godot/pull/84111)). -- Add missing word in `NOTIFICATION_POST_ENTER_TREE` documentation ([GH-84224](https://github.com/godotengine/godot/pull/84224)). -- Fix documentation in MultiplayerAPIExtension ([GH-84226](https://github.com/godotengine/godot/pull/84226)). -- Add a description for the `velocity_pivot` parameter ([GH-84276](https://github.com/godotengine/godot/pull/84276)). -- Update `add_submenu_item` doc to mention that submenu should already exist ([GH-84283](https://github.com/godotengine/godot/pull/84283)). -- Clarify that `get_time_zone_from_system` will return a localized timezone name ([GH-84301](https://github.com/godotengine/godot/pull/84301)). -- Fix sentence in RandomNumberGenerator.xml ([GH-84322](https://github.com/godotengine/godot/pull/84322)). -- Update the description for the `InputEventMagnifyGesture` and `InputEventPanGesture` gestures ([GH-84408](https://github.com/godotengine/godot/pull/84408)). -- Sync changes between ShapeCast and RayCast class references ([GH-84567](https://github.com/godotengine/godot/pull/84567)). -- Resolve collisions in reference anchors added for methods ([GH-84618](https://github.com/godotengine/godot/pull/84618)). -- Add C# example for the AudioStreamGenerator code snippet ([GH-84648](https://github.com/godotengine/godot/pull/84648)). -- Remove a redundant semicolon from `max_fps` documentation ([GH-84667](https://github.com/godotengine/godot/pull/84667)). -- Clarify that `DisplayServer.window_set_*_callback` aren't supported on Window nodes ([GH-84669](https://github.com/godotengine/godot/pull/84669)). -- Fix link in the docs about ResourceImporterTextureAtlas ([GH-84698](https://github.com/godotengine/godot/pull/84698)). -- Fix a property reference in `EditorSpinSlider` documentation ([GH-84709](https://github.com/godotengine/godot/pull/84709)). -- Fix typo in `TextureServer.font_get_face_index()` description ([GH-84784](https://github.com/godotengine/godot/pull/84784)). -- Link to runtime loading/saving tutorial and improve Image documentation ([GH-84844](https://github.com/godotengine/godot/pull/84844)). -- Mark `SubViewportContainer::_propagate_input_event` experimental ([GH-84911](https://github.com/godotengine/godot/pull/84911)). -- Fix translation po file not found when `make rst LANGARG=zh_CN` ([GH-85073](https://github.com/godotengine/godot/pull/85073)). -- Enhance `SceneTree.change_scene*()` methods' docs ([GH-85279](https://github.com/godotengine/godot/pull/85279)). -- Add changelog for Godot 4.2 ([GH-85510](https://github.com/godotengine/godot/pull/85509)). +- Overhaul Node documentation ([GH-68560](https://github.com/godotengine/godot/pull/68560)). +- Tweak SceneTree Documentation ([GH-68649](https://github.com/godotengine/godot/pull/68649)). +- Overhaul Array documentation ([GH-69451](https://github.com/godotengine/godot/pull/69451)). +- Use `Signal.emit` instead of `emit_signal` in Object examples ([GH-69662](https://github.com/godotengine/godot/pull/69662)). +- Document the upsides and downsides of packed arrays versus typed arrays ([GH-78257](https://github.com/godotengine/godot/pull/78257)). +- Update typed arrays documentation ([GH-79075](https://github.com/godotengine/godot/pull/79075)). +- Clarify `Tween.set_parallel()` ([GH-79758](https://github.com/godotengine/godot/pull/79758)). +- Clarify that `Callable` will not be encoded with `var_to_bytes` ([GH-79813](https://github.com/godotengine/godot/pull/79813)). +- Clarify when to construct a StringName ahead of time ([GH-79815](https://github.com/godotengine/godot/pull/79815)). +- Explain which nodes receive `NOTIFICATION_WM_SIZE_CHANGED` ([GH-80094](https://github.com/godotengine/godot/pull/80094)). +- Fix physics server force integration docs ([GH-80166](https://github.com/godotengine/godot/pull/80166)). +- Overhaul NodePath documentation ([GH-80183](https://github.com/godotengine/godot/pull/80183)). +- Overhaul OS documentation ([GH-80282](https://github.com/godotengine/godot/pull/80282)). +- Overhaul Engine singleton documentation ([GH-80372](https://github.com/godotengine/godot/pull/80372)). +- Make RST docs consistent with Editor Help docs ([GH-80690](https://github.com/godotengine/godot/pull/80690)). +- Improve docs on how ParallaxLayer mirroring works ([GH-80896](https://github.com/godotengine/godot/pull/80896)). +- Clarify `PackedByteArray.decompress*` limitations with external data ([GH-81689](https://github.com/godotengine/godot/pull/81689)). +- Tweaks to ViewportTexture's Documentation ([GH-81864](https://github.com/godotengine/godot/pull/81864)). +- Document worker thread pool project settings and `TreeItem.uncollapse_tree()` ([GH-82376](https://github.com/godotengine/godot/pull/82376)). +- Clarify some descriptions regarding resource cache ([GH-82884](https://github.com/godotengine/godot/pull/82884)). +- Improve Node's documentation on `process_mode` related members/methods ([GH-82889](https://github.com/godotengine/godot/pull/82889)). +- Rewrite docs for physics damping project settings ([GH-82950](https://github.com/godotengine/godot/pull/82950)). +- Document Bounce = 1.0 not being sufficient for infinite energy conservation ([GH-82968](https://github.com/godotengine/godot/pull/82968)). +- Clarify that some `ParticleProcessMaterial` properties have effect over the lifetime ([GH-83606](https://github.com/godotengine/godot/pull/83606)). +- Clarify emitting behavior of GPU particles ([GH-83622](https://github.com/godotengine/godot/pull/83622)). +- Expanded documentation for vector slide and project ([GH-83691](https://github.com/godotengine/godot/pull/83691)). +- Add instructions to get shape of `RayCast2D/3D` ([GH-83735](https://github.com/godotengine/godot/pull/83735)). +- Improve and clarify texture filtering documentation ([GH-83907](https://github.com/godotengine/godot/pull/83907)). +- Clarify behavior of RayCast when `get_collision_point()` is used inside a collision shape ([GH-84085](https://github.com/godotengine/godot/pull/84085)). +- Complete the docs for Quaternion ([GH-84140](https://github.com/godotengine/godot/pull/84140)). +- Add details about `AudioEffectCapture.clear_buffer()` and `get_buffer()` ([GH-84584](https://github.com/godotengine/godot/pull/84584)). +- Avoid punning enum names in documentation ([GH-84652](https://github.com/godotengine/godot/pull/84652)). +- Clarify that `@GlobalScope.clamp` does not do component-wise clamping ([GH-84656](https://github.com/godotengine/godot/pull/84656)). +- Add performance note to `Array.resize()` ([GH-84666](https://github.com/godotengine/godot/pull/84666)). +- Add description to `AnimationNodeStateMachine.replace_node` ([GH-84734](https://github.com/godotengine/godot/pull/84734)). +- Document changing the window's resizable status at runtime ([GH-84886](https://github.com/godotengine/godot/pull/84886)). +- Update WorkerThreadPool doc to mention every task should be waited so that any allocated resources can be cleaned up ([GH-84926](https://github.com/godotengine/godot/pull/84926)). +- Fix example in `NodePath.get_name()` documentation ([GH-85240](https://github.com/godotengine/godot/pull/85240)). +- Add descriptions to all RDUniform methods ([GH-85336](https://github.com/godotengine/godot/pull/85336)). +- Improve documentation for dynamic properties ([GH-85450](https://github.com/godotengine/godot/pull/85450)). +- Clarify difference between Capture and Record audio effects ([GH-85468](https://github.com/godotengine/godot/pull/85468)). +- Fix documentation for `icon_and_font_color` editor setting ([GH-85491](https://github.com/godotengine/godot/pull/85491)). +- Fix the documentation of `Bone2D::apply_rest` ([GH-85503](https://github.com/godotengine/godot/pull/85503)). +- Improve documentation for `CameraAttributesPhysical.exposure_shutter_speed` ([GH-85599](https://github.com/godotengine/godot/pull/85599)). +- Explain parameter usage in GPUParticles3D and GPUParticles2D ([GH-85717](https://github.com/godotengine/godot/pull/85717)). +- Clarify Shapecast safe/unsafe fraction difference in class reference ([GH-85839](https://github.com/godotengine/godot/pull/85839)). +- Fix missing heading in translated online class reference ([GH-85877](https://github.com/godotengine/godot/pull/85877)). +- Document `AudioServer.playback_speed_scale` in `Engine.time_scale` ([GH-86071](https://github.com/godotengine/godot/pull/86071)). +- Update the description of the method `get_connection_list` in GraphEdit ([GH-86161](https://github.com/godotengine/godot/pull/86161)). +- Add description for rendering/limits/spatial_indexer/threaded_cull_minimum_instances ([GH-86246](https://github.com/godotengine/godot/pull/86246)). +- Add descriptions to remaining properties of RDSamplerState ([GH-86273](https://github.com/godotengine/godot/pull/86273)). +- Remove pointer to deprecated class page from Skeleton3D ([GH-86326](https://github.com/godotengine/godot/pull/86326)). +- Improve RichTextLabel `install_effect()` documentation ([GH-86331](https://github.com/godotengine/godot/pull/86331)). +- Add note that a large value for `Label.outline_size` is not recommended ([GH-86345](https://github.com/godotengine/godot/pull/86345)). +- Clarify doc: `Node.get_child` returns null for invalid index ([GH-86349](https://github.com/godotengine/godot/pull/86349)). +- Fix various typos in documentation ([GH-86549](https://github.com/godotengine/godot/pull/86549)). +- Fix several reported issues in String's documentation ([GH-86639](https://github.com/godotengine/godot/pull/86639)). +- Correct C# syntax in `_validate_property` example for the Object class ([GH-86649](https://github.com/godotengine/godot/pull/86649)). +- Add code examples to Basis' documentation ([GH-86664](https://github.com/godotengine/godot/pull/86664)). +- Link to mentioned articles in the docs instead of just naming them ([GH-86666](https://github.com/godotengine/godot/pull/86666)). +- Fix incorrect VehicleWheel3D Roll Influence description ([GH-86672](https://github.com/godotengine/godot/pull/86672)). +- Update `get_image` doc to mention that it will return an empty image with invalid texture ([GH-86685](https://github.com/godotengine/godot/pull/86685)). +- Improve all documentation about MIDI support ([GH-86693](https://github.com/godotengine/godot/pull/86693)). +- Add C# examples in `Basis.xml` ([GH-86742](https://github.com/godotengine/godot/pull/86742)). +- Fix various typos in documentation ([GH-86820](https://github.com/godotengine/godot/pull/86820)). +- Add documentation to JavaClass & JavaClassWrapper ([GH-86839](https://github.com/godotengine/godot/pull/86839)). +- Specify how CanvasTexture does not work in 3D ([GH-86848](https://github.com/godotengine/godot/pull/86848)). +- Add a few notes to Sprite3D's documentation ([GH-86872](https://github.com/godotengine/godot/pull/86872)). +- Add missing descriptions to TextServer's constants ([GH-86895](https://github.com/godotengine/godot/pull/86895)). +- Post-merge fixes to Node & OS documentation ([GH-86903](https://github.com/godotengine/godot/pull/86903)). +- Fill the documentation of a few overlooked classes ([GH-86927](https://github.com/godotengine/godot/pull/86927)). +- Add missing documentation for AudioStream & AudioStreamPlayback ([GH-86958](https://github.com/godotengine/godot/pull/86958)). +- Add class reference documentation for GDExtension & GDExtensionManager ([GH-86968](https://github.com/godotengine/godot/pull/86968)). +- Add documentation to EditorExportPlatformWeb ([GH-86977](https://github.com/godotengine/godot/pull/86977)). +- Add missing documentation to Viewport ([GH-86994](https://github.com/godotengine/godot/pull/86994)). +- Add missing descriptions for Image's documentation ([GH-86997](https://github.com/godotengine/godot/pull/86997)). +- Add missing descriptions to PrimitiveMesh and SoftBody3D ([GH-87011](https://github.com/godotengine/godot/pull/87011)). +- Add documentation to PhysicsServer2DExtension ([GH-87018](https://github.com/godotengine/godot/pull/87018)). +- Mention `CollisionPolygon2D.polygon` is local to the given CollisionPolygon2D ([GH-87024](https://github.com/godotengine/godot/pull/87024)). +- Add documentation to PhysicsDirectBodyState2DExtension ([GH-87030](https://github.com/godotengine/godot/pull/87030)). +- Add miscellaneous documentation to some classes ([GH-87042](https://github.com/godotengine/godot/pull/87042)). +- Add missing descriptions to remaining signals ([GH-87047](https://github.com/godotengine/godot/pull/87047)). +- Add descriptions to a few RenderingDevice's PipelineDynamicStateFlags ([GH-87082](https://github.com/godotengine/godot/pull/87082)). +- Overhaul AABB's documentation ([GH-87114](https://github.com/godotengine/godot/pull/87114)). +- Add descriptions to the remaining properties of RDPipelineDepthStencilState ([GH-87156](https://github.com/godotengine/godot/pull/87156)). +- Overhaul Basis' documentation ([GH-87175](https://github.com/godotengine/godot/pull/87175)). +- Include `animation.length` in Animation example ([GH-87180](https://github.com/godotengine/godot/pull/87180)). +- Overhaul Quaternion documentation ([GH-87181](https://github.com/godotengine/godot/pull/87181)). +- Replace some "uncommon" words in class reference ([GH-87223](https://github.com/godotengine/godot/pull/87223)). +- Add missing descriptions for SliderJoint3D's `param` methods ([GH-87244](https://github.com/godotengine/godot/pull/87244)). +- Add "missing description" tag to constant & enum documentation ([GH-87259](https://github.com/godotengine/godot/pull/87259)). +- Overhaul Transform3D documentation ([GH-87334](https://github.com/godotengine/godot/pull/87334)). +- Document bone list for SkeletonProfileHumanoid ([GH-87372](https://github.com/godotengine/godot/pull/87372)). +- Use latest doc version in issue template ([GH-87409](https://github.com/godotengine/godot/pull/87409)). +- Tweak Timer documentation ([GH-87436](https://github.com/godotengine/godot/pull/87436)). +- Tweak XROrigin3D documentation ([GH-87444](https://github.com/godotengine/godot/pull/87444)). +- Clarify sizing of main screen plugins ([GH-87445](https://github.com/godotengine/godot/pull/87445)). +- Tweak Joint2D and Joint3D documentation for consistency ([GH-87446](https://github.com/godotengine/godot/pull/87446)). +- Fix several minor class reference issues ([GH-87523](https://github.com/godotengine/godot/pull/87523)). +- Modify display and documentation of attenuation for Light3D ([GH-87583](https://github.com/godotengine/godot/pull/87583)). +- Mention Multiplayer.`get_remote_sender_id`'s 0 after await ([GH-87610](https://github.com/godotengine/godot/pull/87610)). +- Mention and deprecate InputEventJoypadButton's pressure ([GH-87676](https://github.com/godotengine/godot/pull/87676)). +- Add descriptions to the remaining properties of RDPipelineRasterizationState ([GH-87768](https://github.com/godotengine/godot/pull/87768)). +- Minor fix in DisplayServer docs to include Linux & Windows in `FEATURE_NATIVE_DIALOG` ([GH-87913](https://github.com/godotengine/godot/pull/87913)). +- Fix inverted link in docs ([GH-87951](https://github.com/godotengine/godot/pull/87951)). +- Remove duplicate `ARRAY_CUSTOM_RGBA8_UNORM` ref in Mesh docs ([GH-87973](https://github.com/godotengine/godot/pull/87973)). +- Document `OS.execute()` limitations on Android ([GH-87983](https://github.com/godotengine/godot/pull/87983)). +- Fix docs for Color class regarding bits per component ([GH-87985](https://github.com/godotengine/godot/pull/87985)). +- Improve documentation on Android package unique name ([GH-88024](https://github.com/godotengine/godot/pull/88024)). +- Document initial position project settings not affecting run from editor ([GH-88040](https://github.com/godotengine/godot/pull/88040)). +- Document using RichTextLabel's `meta_clicked` to handle clickable URLs ([GH-88255](https://github.com/godotengine/godot/pull/88255)). +- Fix type-o in `OpenXRAPIExtension` docs for `is_environment_blend_mode_alpha_supported()` ([GH-88298](https://github.com/godotengine/godot/pull/88298)). +- Treat deprecated/experimental members as documented ([GH-88401](https://github.com/godotengine/godot/pull/88401)). +- Update many Deprecated/Experimental descriptions for consistency ([GH-88443](https://github.com/godotengine/godot/pull/88443)). +- Fix function description for `Font.get_char_size()` ([GH-88444](https://github.com/godotengine/godot/pull/88444)). +- Fix some leftover references to `hint_albedo` in docs ([GH-88503](https://github.com/godotengine/godot/pull/88503)). +- Fix "dimensionnal" typo ([GH-88559](https://github.com/godotengine/godot/pull/88559)). +- Clarify that `is_pixel_opaque` function gets position in local coordinates ([GH-88593](https://github.com/godotengine/godot/pull/88593)). +- C#: Document that MainLoop needs to be registered in the global class ([GH-88635](https://github.com/godotengine/godot/pull/88635)). +- Add keywords to improve search in the class reference ([GH-88641](https://github.com/godotengine/godot/pull/88641)). +- Docs: Fix some experimental/deprecated hints ([GH-88708](https://github.com/godotengine/godot/pull/88708)). +- Clarify behavior of opening a new file in `FileAccess` ([GH-88758](https://github.com/godotengine/godot/pull/88758)). +- Doc: Fix GDScript casing of `String.num_scientific` ([GH-88767](https://github.com/godotengine/godot/pull/88767)). +- Document that `parse_input_event` doesn't influence the OS ([GH-88810](https://github.com/godotengine/godot/pull/88810)). +- Add necessary elaboration to documentation for `Node3D::get_parent_node_3d` ([GH-88841](https://github.com/godotengine/godot/pull/88841)). +- Explain gutter types in the TextEdit documentation ([GH-88875](https://github.com/godotengine/godot/pull/88875)). +- Clarify C# Color opacity comment ([GH-88909](https://github.com/godotengine/godot/pull/88909)). +- Doc: Fix some incorrect uses of "children" ([GH-88920](https://github.com/godotengine/godot/pull/88920)). +- RTL: Clarify that line, paragraph, and character numbers are zero-indexed ([GH-88956](https://github.com/godotengine/godot/pull/88956)). +- Doc: Clarify some details about deferred calls ([GH-88961](https://github.com/godotengine/godot/pull/88961)). +- Move `rendering/2d/snap/snap_2d_vertices_to_pixel` setting to advanced view ([GH-88963](https://github.com/godotengine/godot/pull/88963)). +- Overhaul some "uncommon" wording in class reference ([GH-89036](https://github.com/godotengine/godot/pull/89036)). +- Document environment glow restrictions in the Compatibility rendering method ([GH-89059](https://github.com/godotengine/godot/pull/89059)). +- [C#] Fix typo in `Color` documentation ([GH-89092](https://github.com/godotengine/godot/pull/89092)). +- Fix documentation of `XMLParser::get_node_name()` ([GH-89141](https://github.com/godotengine/godot/pull/89141)). +- Class reference: Improve TileMap `get_cell_atlas_coords` documentation ([GH-89146](https://github.com/godotengine/godot/pull/89146)). +- Address a few issues in Transform3D documentation ([GH-89147](https://github.com/godotengine/godot/pull/89147)). +- Update file dialog filter documentation ([GH-89150](https://github.com/godotengine/godot/pull/89150)). +- Docs: [C#] Use `PropertyName` constants in more places ([GH-89246](https://github.com/godotengine/godot/pull/89246)). +- Doc: Clarify `bsearch(_custom)` behavior ([GH-89280](https://github.com/godotengine/godot/pull/89280)). +- Reduce indentation in `XRInterface` class document example code ([GH-89282](https://github.com/godotengine/godot/pull/89282)). +- Use `[codeblock lang=text]` more often in class reference ([GH-89316](https://github.com/godotengine/godot/pull/89316)). +- Add keywords to `PhysicsBody{2D,3D}.test_move()` for easier discoverability ([GH-89318](https://github.com/godotengine/godot/pull/89318)). +- Fix RST generation for `[codeblock lang=text]` ([GH-89380](https://github.com/godotengine/godot/pull/89380)). +- Doc: Fix some incorrect uses of `a/an` ([GH-89444](https://github.com/godotengine/godot/pull/89444)). +- Doc: Clarify description for `get_unix_time_from_system` on UTC ([GH-89454](https://github.com/godotengine/godot/pull/89454)). +- Fix description of touch input position ([GH-89509](https://github.com/godotengine/godot/pull/89509)). +- Doc: Fix Parallax2D use of closer/further ([GH-89590](https://github.com/godotengine/godot/pull/89590)). +- Doc: Clarify behavior of `String.format` with keys in replacements ([GH-89608](https://github.com/godotengine/godot/pull/89608)). +- Fix documentation for receiving light from light probes ([GH-89699](https://github.com/godotengine/godot/pull/89699)). +- Doc: Fix casing of some C# names ([GH-89710](https://github.com/godotengine/godot/pull/89710)). +- Improve some notification and translation docs ([GH-89815](https://github.com/godotengine/godot/pull/89815)). +- Add reference to InputEventJoypadButton in `_shortcut_input` doc ([GH-89838](https://github.com/godotengine/godot/pull/89838)). +- Fix wrong return type mention in `AStarGrid2D` docs ([GH-89862](https://github.com/godotengine/godot/pull/89862)). +- Doc: Document loading behavior with relative paths ([GH-90039](https://github.com/godotengine/godot/pull/90039)). +- Doc: Clarify the behavior of `Vector2/3.cross` and mention parallel vectors ([GH-90072](https://github.com/godotengine/godot/pull/90072)). +- Fix small error in Variant doc ([GH-90088](https://github.com/godotengine/godot/pull/90088)). +- Doc: Improve description of `y_sort_enabled` ([GH-90096](https://github.com/godotengine/godot/pull/90096)). +- Clarify `UndoRedo` `MergeMode` and `add_*_reference` docs ([GH-90263](https://github.com/godotengine/godot/pull/90263)). +- Update the location of editor theme ([GH-90307](https://github.com/godotengine/godot/pull/90307)). +- Update links to outdated asset library demos ([GH-90310](https://github.com/godotengine/godot/pull/90310)). +- Doc: Add hint for required ios camera plugin in CameraServer documentation ([GH-90389](https://github.com/godotengine/godot/pull/90389)). +- Fix `RenderingServer.instance_set_transform` docs saying it's not global ([GH-90396](https://github.com/godotengine/godot/pull/90396)). +- Document Area3D wind properties only affecting SoftBody3D ([GH-90407](https://github.com/godotengine/godot/pull/90407)). +- Surface normals are not the same thing as collision normals for `move_and_slide()` ([GH-90460](https://github.com/godotengine/godot/pull/90460)). +- Improve `custom_minimum_size` description ([GH-90521](https://github.com/godotengine/godot/pull/90521)). +- Doc: Fix incorrect reference to `input_pickable` ([GH-90622](https://github.com/godotengine/godot/pull/90622)). +- Doc: Clarify behavior of `FileAccess.get_line` ([GH-90766](https://github.com/godotengine/godot/pull/90766)). +- Update outdated `low_processor_usage_mode` doc ([GH-90785](https://github.com/godotengine/godot/pull/90785)). +- Remove experimental flag from `remove_user_signal()` ([GH-90862](https://github.com/godotengine/godot/pull/90862)). +- Correct AnimationNode documentation where it mentions multiple inputs ([GH-90962](https://github.com/godotengine/godot/pull/90962)). +- Clarify docs for ParticleProcessMaterial `emission_box_extents` ([GH-90967](https://github.com/godotengine/godot/pull/90967)). +- Fix incorrect C# in `OS.get_cmdline_args` docs ([GH-90985](https://github.com/godotengine/godot/pull/90985)). +- Document AudioEffectSpectrumAnalyzerInstance, clarify relationship with AudioEffectSpectrumAnalyzer ([GH-91034](https://github.com/godotengine/godot/pull/91034)). +- Clarify transform inheritance of CanvasItem nodes ([GH-91110](https://github.com/godotengine/godot/pull/91110)). +- Fix syntax error in `camera_attributes_set_exposure` documentation ([GH-91129](https://github.com/godotengine/godot/pull/91129)). +- Docs: Fix FileAccess example conflicting with global scope `load` ([GH-91189](https://github.com/godotengine/godot/pull/91189)). +- Fix documentation typo that flipped the description of `window_set_max_size` and `window_set_min_size` ([GH-91234](https://github.com/godotengine/godot/pull/91234)). +- Make it clear `Node2D.look_at()` aligns the +X axis ([GH-91293](https://github.com/godotengine/godot/pull/91293)). +- Mention ProjectSettings won't be affected by `convert_text_resources_to_binary` ([GH-91300](https://github.com/godotengine/godot/pull/91300)). +- Update Variant documentation comment about `class_name` ([GH-91313](https://github.com/godotengine/godot/pull/91313)). +- Document 0, 90, 180, and 270 degree TileMap cell rotations ([GH-91330](https://github.com/godotengine/godot/pull/91330)). +- Update CryptoKey documentation to mention ECC ([GH-91348](https://github.com/godotengine/godot/pull/91348)). +- Update the description and parameter name for Vector3 reflect to correct how the plane is constructed ([GH-91376](https://github.com/godotengine/godot/pull/91376)). +- Remove text saying low processor mode only works on desktop ([GH-91393](https://github.com/godotengine/godot/pull/91393)). +- Minor `PackedScene` documentation improvements ([GH-91415](https://github.com/godotengine/godot/pull/91415)). +- Fix outdated `AudioEffectSpectrumAnalyzer` documentation ([GH-91423](https://github.com/godotengine/godot/pull/91423)). +- Fix incorrect example in the documentation for the `expand` method in `Rect2` ([GH-91446](https://github.com/godotengine/godot/pull/91446)). +- Class reference: Add self-links to methods, properties, etc ([GH-91537](https://github.com/godotengine/godot/pull/91537)). +- Add notes in Object documentation about TranslationServer methods ([GH-91544](https://github.com/godotengine/godot/pull/91544)). +- Update ResourceLoader docs to clarify behavior when no file is found during load call ([GH-91571](https://github.com/godotengine/godot/pull/91571)). +- Update `area_create` description in `PhysicsServer2D/3D` to clear up possible confusions ([GH-91581](https://github.com/godotengine/godot/pull/91581)). +- Add docs note about remap returning undefined when istart == istop ([GH-91615](https://github.com/godotengine/godot/pull/91615)). +- Add missing bone name return information ([GH-91658](https://github.com/godotengine/godot/pull/91658)). +- Doc: Update Crypto example ([GH-91761](https://github.com/godotengine/godot/pull/91761)). +- Fix a typo in the GridMap docs ([GH-91917](https://github.com/godotengine/godot/pull/91917)). +- Fix hashing context example ([GH-91920](https://github.com/godotengine/godot/pull/91920)). +- TextServer: Add notes about high level text/font classes and getting active server instance ([GH-91974](https://github.com/godotengine/godot/pull/91974)). +- Improve documentation on TreeItem's cell modes ([GH-92112](https://github.com/godotengine/godot/pull/92112)). +- Fix example for Basis * Vector3 in documentation ([GH-92117](https://github.com/godotengine/godot/pull/92117)). +- Clarify `is_polygon_clockwise()` coordinate system ([GH-92154](https://github.com/godotengine/godot/pull/92154)). +- Fix confusing descriptions of ConfirmationDialog ([GH-92242](https://github.com/godotengine/godot/pull/92242)). +- Explain `add_to_end` parameter of `add_property_editor()` ([GH-92272](https://github.com/godotengine/godot/pull/92272)). +- Clarify `velocity_computed` signal description ([GH-92293](https://github.com/godotengine/godot/pull/92293)). +- Fix outdated `vsync_mode` project setting documentation ([GH-92363](https://github.com/godotengine/godot/pull/92363)). +- Improve `Mesh` class description ([GH-92380](https://github.com/godotengine/godot/pull/92380)). +- Improve description of `find_item_by_name()` method in `MeshLibrary` class documentation ([GH-92416](https://github.com/godotengine/godot/pull/92416)). +- Fix `PhysicsMaterial` description being limited to 3D ([GH-92451](https://github.com/godotengine/godot/pull/92451)). +- Fix Light3D BakeMode enum documentation ([GH-92456](https://github.com/godotengine/godot/pull/92456)). +- RTL: Add references to cell and column configuration methods ([GH-92508](https://github.com/godotengine/godot/pull/92508)). +- Fix mismatched parentheses in class reference ([GH-92535](https://github.com/godotengine/godot/pull/92535)). +- Improve `AudioStreamPlaylist` class reference ([GH-92674](https://github.com/godotengine/godot/pull/92674)). +- Clarify the results of `VectorN.normalized()` in the docs ([GH-92707](https://github.com/godotengine/godot/pull/92707)). +- Correct documentation for Omni and Spot light distance attenuation ([GH-92716](https://github.com/godotengine/godot/pull/92716)). +- Remove note about night sky in PhysicalSkyMaterial ([GH-92758](https://github.com/godotengine/godot/pull/92758)). +- Fix description for `Input.vibrate_handheld()` ([GH-92860](https://github.com/godotengine/godot/pull/92860)). +- Update Node docs to change iOS to Android for `NOTIFICATION_WM_GO_BACK_REQUEST` ([GH-93189](https://github.com/godotengine/godot/pull/93189)). +- Doc: Clarify the session-specific nature of `RID` and `ObjectID` ([GH-93190](https://github.com/godotengine/godot/pull/93190)). +- Fix description of `Vector2/3.dot` ([GH-93195](https://github.com/godotengine/godot/pull/93195)). +- Mention inverse of hex functions in `Color` ([GH-93218](https://github.com/godotengine/godot/pull/93218)). +- Animation: Document frame duration units in `SpriteFrames` ([GH-93233](https://github.com/godotengine/godot/pull/93233)). +- Clarify lightmap rebaking being required for LightmapProbe changes ([GH-93373](https://github.com/godotengine/godot/pull/93373)). +- Change suggestion in `CONTRIBUTING.md` to avoid spam ([GH-93468](https://github.com/godotengine/godot/pull/93468)). +- Fix incorrect text in ResourceImporterWAV description ([GH-93497](https://github.com/godotengine/godot/pull/93497)). +- Change "sample" to "stream" in AudioStreamWAV documentation ([GH-93499](https://github.com/godotengine/godot/pull/93499)). +- Add "repeat" keyword alias for InputEvent "echo" in the class reference ([GH-93562](https://github.com/godotengine/godot/pull/93562)). +- Clarify word separator docs about shortcuts ([GH-93665](https://github.com/godotengine/godot/pull/93665)). +- Update note regarding 3D MSAA and foveated rendering ([GH-93685](https://github.com/godotengine/godot/pull/93685)). +- GraphEdit: Add a note about the behavior of `get_children()` ([GH-93732](https://github.com/godotengine/godot/pull/93732)). +- Fix asset pipeline coordinate systems doc url ([GH-93770](https://github.com/godotengine/godot/pull/93770)). +- Fix "icon" parameter in EditorPlugin.add_custom_type is not optional but doc says it is ([GH-93777](https://github.com/godotengine/godot/pull/93777)). +- Doc: Fix inverted Y position description of y-sorting ([GH-93804](https://github.com/godotengine/godot/pull/93804)). +- Fix info about global library in `add_animation_library` method docs ([GH-93818](https://github.com/godotengine/godot/pull/93818)). +- Update documentation for new `EditorExportPlugin` behavior ([GH-93820](https://github.com/godotengine/godot/pull/93820)). +- Fix AnimationMixer docs example code for `get_root_motion_rotation_accumulator` ([GH-93855](https://github.com/godotengine/godot/pull/93855)). +- Clarify that the `Mesh.ARRAY_NORMAL` array will normalize its contents internally ([GH-93872](https://github.com/godotengine/godot/pull/93872)). +- Add `:` to node properties, to differentiate them from node paths ([GH-93890](https://github.com/godotengine/godot/pull/93890)). +- Mention `timeout` unit in `ENetConnection::service` docs ([GH-93927](https://github.com/godotengine/godot/pull/93927)). +- Clarify `get_executable_path` documentation for Mac ([GH-93944](https://github.com/godotengine/godot/pull/93944)). +- Clarify that `ENetConnection`'s `create_host` and `service` must be called on client and server ([GH-93987](https://github.com/godotengine/godot/pull/93987)). +- Update docs for `Animation.track_set_path` and `AnimationMixer.root_motion_track` ([GH-94007](https://github.com/godotengine/godot/pull/94007)). +- Clarify that some exclude properties of physics query parameters are copied ([GH-94059](https://github.com/godotengine/godot/pull/94059)). +- Overhaul Transform2D documentation ([GH-94127](https://github.com/godotengine/godot/pull/94127)). +- Add `push_url` as a keyword for `push_meta` ([GH-94129](https://github.com/godotengine/godot/pull/94129)). +- Clarify that `Resource.duplicate(true)` doesn't duplicate subresources inside `Array` or `Dictionary` properties ([GH-94142](https://github.com/godotengine/godot/pull/94142)). +- Fix unclear `PROPERTY_USAGE_STORAGE`/`EDITOR` description ([GH-94155](https://github.com/godotengine/godot/pull/94155)). +- Docs: Add some notes about native file dialog limitations ([GH-94161](https://github.com/godotengine/godot/pull/94161)). +- Clean up RenderDataExtension's descriptions ([GH-94217](https://github.com/godotengine/godot/pull/94217)). +- Add a note of `loop_mode` for `custom_timeline` to the `NodeAnimation` docs ([GH-94299](https://github.com/godotengine/godot/pull/94299)). +- Clarify `clipboard_get_image()` ([GH-94325](https://github.com/godotengine/godot/pull/94325)). +- Some improvements to TileSetScenesCollectionSource docs ([GH-94329](https://github.com/godotengine/godot/pull/94329)). +- Clarify `is_visible_in_tree()` in CanvasItem ([GH-94331](https://github.com/godotengine/godot/pull/94331)). +- Fix typo in AABB docs ([GH-94389](https://github.com/godotengine/godot/pull/94389)). +- Fix texture compression descriptions in RenderingDevice docs ([GH-94393](https://github.com/godotengine/godot/pull/94393)). +- Add tutorial link to Parallax2D doc ([GH-94433](https://github.com/godotengine/godot/pull/94433)). +- Font: Fix typo in `get_supported_variation_list` example ([GH-94443](https://github.com/godotengine/godot/pull/94443)). +- Add note about `Script.has_source_code` and GDScript binary tokenization ([GH-94527](https://github.com/godotengine/godot/pull/94527)). +- Clarify documentation for `AnimationPlayer.queue` ([GH-94541](https://github.com/godotengine/godot/pull/94541)). +- Add note to `shadow_mesh` docs to warn about improper usage ([GH-94547](https://github.com/godotengine/godot/pull/94547)). +- Update link in CONTRIBUTING.md ([GH-94565](https://github.com/godotengine/godot/pull/94565)). +- Document update spinner never displaying with `--debug-canvas-item-redraw` ([GH-94702](https://github.com/godotengine/godot/pull/94702)). +- Add link to notification docs in SceneTree docs ([GH-94719](https://github.com/godotengine/godot/pull/94719)). +- Update documentation for places to receive InputEventShortcut ([GH-94745](https://github.com/godotengine/godot/pull/94745)). +- Fix typo in Array's `sort()` method description ([GH-94842](https://github.com/godotengine/godot/pull/94842)). +- Fix doc on Vector2.cs's `/` operator ([GH-94850](https://github.com/godotengine/godot/pull/94850)). +- Document alternatives to some static Color methods ([GH-94879](https://github.com/godotengine/godot/pull/94879)). +- Mention Multimesh custom data will be compressed to half in Compatibility ([GH-94942](https://github.com/godotengine/godot/pull/94942)). +- Fix type-o in `MobileVRInterface` sample code in docs: `xr` -> `use_xr` ([GH-94994](https://github.com/godotengine/godot/pull/94994)). +- Fix typo in EditorPlugin `_forward_3d_draw_over_viewport(overlay)` method example ([GH-94997](https://github.com/godotengine/godot/pull/94997)). +- Document support 3D premultiplied alpha in ResourceImporterTexture ([GH-95004](https://github.com/godotengine/godot/pull/95004)). +- Clean up English in JSON documentation ([GH-95041](https://github.com/godotengine/godot/pull/95041)). +- Fix several typos in the documentation ([GH-95046](https://github.com/godotengine/godot/pull/95046)). +- Document converting a TileMap node to TileMapLayer using the editor ([GH-95069](https://github.com/godotengine/godot/pull/95069)). +- Document expected coordinates in `PopupMenu.popup()` ([GH-95164](https://github.com/godotengine/godot/pull/95164)). +- Fix documentation of `EditorImportPlugin._Import` ([GH-95335](https://github.com/godotengine/godot/pull/95335)). +- Fix typo in EditorImportPlugin docs ([GH-95336](https://github.com/godotengine/godot/pull/95336)). +- Fix check in `Object._ValidateProperty` example ([GH-95341](https://github.com/godotengine/godot/pull/95341)). +- Clarify usage of CompositorEffect as an abstract base class ([GH-95347](https://github.com/godotengine/godot/pull/95347)). +- Incorrect reference to VisibleOnScreenEnabler3D/2D in VisibleOnScreenNotifier3D/2D documentation ([GH-95409](https://github.com/godotengine/godot/pull/95409)). +- Add Animation tutorial links to class reference by 4.3 ([GH-95434](https://github.com/godotengine/godot/pull/95434)). #### Editor -- Replace all flags with one value when holding Ctrl/Cmd in the layers editor ([GH-39364](https://github.com/godotengine/godot/pull/39364)). -- Improve `CodeEdit`'s toggle comments behavior ([GH-44557](https://github.com/godotengine/godot/pull/44557)). -- Document editor import options in the class reference ([GH-49524](https://github.com/godotengine/godot/pull/49524)). -- Reorganize buttons in the project manager ([GH-50674](https://github.com/godotengine/godot/pull/50674)). -- Streamline the project import workflow ([GH-51478](https://github.com/godotengine/godot/pull/51478)). -- Focus current node after connecting ([GH-54071](https://github.com/godotengine/godot/pull/54071)). -- Allow enter key to add properties to replication editor list ([GH-65558](https://github.com/godotengine/godot/pull/65558)). -- Add editor setting to toggle automatic code completion ([GH-68140](https://github.com/godotengine/godot/pull/68140)). -- Replace Ctrl in editor shortcuts with Cmd or Ctrl depending on platform ([GH-71905](https://github.com/godotengine/godot/pull/71905)). -- Overhaul the Gradient Editor ([GH-71915](https://github.com/godotengine/godot/pull/71915)). -- Don't save scripts when exiting editor ([GH-73641](https://github.com/godotengine/godot/pull/73641)). -- Fix Filter Files shortcut input is not properly handled ([GH-73981](https://github.com/godotengine/godot/pull/73981)). -- Fix conversion of hex color strings in project converter ([GH-74026](https://github.com/godotengine/godot/pull/74026)). -- Add coloring for completion of vector components ([GH-74809](https://github.com/godotengine/godot/pull/74809)). -- Expose 'Reimport' on right-click context menu in the FileSystem panel ([GH-75137](https://github.com/godotengine/godot/pull/75137)). -- Added `--gpu-index` to `forwardable_cli_arguments` ([GH-75198](https://github.com/godotengine/godot/pull/75198)). -- Enhance NodePath property editing ([GH-75274](https://github.com/godotengine/godot/pull/75274)). -- Ensure binds are duplicated with `Node` signals ([GH-75382](https://github.com/godotengine/godot/pull/75382)). -- Make `EditorInterface` accessible as a singleton ([GH-75694](https://github.com/godotengine/godot/pull/75694)). -- Apply new input validation method for Create Plugin dialog ([GH-76778](https://github.com/godotengine/godot/pull/76778)). -- Expose `save_all_scenes` method to EditorInterface ([GH-77537](https://github.com/godotengine/godot/pull/77537)). -- Increase vertical size of `CurveEdit` when `Inspector` widens ([GH-77625](https://github.com/godotengine/godot/pull/77625)). -- Allow to pick which Resources will be made unique ([GH-77855](https://github.com/godotengine/godot/pull/77855)). -- Fix batch rename for unique name and empty name ([GH-78292](https://github.com/godotengine/godot/pull/78292)). -- Change light themes default contrast from -0.08 to -0.06 ([GH-78297](https://github.com/godotengine/godot/pull/78297)). -- Auto-update properties when replacing a node ([GH-78300](https://github.com/godotengine/godot/pull/78300)). -- Only display 15 nodes in the Recent section of the Create New Node dialog ([GH-78309](https://github.com/godotengine/godot/pull/78309)). -- Fix tooltip of enum value without description ([GH-78524](https://github.com/godotengine/godot/pull/78524)). -- Speed up closing multiple scripts ([GH-78604](https://github.com/godotengine/godot/pull/78604)). -- Re-enable docs cache with fixes ([GH-78615](https://github.com/godotengine/godot/pull/78615)). -- Use bullet points in shader editor creation dialog ([GH-78631](https://github.com/godotengine/godot/pull/78631)). -- Tweak documentation to use bold font when a class is referencing itself ([GH-78649](https://github.com/godotengine/godot/pull/78649)). -- Fix indentation in script templates ([GH-78675](https://github.com/godotengine/godot/pull/78675)). -- Standardize dialog input validation as a new class ([GH-78744](https://github.com/godotengine/godot/pull/78744)). -- Sort project tags before saving ([GH-78775](https://github.com/godotengine/godot/pull/78775)). -- Project converter: Use same rendering driver as Project Manager ([GH-78795](https://github.com/godotengine/godot/pull/78795)). -- Fix drag-dropping nodes to parent with internal nodes ([GH-78816](https://github.com/godotengine/godot/pull/78816)). -- Fix history mismatch ([GH-78827](https://github.com/godotengine/godot/pull/78827)). -- Improve material and mesh preview buttons ([GH-78858](https://github.com/godotengine/godot/pull/78858)). -- Add icons for 3D texture classes ([GH-78903](https://github.com/godotengine/godot/pull/78903)). -- Fix dropping files from `res://` to `res://` ([GH-78914](https://github.com/godotengine/godot/pull/78914)). -- Do not change a node unique name to the same name ([GH-78925](https://github.com/godotengine/godot/pull/78925)). -- Translate "No match" message in FindReplaceBar ([GH-78938](https://github.com/godotengine/godot/pull/78938)). -- Windows: Always double-quote path when launching explorer.exe to browse ([GH-78963](https://github.com/godotengine/godot/pull/78963)). -- [Terminal Output] Reset text properties after `print_rich` ([GH-79017](https://github.com/godotengine/godot/pull/79017)). -- Fix missing arrows in integer vector properties ([GH-79021](https://github.com/godotengine/godot/pull/79021)). -- Optimize SVG icons and remove unused Transpose icon ([GH-79062](https://github.com/godotengine/godot/pull/79062)). -- Collapse bottom panel if there is no active tab ([GH-79078](https://github.com/godotengine/godot/pull/79078)). -- Fix `ui_cancel` action not closing `FindReplaceBar` ([GH-79079](https://github.com/godotengine/godot/pull/79079)). -- Add tooltip description wrapping in scene tree and plugin settings ([GH-79090](https://github.com/godotengine/godot/pull/79090)). -- Improve user-friendliness of project version mismatch message ([GH-79118](https://github.com/godotengine/godot/pull/79118)). -- Optimize Variant icons and a few others ([GH-79161](https://github.com/godotengine/godot/pull/79161)). -- Don't grab theme icons for scripts ([GH-79203](https://github.com/godotengine/godot/pull/79203)). -- Show only compatible nodes in 'Select a node' window ([GH-79213](https://github.com/godotengine/godot/pull/79213)). -- Assume root when dropping node to unassigned script ([GH-79258](https://github.com/godotengine/godot/pull/79258)). -- Keep `GraphNode` port icons crisp at high zoom levels and remove artifacts ([GH-79262](https://github.com/godotengine/godot/pull/79262)). -- Hide/show `AcceptDialog`'s button spacer on button visibility changed ([GH-79274](https://github.com/godotengine/godot/pull/79274)). -- Change explicit 'Godot 4.0' references to 'Godot 4' ([GH-79277](https://github.com/godotengine/godot/pull/79277)). -- Fix dragged nodes icon size ([GH-79283](https://github.com/godotengine/godot/pull/79283)). -- Improve text in popup warning, remove "upgrade or downgrade" text ([GH-79299](https://github.com/godotengine/godot/pull/79299)). -- Allow adding a custom side menu to EditorFileDialog ([GH-79313](https://github.com/godotengine/godot/pull/79313)). -- Make indentation indicators translatable ([GH-79358](https://github.com/godotengine/godot/pull/79358)). -- Improve signal callback generation ([GH-79366](https://github.com/godotengine/godot/pull/79366)). -- Add missing word to text of the alert dialog ([GH-79381](https://github.com/godotengine/godot/pull/79381)). -- Disable irrelevant scene tab context menu items ([GH-79382](https://github.com/godotengine/godot/pull/79382)). -- Don't use splash minimum display time in editor ([GH-79388](https://github.com/godotengine/godot/pull/79388)). -- Include display server type in "Copy System Info" ([GH-79396](https://github.com/godotengine/godot/pull/79396)). -- Fix rendering driver in Copy System Info for the Compatibility rendering method ([GH-79416](https://github.com/godotengine/godot/pull/79416)). -- Add icons to some placeholder classes ([GH-79431](https://github.com/godotengine/godot/pull/79431)). -- Hide explicitly specified flag value in Inspector ([GH-79457](https://github.com/godotengine/godot/pull/79457)). -- Add a shortcut to paste nodes as sibling of the selected node ([GH-79467](https://github.com/godotengine/godot/pull/79467)). -- Emit `history_changed` on merged UndoRedo actions ([GH-79484](https://github.com/godotengine/godot/pull/79484)). -- Show valid types in SceneTreeDialog ([GH-79593](https://github.com/godotengine/godot/pull/79593)). -- Fix wrong Curve connection ([GH-79609](https://github.com/godotengine/godot/pull/79609)). -- Add Ctrl+/ as a shortcut to toggle comment in addition to Ctrl+K ([GH-79610](https://github.com/godotengine/godot/pull/79610)). -- Make Help.svg not look disabled ([GH-79613](https://github.com/godotengine/godot/pull/79613)). -- Avoid duplicating the "Filters" section ([GH-79650](https://github.com/godotengine/godot/pull/79650)). -- Fix arg count checks in `SceneDebugger` ([GH-79655](https://github.com/godotengine/godot/pull/79655)). -- Add placeholder items to TileSet layer list ([GH-79676](https://github.com/godotengine/godot/pull/79676)). -- Change the text for the flat button preview to follow pattern ([GH-79734](https://github.com/godotengine/godot/pull/79734)). -- Fix typo in ResourceImporterImageFont ([GH-79736](https://github.com/godotengine/godot/pull/79736)). -- In Create New Scene dialog derive the default root node name based on `editor/naming/node_name_casing` ([GH-79756](https://github.com/godotengine/godot/pull/79756)). -- Make the single window mode check more strict ([GH-79793](https://github.com/godotengine/godot/pull/79793)). -- Make blend file importer warnings translatable ([GH-79807](https://github.com/godotengine/godot/pull/79807)). -- Fix undo methods for DELETE in EditorAutoloadSettings ([GH-79832](https://github.com/godotengine/godot/pull/79832)). -- Fix usability issues with scene tabs ([GH-79852](https://github.com/godotengine/godot/pull/79852)). -- Add tooltips to the plugin editor creation dialog ([GH-79891](https://github.com/godotengine/godot/pull/79891)). -- Fix spacing between icon and "Output" button ([GH-79908](https://github.com/godotengine/godot/pull/79908)). -- Fix crash when using "Close All Tabs" ([GH-79917](https://github.com/godotengine/godot/pull/79917)). -- Automatically add path to built-in scripts ([GH-79920](https://github.com/godotengine/godot/pull/79920)). -- Sort system font menu in Inspector ([GH-79928](https://github.com/godotengine/godot/pull/79928)). -- Fix out of bounds access when updating current scene ([GH-79945](https://github.com/godotengine/godot/pull/79945)). -- Uncollapse favorites by default in the editor FileSystem dock ([GH-79971](https://github.com/godotengine/godot/pull/79971)). -- Reverse condition for skipping directories ([GH-79984](https://github.com/godotengine/godot/pull/79984)). -- Fix escaping issues with POT generator ([GH-80058](https://github.com/godotengine/godot/pull/80058)). -- Fix API hash related crash in `EditorSettings` ([GH-80089](https://github.com/godotengine/godot/pull/80089)). -- Add UndoRedo icon ([GH-80102](https://github.com/godotengine/godot/pull/80102)). -- Add FileAccess and DirAccess icons ([GH-80103](https://github.com/godotengine/godot/pull/80103)). -- Add path to missing import texture metadata to error message ([GH-80107](https://github.com/godotengine/godot/pull/80107)). -- Add an icon to the Performance object ([GH-80113](https://github.com/godotengine/godot/pull/80113)). -- Optimize and fix up some SVGs ([GH-80119](https://github.com/godotengine/godot/pull/80119)). -- Add ShaderInclude class icon ([GH-80129](https://github.com/godotengine/godot/pull/80129)). -- Use the gray color for all abstract classes ([GH-80184](https://github.com/godotengine/godot/pull/80184)). -- Horizontal split view for Filesystem Dock ([GH-80241](https://github.com/godotengine/godot/pull/80241)). -- Fix menu items that trigger secondary interface missing ellipsis ([GH-80355](https://github.com/godotengine/godot/pull/80355)). -- Improve Signal Dock for script classes ([GH-80411](https://github.com/godotengine/godot/pull/80411)). -- Add custom color support to project folders ([GH-80440](https://github.com/godotengine/godot/pull/80440)). -- [Editor Log] Clear rich print tags only after the last line ([GH-80476](https://github.com/godotengine/godot/pull/80476)). -- Extract editor scene tabs into their own component ([GH-80490](https://github.com/godotengine/godot/pull/80490)). -- Fixes Scene corruption when child scene is renamed in another directory ([GH-80503](https://github.com/godotengine/godot/pull/80503)). -- Avoid unnecessary inspector updates when loading or switching scenes ([GH-80517](https://github.com/godotengine/godot/pull/80517)). -- Add EditorStringNames singleton ([GH-80573](https://github.com/godotengine/godot/pull/80573)). -- Add CurveXYZTexture icon ([GH-80598](https://github.com/godotengine/godot/pull/80598)). -- Fix crash on exit where `TileSet` calls destroyed `TileSetAtlasSourceEditor` ([GH-80607](https://github.com/godotengine/godot/pull/80607)). -- Fix `TileMapEditorPlugin` crash by storing tilemap ID instead of pointer ([GH-80610](https://github.com/godotengine/godot/pull/80610)). -- Add PortableCompressedTexture2D icon ([GH-80659](https://github.com/godotengine/godot/pull/80659)). -- Make the NavigationAgent3D icon more readable ([GH-80661](https://github.com/godotengine/godot/pull/80661)). -- Recurse into resources to check for changed node paths ([GH-80721](https://github.com/godotengine/godot/pull/80721)). -- Add a RegEx icon ([GH-80724](https://github.com/godotengine/godot/pull/80724)). -- Don't cache script signal descriptions ([GH-80726](https://github.com/godotengine/godot/pull/80726)). -- Disable translation of root name on scene creation ([GH-80811](https://github.com/godotengine/godot/pull/80811)). -- Avoid creating any useless undo action when dragging nodes in place ([GH-80817](https://github.com/godotengine/godot/pull/80817)). -- Unedit nodes early when closing scene tab ([GH-80849](https://github.com/godotengine/godot/pull/80849)). -- Save "Show Built-In Actions" state to project metadata ([GH-80879](https://github.com/godotengine/godot/pull/80879)). -- Differentiate between core and editor-only singletons ([GH-80962](https://github.com/godotengine/godot/pull/80962)). -- Cleanup some `GLOBAL_DEF`s ([GH-80972](https://github.com/godotengine/godot/pull/80972)). -- Add a property hint range to Auto Refresh Interval editor setting ([GH-80975](https://github.com/godotengine/godot/pull/80975)). -- Display time of last save in the unsaved changes confirmation editor dialog ([GH-80976](https://github.com/godotengine/godot/pull/80976)). -- Fix paste value emptying an array on some right click location ([GH-80977](https://github.com/godotengine/godot/pull/80977)). -- Move the new RegEx icons into their respective module ([GH-80998](https://github.com/godotengine/godot/pull/80998)). -- FileSystemDock: Don't update current path on rename when file list has focus ([GH-81007](https://github.com/godotengine/godot/pull/81007)). -- Improve warnings when running scripts in the editor ([GH-81022](https://github.com/godotengine/godot/pull/81022)). -- Properly remember custom text color in scene tree ([GH-81061](https://github.com/godotengine/godot/pull/81061)). -- Fix Quick Open not opening binary resources ([GH-81068](https://github.com/godotengine/godot/pull/81068)). -- Refactor disabling scene tab context menu options ([GH-81072](https://github.com/godotengine/godot/pull/81072)). -- Prevent creating any type of file with a leading dot ([GH-81075](https://github.com/godotengine/godot/pull/81075)). -- Signal Connection Dock improvements ([GH-81092](https://github.com/godotengine/godot/pull/81092)). -- Fix a crash when built-in script is not saved and have syntax error ([GH-81156](https://github.com/godotengine/godot/pull/81156)). -- Use `ui_text_submit` instead of `ui_accept` to confirm and close text prompts ([GH-81189](https://github.com/godotengine/godot/pull/81189)). -- Inspector and Signal docks improvements ([GH-81221](https://github.com/godotengine/godot/pull/81221)). -- Fix `EditorFileDialog` clears the file name on changing directory ([GH-81226](https://github.com/godotengine/godot/pull/81226)). -- Fix clamping logic in `EditorSpinSlider` ([GH-81278](https://github.com/godotengine/godot/pull/81278)). -- Show doc tooltips when hovering properties in the theme editor ([GH-81284](https://github.com/godotengine/godot/pull/81284)). -- Change precedence in rules to make location after proper casing ([GH-81304](https://github.com/godotengine/godot/pull/81304)). -- Fix TextFile not reloading when changed from external editors ([GH-81319](https://github.com/godotengine/godot/pull/81319)). -- Check the native base of scripts when resolving icons ([GH-81336](https://github.com/godotengine/godot/pull/81336)). -- Fix saving editor folder colors ([GH-81344](https://github.com/godotengine/godot/pull/81344)). -- Avoid text substitution in EditorHelp messages ([GH-81346](https://github.com/godotengine/godot/pull/81346)). -- Update folder colors when moving or renaming ([GH-81380](https://github.com/godotengine/godot/pull/81380)). -- Rearrange "Main Menu > Help" items ([GH-81399](https://github.com/godotengine/godot/pull/81399)). -- Remove leftover debug print in `FileSystemDock` ([GH-81407](https://github.com/godotengine/godot/pull/81407)). -- Fix property array tooltip shows wrong ID on later pages ([GH-81408](https://github.com/godotengine/godot/pull/81408)). -- Fix bugs of copying scene root node or pasting node as scene root ([GH-81415](https://github.com/godotengine/godot/pull/81415)). -- Expose `EditorInspector::get_edited_object` to GDScript ([GH-81425](https://github.com/godotengine/godot/pull/81425)). -- Fix unexpected behaviors of using Duplicate To on folders ([GH-81437](https://github.com/godotengine/godot/pull/81437)). -- Fix FindReplaceBar losing focus too early ([GH-81450](https://github.com/godotengine/godot/pull/81450)). -- Ignore empty lines when uncommenting code ([GH-81486](https://github.com/godotengine/godot/pull/81486)). -- SceneTreeDock: Avoid changing the currently edited object when attaching a script ([GH-81510](https://github.com/godotengine/godot/pull/81510)). -- Allow contextual plugins to persist temporarily ([GH-81523](https://github.com/godotengine/godot/pull/81523)). -- Improve undo action names ([GH-81569](https://github.com/godotengine/godot/pull/81569)). -- Make editor support `--fullscreen` command-line argument ([GH-81608](https://github.com/godotengine/godot/pull/81608)). -- Add XML files to default TextFile extensions in the editor ([GH-81625](https://github.com/godotengine/godot/pull/81625)). -- Avoid resetting the code completion popup excessively ([GH-81633](https://github.com/godotengine/godot/pull/81633)). -- Fix dependency handling on move or rename in the filesystem dock ([GH-81657](https://github.com/godotengine/godot/pull/81657)). -- Don't paste nodes as sibling of scene root ([GH-81673](https://github.com/godotengine/godot/pull/81673)). -- Clarify filtering by node type and group in the Scene tree dock ([GH-81675](https://github.com/godotengine/godot/pull/81675)). -- Create a field when Ctrl-dropping a resource into the code editor ([GH-81708](https://github.com/godotengine/godot/pull/81708)). -- Make LineEdit secret character easier to change and enter ([GH-81724](https://github.com/godotengine/godot/pull/81724)). -- Fix folder moving in file system dock ([GH-81725](https://github.com/godotengine/godot/pull/81725)). -- Fix internal `CONNECT_INHERITED` being saved in PackedScene & Make Local ([GH-81737](https://github.com/godotengine/godot/pull/81737)). -- Fix Connection dock's popups always allowing disconnect ([GH-81750](https://github.com/godotengine/godot/pull/81750)). -- Change icon for position key ([GH-81751](https://github.com/godotengine/godot/pull/81751)). -- Add Ctrl+P as shortcut to quick open files in addition to Shift+Alt+O ([GH-81770](https://github.com/godotengine/godot/pull/81770)). -- Make editor camera speed indicator use `m/s` and `m` ([GH-81810](https://github.com/godotengine/godot/pull/81810)). -- Fix grayed out paint icons ([GH-81813](https://github.com/godotengine/godot/pull/81813)). -- Add CanvasTexture icon ([GH-81834](https://github.com/godotengine/godot/pull/81834)). -- Make UIDs clickable in the script editor ([GH-81927](https://github.com/godotengine/godot/pull/81927)). -- Improve the Torus icons ([GH-81978](https://github.com/godotengine/godot/pull/81978)). -- While dragging files don't move not selected cursor item in filesystem-dock ([GH-82045](https://github.com/godotengine/godot/pull/82045)). -- Revamp how documentation tooltips work ([GH-82051](https://github.com/godotengine/godot/pull/82051)). -- Fix several issues with renaming in FileSystem dock ([GH-82075](https://github.com/godotengine/godot/pull/82075)). -- Fix skeleton 3d editor's toolbar ui deleted from wrong container ([GH-82131](https://github.com/godotengine/godot/pull/82131)). -- Fix leak when calling `remove_control_from_menu_panel` ([GH-82171](https://github.com/godotengine/godot/pull/82171)). -- Fix CurveEdit crash when dragging the curve if it is null ([GH-82181](https://github.com/godotengine/godot/pull/82181)). -- Add call validation to CommandPalette ([GH-82194](https://github.com/godotengine/godot/pull/82194)). -- Remove the separator from ItemList's thumbnails mode ([GH-82236](https://github.com/godotengine/godot/pull/82236)). -- Fix missing dependency warning popup ([GH-82244](https://github.com/godotengine/godot/pull/82244)). -- Fix can't unset exported typed array element when the type is set to Node ([GH-82287](https://github.com/godotengine/godot/pull/82287)). -- Fix ScriptCreateDialog not accepting on submit ([GH-82328](https://github.com/godotengine/godot/pull/82328)). -- Add error checks for DirAccess creation ([GH-82347](https://github.com/godotengine/godot/pull/82347)). -- Color match editor log toggles and flat pressed buttons ([GH-82365](https://github.com/godotengine/godot/pull/82365)). -- Fix submenus deleted accidentally ([GH-82371](https://github.com/godotengine/godot/pull/82371)). -- Fix leak when closing theme editor preview tabs ([GH-82442](https://github.com/godotengine/godot/pull/82442)). -- Make terrains peering bit property names translatable ([GH-82509](https://github.com/godotengine/godot/pull/82509)). -- Don't remove favorite files in EditorFileDialog ([GH-82537](https://github.com/godotengine/godot/pull/82537)). -- Use theme icon size when calculating category minimum size ([GH-82540](https://github.com/godotengine/godot/pull/82540)). -- Add more context to some `Window` errors ([GH-82590](https://github.com/godotengine/godot/pull/82590)). -- "Whole Words" search can detect word boundaries inside the search term ([GH-82694](https://github.com/godotengine/godot/pull/82694)). -- Search terms are now highlighted when the bar opens with a selection ([GH-82707](https://github.com/godotengine/godot/pull/82707)). -- Fix node icons appearing too big in some cases ([GH-82728](https://github.com/godotengine/godot/pull/82728)). -- Fix loading floating dock layout ([GH-82742](https://github.com/godotengine/godot/pull/82742)). -- Removes extents to size conversion ([GH-82754](https://github.com/godotengine/godot/pull/82754)). -- Fix checking the visibility condition of selected file in the Godot editor's dock ([GH-82806](https://github.com/godotengine/godot/pull/82806)). -- Fix unsaved changes not getting discarded ([GH-82847](https://github.com/godotengine/godot/pull/82847)). -- Provide translation strings for folder colors ([GH-82858](https://github.com/godotengine/godot/pull/82858)). -- Fix debugger behavior with multi-session debugging ([GH-82868](https://github.com/godotengine/godot/pull/82868)). -- Disable disconnect button for inherited signals ([GH-82875](https://github.com/godotengine/godot/pull/82875)). -- Fix garbled text in editor toasters ([GH-82913](https://github.com/godotengine/godot/pull/82913)). -- Don't apply frame delay project setting to the editor ([GH-82929](https://github.com/godotengine/godot/pull/82929)). -- Tweak metadata property tooltip to avoid being misleading ([GH-82940](https://github.com/godotengine/godot/pull/82940)). -- Fix dependency menu not showing up if scene failed to load ([GH-83024](https://github.com/godotengine/godot/pull/83024)). -- Fix `EditorFileSystemDirectory::get_file_deps()` may return wrong result ([GH-83081](https://github.com/godotengine/godot/pull/83081)). -- Fix some issues with `EditorHelpTooltip` ([GH-83094](https://github.com/godotengine/godot/pull/83094)). -- Fix highlight rect in "Whole search" being slightly offset ([GH-83101](https://github.com/godotengine/godot/pull/83101)). -- Don't auto translate theme type list ([GH-83177](https://github.com/godotengine/godot/pull/83177)). -- Project Manager: Open project when "Enter" is pressed when the search box is focused ([GH-83210](https://github.com/godotengine/godot/pull/83210)). -- Disable port name auto translation in Visual Shader editor ([GH-83233](https://github.com/godotengine/godot/pull/83233)). -- Fix saving wrong edited scene state when switching scene tabs ([GH-83251](https://github.com/godotengine/godot/pull/83251)). -- Don't try updating wrong NodePaths in resources ([GH-83263](https://github.com/godotengine/godot/pull/83263)). -- Keep focus on floating window when showing ProgressDialog ([GH-83290](https://github.com/godotengine/godot/pull/83290)). -- Fix FindReplaceBar focus problems ([GH-83335](https://github.com/godotengine/godot/pull/83335)). -- Remove toggling of unique names in subscenes ([GH-83370](https://github.com/godotengine/godot/pull/83370)). -- Fix multiple comment delimiter break toggle comment shortcut ([GH-83382](https://github.com/godotengine/godot/pull/83382)). -- Disallow 'Make Local' command on inherited nodes ([GH-83386](https://github.com/godotengine/godot/pull/83386)). -- Disable "Edit Transitions..." item if no animations are present ([GH-83402](https://github.com/godotengine/godot/pull/83402)). -- Set `icon_max_width` in the ConnectionsDock tree ([GH-83447](https://github.com/godotengine/godot/pull/83447)). -- Fix close button in FindReplaceBar ([GH-83459](https://github.com/godotengine/godot/pull/83459)). -- Prevent crash when creating custom file tooltip ([GH-83487](https://github.com/godotengine/godot/pull/83487)). -- Mesh instance UV2 unwrapping improvements ([GH-83498](https://github.com/godotengine/godot/pull/83498)). -- Fix StringName leaks in GDExtension, core, and editor themes ([GH-83562](https://github.com/godotengine/godot/pull/83562)). -- Enable new addon after hiding ProjectSettings ([GH-83576](https://github.com/godotengine/godot/pull/83576)). -- Fix ownership bugs in node copy and pasting ([GH-83596](https://github.com/godotengine/godot/pull/83596)). -- Support duplication of foreign nodes ([GH-83597](https://github.com/godotengine/godot/pull/83597)). -- Fix crash on recovered orphaned nodes ([GH-83604](https://github.com/godotengine/godot/pull/83604)). -- Fix StringName leaks in VariantParser ([GH-83619](https://github.com/godotengine/godot/pull/83619)). -- Improve threading in ClassDB and EditorHelp ([GH-83695](https://github.com/godotengine/godot/pull/83695)). -- Fix wrong shader rename in 3-to-4 project converter ([GH-83708](https://github.com/godotengine/godot/pull/83708)). -- Clamp the height of description text for property selectors ([GH-83745](https://github.com/godotengine/godot/pull/83745)). -- Fix "as" capitalization in editor strings ([GH-83815](https://github.com/godotengine/godot/pull/83815)). -- Remove margins from editor scrollbars ([GH-83868](https://github.com/godotengine/godot/pull/83868)). -- Fix potential crash on failed move ([GH-83937](https://github.com/godotengine/godot/pull/83937)). -- Use Hashset for dependency list when moving ([GH-83941](https://github.com/godotengine/godot/pull/83941)). -- Limit custom icons size in various editor widgets ([GH-84011](https://github.com/godotengine/godot/pull/84011)). -- Add read-only info to resource embedded in other scenes ([GH-84048](https://github.com/godotengine/godot/pull/84048)). -- Ignore path error for built-in scripts/shaders ([GH-84077](https://github.com/godotengine/godot/pull/84077)). -- Change dropdown type filter from Texture to Texture2D in certain nodes ([GH-84113](https://github.com/godotengine/godot/pull/84113)). -- Fix file rename crash after toggling split mode ([GH-84217](https://github.com/godotengine/godot/pull/84217)). -- Fix crash on rename collision in thumbnail grid ([GH-84218](https://github.com/godotengine/godot/pull/84218)). -- Make remote inspector groups not foldable ([GH-84257](https://github.com/godotengine/godot/pull/84257)). -- Automatically pick the Android SDK path using environment variables ([GH-84285](https://github.com/godotengine/godot/pull/84285)). -- Fix pressing save in Import Defaults not working ([GH-84291](https://github.com/godotengine/godot/pull/84291)). -- Disconnect `EditorNode` from file dialogs on destruction ([GH-84302](https://github.com/godotengine/godot/pull/84302)). -- Fix CSGShape debug_collision_shape crash ([GH-84338](https://github.com/godotengine/godot/pull/84338)). -- Polish & fix editor help cache generation ([GH-84354](https://github.com/godotengine/godot/pull/84354)). -- Fix inverted condition when unwrapping lightmap ([GH-84374](https://github.com/godotengine/godot/pull/84374)). -- Fix engine configuration icons using old convention ([GH-84404](https://github.com/godotengine/godot/pull/84404)). -- Tweak FastNoiseLite property hints for better slider usability ([GH-84494](https://github.com/godotengine/godot/pull/84494)). -- Fix pressing Enter being ignored in "Create Shader" dialog ([GH-84539](https://github.com/godotengine/godot/pull/84539)). -- Fix for stopping the Undo History being desynchronized from actual Undo queue ([GH-84557](https://github.com/godotengine/godot/pull/84557)). -- Correctly set up shortcut context in the shader editor ([GH-84614](https://github.com/godotengine/godot/pull/84614)). -- Save scene when saving built-in resource ([GH-84630](https://github.com/godotengine/godot/pull/84630)). -- Abort threaded preview generators on exit ([GH-84716](https://github.com/godotengine/godot/pull/84716)). -- Fix texture region editor not selecting restored snap mode ([GH-84762](https://github.com/godotengine/godot/pull/84762)). -- Reduced output spam from rapid property changes ([GH-84795](https://github.com/godotengine/godot/pull/84795)). -- Remove EditorFileDialog warning when skipping project directories ([GH-84797](https://github.com/godotengine/godot/pull/84797)). -- macOS: Cleanup default GL driver setting ([GH-84929](https://github.com/godotengine/godot/pull/84929)). -- Make script/shader editor save shortcuts unique again ([GH-84931](https://github.com/godotengine/godot/pull/84931)). -- Provide more context when scene fails to load ([GH-85083](https://github.com/godotengine/godot/pull/85083)). -- Add Save As... option to EditorResourcePicker ([GH-85150](https://github.com/godotengine/godot/pull/85150)). -- Avoid saving scene while already saving the scene ([GH-85154](https://github.com/godotengine/godot/pull/85154)). -- Fix project name being overwritten every time `show_dialog` is called ([GH-85169](https://github.com/godotengine/godot/pull/85169)). -- Rework the surface upgrade tool to inform users without blocking ([GH-85222](https://github.com/godotengine/godot/pull/85222)). -- Fix crash caused by conflicting menu option IDs ([GH-85227](https://github.com/godotengine/godot/pull/85227)). -- Suppress surface upgrade warnings when showing SurfaceUpgradeTool warning ([GH-85249](https://github.com/godotengine/godot/pull/85249)). -- Save and restore previous window mode when toggling full-screen ([GH-85427](https://github.com/godotengine/godot/pull/85427)). -- Disable a prohibitively slow code branch when reparenting nodes ([GH-85517](https://github.com/godotengine/godot/pull/85517)). +- Add a V-Sync editor setting ([GH-48364](https://github.com/godotengine/godot/pull/48364)). +- Automatically create folder in project manager create and import ([GH-56420](https://github.com/godotengine/godot/pull/56420)). +- Display the build date in the editor and when starting the engine ([GH-59247](https://github.com/godotengine/godot/pull/59247)). +- Implement project-wide node groups ([GH-60965](https://github.com/godotengine/godot/pull/60965)). +- Fix behavior of 'Editable Children' toggle ([GH-60974](https://github.com/godotengine/godot/pull/60974)). +- Decrease the default idle parse delay in the script editor ([GH-61814](https://github.com/godotengine/godot/pull/61814)). +- Store line change in script navigation history ([GH-63515](https://github.com/godotengine/godot/pull/63515)). +- Allow to set custom feature tags for testing ([GH-63529](https://github.com/godotengine/godot/pull/63529)). +- Add a dialog to customize run instances ([GH-65753](https://github.com/godotengine/godot/pull/65753)). +- Use `check_changed_settings_in_group()` everywhere ([GH-69032](https://github.com/godotengine/godot/pull/69032)). +- Allow easily renaming multiple nodes ([GH-69087](https://github.com/godotengine/godot/pull/69087)). +- Allow loading custom ProjectSettings instance ([GH-75048](https://github.com/godotengine/godot/pull/75048)). +- Add colored margin in Inspector for arrays and dictionaries ([GH-75482](https://github.com/godotengine/godot/pull/75482)). +- Fix missing script time for some functions in profiler ([GH-75623](https://github.com/godotengine/godot/pull/75623)). +- Add automatic checking for engine updates ([GH-75916](https://github.com/godotengine/godot/pull/75916)). +- Add tooltip plugin for AudioStream ([GH-77069](https://github.com/godotengine/godot/pull/77069)). +- Cache `TreeItem`s between runs in `EditorHelpSearch` ([GH-77471](https://github.com/godotengine/godot/pull/77471)). +- Add inheriting classes to `DocTools` ([GH-77554](https://github.com/godotengine/godot/pull/77554)). +- Add a way to invalidate preview cache ([GH-77697](https://github.com/godotengine/godot/pull/77697)). +- Fix incorrect check on importing project ([GH-77832](https://github.com/godotengine/godot/pull/77832)). +- Fix custom resource icons in FileSystem ([GH-77932](https://github.com/godotengine/godot/pull/77932)). +- Allow configuring the script filename casing rule ([GH-78119](https://github.com/godotengine/godot/pull/78119)). +- Add search keywords to the class reference ([GH-78990](https://github.com/godotengine/godot/pull/78990)). +- Enable optional minimal SteamAPI integration for usage time tracking (editor only) ([GH-79126](https://github.com/godotengine/godot/pull/79126)). +- Ignore directory entries in TPZ ([GH-79374](https://github.com/godotengine/godot/pull/79374)). +- Add size check to prevent popup bigger than the screen itself ([GH-79617](https://github.com/godotengine/godot/pull/79617)). +- Load project metadata file only when needed ([GH-79785](https://github.com/godotengine/godot/pull/79785)). +- Add a way to force history for undoredo ([GH-79796](https://github.com/godotengine/godot/pull/79796)). +- Remove exp hint of a few properties ([GH-80326](https://github.com/godotengine/godot/pull/80326)). +- Rework `update_property` for array ([GH-80706](https://github.com/godotengine/godot/pull/80706)). +- Add PhysicsMaterial icon ([GH-81044](https://github.com/godotengine/godot/pull/81044)). +- Improve "Add" button consistency in Project Settings ([GH-81905](https://github.com/godotengine/godot/pull/81905)). +- Set `open_dominant_script_on_scene_change` to off by default ([GH-81906](https://github.com/godotengine/godot/pull/81906)). +- Make the search bars in the "Project Settings" dialog grab focus when they appear ([GH-82283](https://github.com/godotengine/godot/pull/82283)). +- Add support for exporting script classes without a name ([GH-82528](https://github.com/godotengine/godot/pull/82528)). +- Fix saving branch as scene saves children without owner set ([GH-82802](https://github.com/godotengine/godot/pull/82802)). +- Allow to remove signal connections using `Delete` ([GH-82821](https://github.com/godotengine/godot/pull/82821)). +- Add context support for editor property name i18n ([GH-82852](https://github.com/godotengine/godot/pull/82852)). +- Add compatibility rename of `(v)align` properties of `Label` ([GH-82894](https://github.com/godotengine/godot/pull/82894)). +- Allow Ctrl + KP / and Ctrl + # to toggle comment in the script editor ([GH-83109](https://github.com/godotengine/godot/pull/83109)). +- (Un)Fold event categories by double click ([GH-83248](https://github.com/godotengine/godot/pull/83248)). +- Fix export variable of type Node pointing to a wrong child node when duplicating ([GH-83343](https://github.com/godotengine/godot/pull/83343)). +- Allow to load multiple animation/libraries at once in the animation manager ([GH-83503](https://github.com/godotengine/godot/pull/83503)). +- Only update `EditorSceneTabs` tabs when necessary ([GH-83957](https://github.com/godotengine/godot/pull/83957)). +- Fix UV editor not showing polygon correctly ([GH-84116](https://github.com/godotengine/godot/pull/84116)). +- Fix nodes being deselected upon reparenting ([GH-84135](https://github.com/godotengine/godot/pull/84135)). +- Extract `EditorDockManager` from `EditorNode` ([GH-84193](https://github.com/godotengine/godot/pull/84193)). +- Inspector: Fix clearing array/dictionary element with `` ([GH-84237](https://github.com/godotengine/godot/pull/84237)). +- Preserve inspector focus when opening script from scene tree ([GH-84284](https://github.com/godotengine/godot/pull/84284)). +- Allow dragging editable children ([GH-84310](https://github.com/godotengine/godot/pull/84310)). +- Hide private enums from documentation ([GH-84396](https://github.com/godotengine/godot/pull/84396)). +- Disable multi-window buttons instead of hiding them when support is unavailable ([GH-84515](https://github.com/godotengine/godot/pull/84515)). +- Fix errors on file rename or move in the Filesystem Dock ([GH-84520](https://github.com/godotengine/godot/pull/84520)). +- Add tooltip for toggling favorite nodes ([GH-84619](https://github.com/godotengine/godot/pull/84619)). +- Add PropertyListHelper ([GH-84635](https://github.com/godotengine/godot/pull/84635)). +- Clarify description of "group selected" ([GH-84788](https://github.com/godotengine/godot/pull/84788)). +- Fix unlimited project option ranges that could cause crashes ([GH-84800](https://github.com/godotengine/godot/pull/84800)). +- Fix folder color not showing up in file dialogs ([GH-84837](https://github.com/godotengine/godot/pull/84837)). +- Add "Show In FileSystem" to the Scene hierarchy right-click ([GH-84882](https://github.com/godotengine/godot/pull/84882)). +- Prevent race condition on initial breakpoints from DAP ([GH-84895](https://github.com/godotengine/godot/pull/84895)). +- Do not bother with line colors if `line_number_gutter` is not yet calculated ([GH-84907](https://github.com/godotengine/godot/pull/84907)). +- Improve search/replace bar behavior ([GH-84932](https://github.com/godotengine/godot/pull/84932)). +- Add an option to center children around the new parent when reparenting ([GH-84995](https://github.com/godotengine/godot/pull/84995)). +- Fix issue with 3D scene drag and drop preview node ([GH-85087](https://github.com/godotengine/godot/pull/85087)). +- Don't abort loading when `ext_resource` is missing ([GH-85159](https://github.com/godotengine/godot/pull/85159)). +- Add further details on properties returning `Packed*Array` ([GH-85207](https://github.com/godotengine/godot/pull/85207)). +- Don't insert newline while saving ([GH-85228](https://github.com/godotengine/godot/pull/85228)). +- Use the flat button style on switches in scene and node docks ([GH-85236](https://github.com/godotengine/godot/pull/85236)). +- Use `SafeNumeric` to protect `max_index` in ImportThreadData ([GH-85295](https://github.com/godotengine/godot/pull/85295)). +- Make copy & paste params skip `resource_path` ([GH-85362](https://github.com/godotengine/godot/pull/85362)). +- Improve SceneTreeEditor usability ([GH-85386](https://github.com/godotengine/godot/pull/85386)). +- Make it possible to show code hint and code completion at the same time ([GH-85436](https://github.com/godotengine/godot/pull/85436)). +- Improve Control hiding in PluginConfigDialog ([GH-85470](https://github.com/godotengine/godot/pull/85470)). +- Update NodePaths only in built-in resources ([GH-85502](https://github.com/godotengine/godot/pull/85502)). +- Expose `Node.is_part_of_edited_scene()` ([GH-85515](https://github.com/godotengine/godot/pull/85515)). +- Fix for Cmd-B shortcut conflict on macOS ([GH-85527](https://github.com/godotengine/godot/pull/85527)). +- Fix SnapGrid is almost invisible in light theme ([GH-85585](https://github.com/godotengine/godot/pull/85585)). +- Defer creating new editor process in "Quit to Project List" just like in "Reload Current Project" ([GH-85654](https://github.com/godotengine/godot/pull/85654)). +- Mark `gui/theme/custom` and `gui/theme/custom_font` as basic properties ([GH-85660](https://github.com/godotengine/godot/pull/85660)). +- Add separate feature tags for editor runtime ([GH-85678](https://github.com/godotengine/godot/pull/85678)). +- Hide Node dock successfully on undo/redo and deletion ([GH-85686](https://github.com/godotengine/godot/pull/85686)). +- Fix theme application in various editor dialogs ([GH-85745](https://github.com/godotengine/godot/pull/85745)). +- Improve engine startup/shutdown benchmarks ([GH-85885](https://github.com/godotengine/godot/pull/85885)). +- Add a editor FileSystem dock action to open a terminal in selected folder ([GH-85923](https://github.com/godotengine/godot/pull/85923)). +- Stop the searching of `find in files` in folders that have `.gdignore` ([GH-85943](https://github.com/godotengine/godot/pull/85943)). +- Tweak Help menu icons for better visibility of commonly used items ([GH-85978](https://github.com/godotengine/godot/pull/85978)). +- Disable Add button when theme item name is empty ([GH-86044](https://github.com/godotengine/godot/pull/86044)). +- Fix "Class name cannot be empty" error when sorting no import files sort by type ([GH-86064](https://github.com/godotengine/godot/pull/86064)). +- Stop using `RTR()` inside the "editor" folder ([GH-86143](https://github.com/godotengine/godot/pull/86143)). +- Properly select the newly duplicated file ([GH-86164](https://github.com/godotengine/godot/pull/86164)). +- Fix file disappearing when renaming dependencies ([GH-86177](https://github.com/godotengine/godot/pull/86177)). +- Fix duplicating multiple nodes at different depths in `SceneTreeDock` ([GH-86211](https://github.com/godotengine/godot/pull/86211)). +- Add option to add built-in strings in the POT generation ([GH-86222](https://github.com/godotengine/godot/pull/86222)). +- Use `set_value_no_signal` in editor property code ([GH-86266](https://github.com/godotengine/godot/pull/86266)). +- Allow node visibility to work with custom user-provided node types ([GH-86268](https://github.com/godotengine/godot/pull/86268)). +- Optimize scanning routines in the project manager ([GH-86271](https://github.com/godotengine/godot/pull/86271)). +- Fix scene dock search losing its default tooltip after typing an invalid filter ([GH-86278](https://github.com/godotengine/godot/pull/86278)). +- Add input action name to window title in input map editor ([GH-86280](https://github.com/godotengine/godot/pull/86280)). +- Add hover highlight to main editor buttons ([GH-86378](https://github.com/godotengine/godot/pull/86378)). +- Strip edges of editor layout names ([GH-86386](https://github.com/godotengine/godot/pull/86386)). +- Clear sub-resources list when no sub-resource exists ([GH-86388](https://github.com/godotengine/godot/pull/86388)). +- Fix internal profiling button being visible when disabled in settings ([GH-86398](https://github.com/godotengine/godot/pull/86398)). +- Improve action name for ungroup button in Scene dock ([GH-86431](https://github.com/godotengine/godot/pull/86431)). +- Improve performance of the 'Create New Node' dialog ([GH-86447](https://github.com/godotengine/godot/pull/86447)). +- Use ObjectID's instead of node pointers to track scene groups to prevent crash ([GH-86462](https://github.com/godotengine/godot/pull/86462)). +- Store horizontal and vertical split offsets separately in FileSystem dock ([GH-86476](https://github.com/godotengine/godot/pull/86476)). +- Fix scene parser reading non-built-in scripts for POT generation ([GH-86479](https://github.com/godotengine/godot/pull/86479)). +- Improve `EditorDirDialog` ([GH-86486](https://github.com/godotengine/godot/pull/86486)). +- Improve Path2D editing ([GH-86542](https://github.com/godotengine/godot/pull/86542)). +- Project upgrade tool: Better space handling in "export" ([GH-86598](https://github.com/godotengine/godot/pull/86598)). +- Don't update tree on deselect ([GH-86605](https://github.com/godotengine/godot/pull/86605)). +- Add option for editor to follow system theme and accent colors ([GH-86610](https://github.com/godotengine/godot/pull/86610)). +- Fix possible crash (use after free) in ScriptTextEditor ([GH-86633](https://github.com/godotengine/godot/pull/86633)). +- Improved synchronization of Transforms during live debug sessions ([GH-86659](https://github.com/godotengine/godot/pull/86659)). +- Automatically add path to built-in shaders ([GH-86668](https://github.com/godotengine/godot/pull/86668)). +- Stop escaping `'` on POT generation ([GH-86669](https://github.com/godotengine/godot/pull/86669)). +- Improve saving of built-in resources ([GH-86705](https://github.com/godotengine/godot/pull/86705)). +- Removed unused code related to command palette ([GH-86723](https://github.com/godotengine/godot/pull/86723)). +- Update modified shortcuts in command palette ([GH-86727](https://github.com/godotengine/godot/pull/86727)). +- Fix missing autocompletion for inheriting classes ([GH-86729](https://github.com/godotengine/godot/pull/86729)). +- Ignore internal children when replacing node ([GH-86745](https://github.com/godotengine/godot/pull/86745)). +- Add autocompletion for ProjectSettings' methods ([GH-86758](https://github.com/godotengine/godot/pull/86758)). +- Add autocompletion for InputMap's methods ([GH-86764](https://github.com/godotengine/godot/pull/86764)). +- Allow to move FileSystem dock to bottom and drag resources across bottom docks ([GH-86765](https://github.com/godotengine/godot/pull/86765)). +- Display functions that were previously forgotten in Profiler ([GH-86772](https://github.com/godotengine/godot/pull/86772)). +- Allow opening scenes with missing scene dependency ([GH-86781](https://github.com/godotengine/godot/pull/86781)). +- Allow all editor modes to select nodes in the viewport ([GH-86804](https://github.com/godotengine/godot/pull/86804)). +- Added compatibility for Blend Mode in `Light2D`/`PointLight2D` when converting from Godot 3 to 4 ([GH-86811](https://github.com/godotengine/godot/pull/86811)). +- Parse the names of children of `TabContainer`s on POT generation ([GH-86878](https://github.com/godotengine/godot/pull/86878)). +- Add autocompletion for a few EditorInterface methods ([GH-86893](https://github.com/godotengine/godot/pull/86893)). +- A couple of enhancements to user-visible threading semantics ([GH-86957](https://github.com/godotengine/godot/pull/86957)). +- Fix missing icons for custom resources in EditorResourcePicker ([GH-86979](https://github.com/godotengine/godot/pull/86979)). +- Implement `trim_final_newlines` setting and functionality ([GH-87099](https://github.com/godotengine/godot/pull/87099)). +- Capitalize OIDN in editor settings and properties ([GH-87108](https://github.com/godotengine/godot/pull/87108)). +- Fix thumbnail disappears if FileSystemDock is floated ([GH-87121](https://github.com/godotengine/godot/pull/87121)). +- Fix icon corrupted when nested array editors are opened before opening main array editor ([GH-87143](https://github.com/godotengine/godot/pull/87143)). +- Fix reloading current scene forgetting path ([GH-87170](https://github.com/godotengine/godot/pull/87170)). +- Add tooltips to the export buttons ([GH-87183](https://github.com/godotengine/godot/pull/87183)). +- Add autocompletion for TranslationServer ([GH-87191](https://github.com/godotengine/godot/pull/87191)). +- Optimize SceneTree's `change_scene_to_file` autocompletion ([GH-87197](https://github.com/godotengine/godot/pull/87197)). +- Add support for search shortcut to all docks ([GH-87200](https://github.com/godotengine/godot/pull/87200)). +- Handle clickable `[url]` tags in `print_rich()` editor output log ([GH-87216](https://github.com/godotengine/godot/pull/87216)). +- Add color in built-in documentation for overridden properties ([GH-87255](https://github.com/godotengine/godot/pull/87255)). +- Reorganize project manager code ([GH-87266](https://github.com/godotengine/godot/pull/87266)). +- Display path in tooltips of sub-resource list ([GH-87280](https://github.com/godotengine/godot/pull/87280)). +- Improve editor theme generation after the refactor ([GH-87293](https://github.com/godotengine/godot/pull/87293)). +- Replace built-in docs codeblock's leading spaces with tabs ([GH-87301](https://github.com/godotengine/godot/pull/87301)). +- Add copy codeblock button to built-in documentation ([GH-87363](https://github.com/godotengine/godot/pull/87363)). +- Fix shortcut name consistency in SceneTreeDock ([GH-87419](https://github.com/godotengine/godot/pull/87419)). +- Improve layout and UX of the project manager ([GH-87443](https://github.com/godotengine/godot/pull/87443)). +- Fix selection regression in `EditorHelpSearch` ([GH-87476](https://github.com/godotengine/godot/pull/87476)). +- Make the text editor consistent with the script editor ([GH-87510](https://github.com/godotengine/godot/pull/87510)). +- Remove incorrect C# rename from the project converter ([GH-87533](https://github.com/godotengine/godot/pull/87533)). +- Improve appearance of Node configuration warnings ([GH-87535](https://github.com/godotengine/godot/pull/87535)). +- Fix editor will freeze when modifying filesystem filter path in Split Mode ([GH-87563](https://github.com/godotengine/godot/pull/87563)). +- Change scene drag-and-drop modifier behavior in the 2D and 3D editors ([GH-87623](https://github.com/godotengine/godot/pull/87623)). +- Generate script resource preview without parsing ([GH-87625](https://github.com/godotengine/godot/pull/87625)). +- Fix editor profiler script function sort order ([GH-87661](https://github.com/godotengine/godot/pull/87661)). +- Fix editor properties vector ratio breaking when an element is set to zero ([GH-87740](https://github.com/godotengine/godot/pull/87740)). +- Some editor code cleanup ([GH-87755](https://github.com/godotengine/godot/pull/87755)). +- Extract BottomPanel from EditorNode ([GH-87760](https://github.com/godotengine/godot/pull/87760)). +- Remove duplicated callings `set()` from SceneTreeDock ([GH-87834](https://github.com/godotengine/godot/pull/87834)). +- Remove unnecessary focus methods and directly bind to `set_close_on_escape` ([GH-87870](https://github.com/godotengine/godot/pull/87870)). +- Fix sorting of files/dirs in dialogs ([GH-87874](https://github.com/godotengine/godot/pull/87874)). +- Fix frame number underflow in visual profiler ([GH-87876](https://github.com/godotengine/godot/pull/87876)). +- Do not use `NOTIFICATION_PHYSICS_PROCESS` for 2D Editor ([GH-87886](https://github.com/godotengine/godot/pull/87886)). +- Fix `display/window/size/window_{width,height}_override` to permit `0` ([GH-87907](https://github.com/godotengine/godot/pull/87907)). +- Check if history exists before discarding ([GH-87980](https://github.com/godotengine/godot/pull/87980)). +- Refactor and fix issues in Editor Dock Manager ([GH-88003](https://github.com/godotengine/godot/pull/88003)). +- Tweak error and warning colors and fix `StatusWarning` icon visibility on light themes ([GH-88058](https://github.com/godotengine/godot/pull/88058)). +- Web: Refactor Editor web server ([GH-88063](https://github.com/godotengine/godot/pull/88063)). +- Add editor shortcuts to toggle bottom panel visibility ([GH-88081](https://github.com/godotengine/godot/pull/88081)). +- Use indeterminate progressbars for editor downloads (export templates & assets) ([GH-88084](https://github.com/godotengine/godot/pull/88084)). +- Show update spinner by default in `dev_build=yes` editor builds ([GH-88106](https://github.com/godotengine/godot/pull/88106)). +- Fix data race against `EditorFileSystem.scanning_changes_done` ([GH-88124](https://github.com/godotengine/godot/pull/88124)). +- Use `SafeFlag` for `EditorHTTPServer.server_quit` ([GH-88155](https://github.com/godotengine/godot/pull/88155)). +- Use highlighted version of the tab icon in the bottom file system dock ([GH-88191](https://github.com/godotengine/godot/pull/88191)). +- Asset Library author link, description popup size and UX details ([GH-88229](https://github.com/godotengine/godot/pull/88229)). +- Fix update property for dictionaries so that it updates only what is necessary ([GH-88231](https://github.com/godotengine/godot/pull/88231)). +- Fix an edge case bug in drag-and-drop Node3D spawning ([GH-88269](https://github.com/godotengine/godot/pull/88269)). +- Rework how script is edited when clicking icon ([GH-88288](https://github.com/godotengine/godot/pull/88288)). +- Add support for search shortcut to signal connection dialog ([GH-88317](https://github.com/godotengine/godot/pull/88317)). +- Fix skipping normal category followed by custom one ([GH-88318](https://github.com/godotengine/godot/pull/88318)). +- Focus value editor on type change in Dictionary and Array editors ([GH-88322](https://github.com/godotengine/godot/pull/88322)). +- Add const lvalue ref to `editor/*` container parameters ([GH-88368](https://github.com/godotengine/godot/pull/88368)). +- Improve look of Donors list in Editor's About ([GH-88370](https://github.com/godotengine/godot/pull/88370)). +- Move EditorNode setting registration so they are in class reference ([GH-88380](https://github.com/godotengine/godot/pull/88380)). +- Fix Skeleton3D insert key tooltips ([GH-88386](https://github.com/godotengine/godot/pull/88386)). +- Fix resource previews not created in compatibility rendering ([GH-88391](https://github.com/godotengine/godot/pull/88391)). +- Show keywords in `EditorHelpSearch` ([GH-88450](https://github.com/godotengine/godot/pull/88450)). +- Hide Search Results by default and show it on first search ([GH-88465](https://github.com/godotengine/godot/pull/88465)). +- Improve merging of docs on generation ([GH-88514](https://github.com/godotengine/godot/pull/88514)). +- Add separate program case for Godot Resources ([GH-88523](https://github.com/godotengine/godot/pull/88523)). +- Fix crash on documentation generation on macOS ([GH-88545](https://github.com/godotengine/godot/pull/88545)). +- Fix crash on changing resource type of dictionary new key/value while editing the resource ([GH-88572](https://github.com/godotengine/godot/pull/88572)). +- Add `android` to auto-generated `.gitignore` ([GH-88591](https://github.com/godotengine/godot/pull/88591)). +- Remove error when property is outside inspector ([GH-88597](https://github.com/godotengine/godot/pull/88597)). +- Improve user experience for VCS metadata generator menu button to mitigate accidentally overriding ([GH-88609](https://github.com/godotengine/godot/pull/88609)). +- Add a `h_separation` between icons in `CheckButton`/`CheckBox` ([GH-88615](https://github.com/godotengine/godot/pull/88615)). +- Dictionary Editor: Keep the type of the last added item ([GH-88636](https://github.com/godotengine/godot/pull/88636)). +- Fix editor hover style margins when Draw Extra Borders is enabled ([GH-88652](https://github.com/godotengine/godot/pull/88652)). +- Add tokenized search support to Quick Open dialog and FileSystem filter ([GH-88660](https://github.com/godotengine/godot/pull/88660)). +- Remove some redundant method calls from ScriptEditor ([GH-88675](https://github.com/godotengine/godot/pull/88675)). +- Improve Run Instances Dialog ([GH-88685](https://github.com/godotengine/godot/pull/88685)). +- Fix undo/redo behavior of ColorPicker and add ability to cancel/confirm color selection ([GH-88690](https://github.com/godotengine/godot/pull/88690)). +- Fix leak of scene used for customization during export ([GH-88726](https://github.com/godotengine/godot/pull/88726)). +- Fix removing element in array inspector not changing page when emptying page ([GH-88731](https://github.com/godotengine/godot/pull/88731)). +- Fix the text editor theme not being applied on editor start ([GH-88742](https://github.com/godotengine/godot/pull/88742)). +- Inspector `(N changes)` indicator propagates upwards ([GH-88814](https://github.com/godotengine/godot/pull/88814)). +- Fix toggling a plugin makes its name black ([GH-88817](https://github.com/godotengine/godot/pull/88817)). +- Add create folder icon ([GH-88825](https://github.com/godotengine/godot/pull/88825)). +- Add browse folder and browse file icons ([GH-88827](https://github.com/godotengine/godot/pull/88827)). +- Save scene and global checkbox options of History window ([GH-88833](https://github.com/godotengine/godot/pull/88833)). +- Fix paste Value can empty a dictionary depending on right-click location ([GH-88849](https://github.com/godotengine/godot/pull/88849)). +- Remove redundant space after enum/flags word in editor docs ([GH-88911](https://github.com/godotengine/godot/pull/88911)). +- Modify shortcut for closing scene on macOS only ([GH-88913](https://github.com/godotengine/godot/pull/88913)). +- Allow docks to be closed and opened ([GH-89017](https://github.com/godotengine/godot/pull/89017)). +- Add autocompletion for EditorSettings' methods ([GH-89043](https://github.com/godotengine/godot/pull/89043)). +- Use `META_UNDERLINE_ON_HOVER` in built-in class reference ([GH-89049](https://github.com/godotengine/godot/pull/89049)). +- Display deprecated/experimental messages in tooltips ([GH-89058](https://github.com/godotengine/godot/pull/89058)). +- Remember search text in Find/Replace in Files dialog ([GH-89085](https://github.com/godotengine/godot/pull/89085)). +- Improve how Project & Editor Settings look in built-in docs ([GH-89086](https://github.com/godotengine/godot/pull/89086)). +- Do not attempt to set cursor shape in headless mode ([GH-89099](https://github.com/godotengine/godot/pull/89099)). +- Add missing `variablesReference` field to DAP `evaluate` request ([GH-89110](https://github.com/godotengine/godot/pull/89110)). +- Fix undo action names for node replacement ([GH-89121](https://github.com/godotengine/godot/pull/89121)). +- Fix documentation of localization related editor settings ([GH-89135](https://github.com/godotengine/godot/pull/89135)). +- Change Editable Children menu action to be keyboard shortcuttable ([GH-89142](https://github.com/godotengine/godot/pull/89142)). +- Add Enter shortcut to add a shader global in the editor ([GH-89184](https://github.com/godotengine/godot/pull/89184)). +- Fix AssetLibrary not going online when clicking button ([GH-89200](https://github.com/godotengine/godot/pull/89200)). +- Fix wrong undo-redo action when dropping files containing circular dependencies ([GH-89204](https://github.com/godotengine/godot/pull/89204)). +- Don't refresh mirrors for development builds in editor export template manager ([GH-89236](https://github.com/godotengine/godot/pull/89236)). +- Add `FolderCreate` icon to the project dialog ([GH-89240](https://github.com/godotengine/godot/pull/89240)). +- Fix region section not ignoring #region and #endregion when in a string ([GH-89242](https://github.com/godotengine/godot/pull/89242)). +- Don't store values when loading them ([GH-89248](https://github.com/godotengine/godot/pull/89248)). +- Allow connecting signals to existing methods without opening the script editor ([GH-89249](https://github.com/godotengine/godot/pull/89249)). +- Speed up inspector updates for TileMap ([GH-89251](https://github.com/godotengine/godot/pull/89251)). +- Add missing normal and hover states to `EditorLogFilterButton` ([GH-89255](https://github.com/godotengine/godot/pull/89255)). +- Fix how scripts reload outside of ScriptEditor ([GH-89261](https://github.com/godotengine/godot/pull/89261)). +- Editor Help: Add syntax highlighting for code blocks ([GH-89263](https://github.com/godotengine/godot/pull/89263)). +- Move `snap_controls_to_pixels` from process to projects settings changed method ([GH-89264](https://github.com/godotengine/godot/pull/89264)). +- Fix possible crash when converting a node to other in visual shader ([GH-89292](https://github.com/godotengine/godot/pull/89292)). +- Fix ScriptCreateDialog so it does not select the file extension when it's opened ([GH-89315](https://github.com/godotengine/godot/pull/89315)). +- Fix compiler warning when highlighting codeblocks in editor help ([GH-89332](https://github.com/godotengine/godot/pull/89332)). +- Defer `ActionMapEditor::_action_edited` signal to prevent tree updates when tree is blocked ([GH-89346](https://github.com/godotengine/godot/pull/89346)). +- Fix PluginConfigDialog crash in editor build without any language support ([GH-89378](https://github.com/godotengine/godot/pull/89378)). +- Select method name edit when opening connection dialog ([GH-89405](https://github.com/godotengine/godot/pull/89405)). +- Allow batch drag and drop in typed array of Node and NodePath ([GH-89406](https://github.com/godotengine/godot/pull/89406)). +- Fix main editor button margins while using a custom theme ([GH-89462](https://github.com/godotengine/godot/pull/89462)). +- Fix some translations not properly falling back ([GH-89489](https://github.com/godotengine/godot/pull/89489)). +- Make the "Clear Output" shortcut not require panel focus ([GH-89505](https://github.com/godotengine/godot/pull/89505)). +- Remove redundant code from `EditorSpinSlider` ([GH-89518](https://github.com/godotengine/godot/pull/89518)). +- Fix translation fallback not working in the Project Manager ([GH-89519](https://github.com/godotengine/godot/pull/89519)). +- Fix FileSystem dock auto translating files ([GH-89546](https://github.com/godotengine/godot/pull/89546)). +- Fix unexpected auto translation of editor `Tree` content ([GH-89599](https://github.com/godotengine/godot/pull/89599)). +- Make "Pick Color"'s result less precise, keep only 3 decimals ([GH-89630](https://github.com/godotengine/godot/pull/89630)). +- Fix same-name (sub)groups interfering in Inspector ([GH-89631](https://github.com/godotengine/godot/pull/89631)). +- Resource file not found error when loading Favorite icon ([GH-89642](https://github.com/godotengine/godot/pull/89642)). +- Add `Open in Terminal` to the file system empty click ([GH-89658](https://github.com/godotengine/godot/pull/89658)). +- Fix text color in `EditorHelpHighlighter` ([GH-89704](https://github.com/godotengine/godot/pull/89704)). +- Add progress bar when updating scene groups ([GH-89739](https://github.com/godotengine/godot/pull/89739)). +- Remove stray item icon from tabs menu ([GH-89747](https://github.com/godotengine/godot/pull/89747)). +- Make project naming setting available in project manager ([GH-89788](https://github.com/godotengine/godot/pull/89788)). +- Disable Clear All button when not filtering in Settings ([GH-89798](https://github.com/godotengine/godot/pull/89798)). +- Translate "Line N" as a whole ([GH-89799](https://github.com/godotengine/godot/pull/89799)). +- Fix heap-use-after-free when converting scene group to global ([GH-89801](https://github.com/godotengine/godot/pull/89801)). +- Add necessary flags when opening directory with xfce4-terminal ([GH-89803](https://github.com/godotengine/godot/pull/89803)). +- Disable shader editor's undo/redo menu items when they do nothing ([GH-89806](https://github.com/godotengine/godot/pull/89806)). +- Don't error multiple times when trying to load missing default bus layout ([GH-89808](https://github.com/godotengine/godot/pull/89808)). +- Fix missing i18n for some editor strings ([GH-89811](https://github.com/godotengine/godot/pull/89811)). +- macOS: Use `expand_to_title` for the project manager ([GH-89831](https://github.com/godotengine/godot/pull/89831)). +- Extremely minor tooltip updates for Debug menu ([GH-89837](https://github.com/godotengine/godot/pull/89837)). +- Fix wrong values displayed after duplicating an audio bus ([GH-89841](https://github.com/godotengine/godot/pull/89841)). +- Improve replication editor's pin button ([GH-89883](https://github.com/godotengine/godot/pull/89883)). +- Fix wrong extension filter for dependency editor ([GH-89912](https://github.com/godotengine/godot/pull/89912)). +- Disable auto-translation in sub-resource list menu ([GH-89915](https://github.com/godotengine/godot/pull/89915)). +- Refactor check for overridden methods in inner classes ([GH-89922](https://github.com/godotengine/godot/pull/89922)). +- Relax grid parameter constraints in texture region editor ([GH-89931](https://github.com/godotengine/godot/pull/89931)). +- Fix unexpected auto-translation of more editor components ([GH-89963](https://github.com/godotengine/godot/pull/89963)). +- Reset `tab_closing_menu_option` when canceling closing editor ([GH-89974](https://github.com/godotengine/godot/pull/89974)). +- Disable auto-translation of titles in `AssetLib` ([GH-89978](https://github.com/godotengine/godot/pull/89978)). +- Fix node duplication in update after external changes ([GH-89992](https://github.com/godotengine/godot/pull/89992)). +- Fix debugger tree error on editor start ([GH-90022](https://github.com/godotengine/godot/pull/90022)). +- Fix scroll to description ([GH-90035](https://github.com/godotengine/godot/pull/90035)). +- Fix FileSystemDock behavior when dropping an item in the current folder ([GH-90062](https://github.com/godotengine/godot/pull/90062)). +- Include 'Orphan Resource Explorer' and 'Upgrade Mesh Surfaces' in Command Palette ([GH-90078](https://github.com/godotengine/godot/pull/90078)). +- [Project Manager] Replace title bar logo with color variant ([GH-90080](https://github.com/godotengine/godot/pull/90080)). +- Improve string extraction of ETR POT file ([GH-90162](https://github.com/godotengine/godot/pull/90162)). +- Expose `goto_help` for GDExtension on `ScriptEditor` ([GH-90189](https://github.com/godotengine/godot/pull/90189)). +- Fix crash on invalid values in EditorPropertyArray/Dict ([GH-90265](https://github.com/godotengine/godot/pull/90265)). +- SceneTreeEditor: Fix crash when TreeItem is removed before callback ([GH-90266](https://github.com/godotengine/godot/pull/90266)). +- Ignore `ERR_FILE_CANT_OPEN` error when loading ([GH-90269](https://github.com/godotengine/godot/pull/90269)). +- Prevent dropping Resource to the same resource picker ([GH-90278](https://github.com/godotengine/godot/pull/90278)). +- Fix duplicated folder reference in Godot Editor after changing filename case ([GH-90280](https://github.com/godotengine/godot/pull/90280)). +- Inspect hovered node while dragging ([GH-90378](https://github.com/godotengine/godot/pull/90378)). +- Fix `_node_assign` will crash when `base_node` is nullptr ([GH-90414](https://github.com/godotengine/godot/pull/90414)). +- Add option to copy absolute path in file system dock popup ([GH-90421](https://github.com/godotengine/godot/pull/90421)). +- Correctly replace scene root when `must_reload` in `EditorData::check_and_update_scene()` ([GH-90432](https://github.com/godotengine/godot/pull/90432)). +- Move engine build profile editor to Tools submenu ([GH-90441](https://github.com/godotengine/godot/pull/90441)). +- Fix `theme_override` tooltip caching ([GH-90446](https://github.com/godotengine/godot/pull/90446)). +- Fix caret last fit when moving to line end ([GH-90455](https://github.com/godotengine/godot/pull/90455)). +- Fix enum detection for unnamed classes ([GH-90488](https://github.com/godotengine/godot/pull/90488)). +- Fix connection dialog raise error when it was previously opened in another scene ([GH-90514](https://github.com/godotengine/godot/pull/90514)). +- Fix folder colors not saving after project.godot is modified externally ([GH-90525](https://github.com/godotengine/godot/pull/90525)). +- Make the inherited scene root node unable to change type ([GH-90536](https://github.com/godotengine/godot/pull/90536)). +- Fix crash when dragging scene files to 2D/3D screen ([GH-90559](https://github.com/godotengine/godot/pull/90559)). +- Make the loading scene open in the current scene tab if the current scene is empty ([GH-90566](https://github.com/godotengine/godot/pull/90566)). +- Rearrange "Open In" menu items of FileSystem dock ([GH-90570](https://github.com/godotengine/godot/pull/90570)). +- Improve error when scene/resource is saved with newer format ([GH-90571](https://github.com/godotengine/godot/pull/90571)). +- Fix heap-use-after-free error in TileMapLayerEditor ([GH-90583](https://github.com/godotengine/godot/pull/90583)). +- Fix folder colors not present in editor dir dialog ([GH-90651](https://github.com/godotengine/godot/pull/90651)). +- Fix going forward backward in editor selection history ([GH-90653](https://github.com/godotengine/godot/pull/90653)). +- Improve UX when saving newer files on disk ([GH-90660](https://github.com/godotengine/godot/pull/90660)). +- Prevent crash when dropping Resource that can't load ([GH-90664](https://github.com/godotengine/godot/pull/90664)). +- Rename Q&A to Forum in the Help top bar ([GH-90676](https://github.com/godotengine/godot/pull/90676)). +- Fix editor's file explorer will show directories that should be skipped ([GH-90680](https://github.com/godotengine/godot/pull/90680)). +- Allow closing scene tab preview using Escape ([GH-90720](https://github.com/godotengine/godot/pull/90720)). +- Change update checker version source ([GH-90742](https://github.com/godotengine/godot/pull/90742)). +- Display Godot version and last edited timestamp in project manager ([GH-90770](https://github.com/godotengine/godot/pull/90770)). +- Don't show scene group progress for 1 scene ([GH-90784](https://github.com/godotengine/godot/pull/90784)). +- Disable Create button for abstract classes ([GH-90807](https://github.com/godotengine/godot/pull/90807)). +- Avoid double editing when clicking AnimatedSprite ([GH-90815](https://github.com/godotengine/godot/pull/90815)). +- Fix folder color not cleared for removed subfolders ([GH-90829](https://github.com/godotengine/godot/pull/90829)). +- Fix input map shortcuts incorrectly edited on cancel ([GH-90835](https://github.com/godotengine/godot/pull/90835)). +- Fix folder scan replacing project list ([GH-90845](https://github.com/godotengine/godot/pull/90845)). +- Use minor version in EditorSettings file name ([GH-90875](https://github.com/godotengine/godot/pull/90875)). +- Add option to open online doc for selected class in script editor ([GH-90952](https://github.com/godotengine/godot/pull/90952)). +- Organize existing code for editor plugins ([GH-90975](https://github.com/godotengine/godot/pull/90975)). +- Hide update status label when no action is required ([GH-91026](https://github.com/godotengine/godot/pull/91026)). +- Add editor setting to keep bottom panel state on play and stop game ([GH-91033](https://github.com/godotengine/godot/pull/91033)). +- Allow setting editor dock tabs to icon only ([GH-91039](https://github.com/godotengine/godot/pull/91039)). +- Remove `uv_editor_bounds` editor setting ([GH-91073](https://github.com/godotengine/godot/pull/91073)). +- Further speed up closing multiple scripts ([GH-91081](https://github.com/godotengine/godot/pull/91081)). +- Increase width of project settings window ([GH-91087](https://github.com/godotengine/godot/pull/91087)). +- Fix error when moving FileSystem dock ([GH-91090](https://github.com/godotengine/godot/pull/91090)). +- Avoid double handling of rename in the file system dock ([GH-91112](https://github.com/godotengine/godot/pull/91112)). +- Register text enter for script base class ([GH-91113](https://github.com/godotengine/godot/pull/91113)). +- Add show in filesystem option for file favorites ([GH-91158](https://github.com/godotengine/godot/pull/91158)). +- Don't edit current when changing docks v2 ([GH-91168](https://github.com/godotengine/godot/pull/91168)). +- Improve Audio Bus button pressed state visibility ([GH-91236](https://github.com/godotengine/godot/pull/91236)). +- Add text to icon-only interpolation OptionButton in blend space editor ([GH-91238](https://github.com/godotengine/godot/pull/91238)). +- Only add warning label for Layout group in Control category ([GH-91252](https://github.com/godotengine/godot/pull/91252)). +- Fix reparenting after hover delay ([GH-91265](https://github.com/godotengine/godot/pull/91265)). +- Rework global class hiding in addons ([GH-91337](https://github.com/godotengine/godot/pull/91337)). +- Increase threshold for files per directory in editor Find in Files ([GH-91338](https://github.com/godotengine/godot/pull/91338)). +- Remove code duplication for adding global script class ([GH-91379](https://github.com/godotengine/godot/pull/91379)). +- Fix editor spin slider RTL and margin ([GH-91384](https://github.com/godotengine/godot/pull/91384)). +- Fix crash when switching main screen from a disabled plugin main screen if code editor is floating ([GH-91396](https://github.com/godotengine/godot/pull/91396)). +- Ensure `--doctool` is run from root directory ([GH-91407](https://github.com/godotengine/godot/pull/91407)). +- Fix selecting root when opening scene ([GH-91435](https://github.com/godotengine/godot/pull/91435)). +- DAP: Fix typo in parsing of PackedVector3Array ([GH-91468](https://github.com/godotengine/godot/pull/91468)). +- Fix `FileSystemDock` thumbnails sometimes not displaying ([GH-91471](https://github.com/godotengine/godot/pull/91471)). +- Keep docks menu open when opening dock ([GH-91484](https://github.com/godotengine/godot/pull/91484)). +- Prevent some shortcut errors when generating docs ([GH-91515](https://github.com/godotengine/godot/pull/91515)). +- Fix EditorInspector crash when exiting ([GH-91538](https://github.com/godotengine/godot/pull/91538)). +- Remove error messages caused by Save on Focus feature ([GH-91555](https://github.com/godotengine/godot/pull/91555)). +- Fix infinite call loop on theme change ([GH-91595](https://github.com/godotengine/godot/pull/91595)). +- Update `ConnectDialog::_filter_method_list` to be case insensitive for search string ([GH-91598](https://github.com/godotengine/godot/pull/91598)). +- Limit icon size in `EditorDebuggerTree` ([GH-91622](https://github.com/godotengine/godot/pull/91622)). +- Fix temporary Euler when editing quaternion ([GH-91678](https://github.com/godotengine/godot/pull/91678)). +- Fix i18n in AudioStreamInteractive transition editor ([GH-91693](https://github.com/godotengine/godot/pull/91693)). +- Revert `as_sortable_control()` change in SplitContainer ([GH-91708](https://github.com/godotengine/godot/pull/91708)). +- Improve transition enabled header in interactive music editor ([GH-91709](https://github.com/godotengine/godot/pull/91709)). +- Fix `EditorHelpBitTooltip` + `ProgressDialog` causes crash ([GH-91716](https://github.com/godotengine/godot/pull/91716)). +- Fix `PropertyListHelper::_get_property` returning a valid value even if an index is outside the array valid indices ([GH-91760](https://github.com/godotengine/godot/pull/91760)). +- Fix Sprite2D editor history mismatch ([GH-91777](https://github.com/godotengine/godot/pull/91777)). +- Select next text to replace ([GH-91779](https://github.com/godotengine/godot/pull/91779)). +- Fix long category name display in Inspector ([GH-91820](https://github.com/godotengine/godot/pull/91820)). +- Fix FileBrowse and FolderBrowse icon style fill not getting replaced ([GH-91821](https://github.com/godotengine/godot/pull/91821)). +- Move "Add a new scene" button when Scene Tabs settings change ([GH-91859](https://github.com/godotengine/godot/pull/91859)). +- Change default parenting behavior when drag-and-dropping to 2d and 3d editor ([GH-91874](https://github.com/godotengine/godot/pull/91874)). +- Make performance monitor names translatable ([GH-91927](https://github.com/godotengine/godot/pull/91927)). +- Add Dutch translation for Linux desktop file ([GH-91928](https://github.com/godotengine/godot/pull/91928)). +- Fix categories and tooltips in `TileSet` editor ([GH-91932](https://github.com/godotengine/godot/pull/91932)). +- Skip unnecessary updates to scene groups and scripts ([GH-91980](https://github.com/godotengine/godot/pull/91980)). +- Create AudioStreamPlayer when dropping AudioStream ([GH-92004](https://github.com/godotengine/godot/pull/92004)). +- Fix default NodePaths saved in scene ([GH-92095](https://github.com/godotengine/godot/pull/92095)). +- Disable follow focus while updating inspector ([GH-92108](https://github.com/godotengine/godot/pull/92108)). +- Change the AudioStreamPlayer icons to be clearer ([GH-92116](https://github.com/godotengine/godot/pull/92116)). +- Fix log rebuilding crashing when there's no messages ([GH-92128](https://github.com/godotengine/godot/pull/92128)). +- Editor Feature Profile: Only rebuild selected TreeItem and all children when a property is edited ([GH-92136](https://github.com/godotengine/godot/pull/92136)). +- Don't translate preview in node batch rename dialog ([GH-92192](https://github.com/godotengine/godot/pull/92192)). +- Fix unchecking theme overrides not creating an undo action ([GH-92207](https://github.com/godotengine/godot/pull/92207)). +- Fix array variable with `@export_multiline` not registering changes ([GH-92225](https://github.com/godotengine/godot/pull/92225)). +- Prevent label width from flickering rapidly in editor frametime panel ([GH-92231](https://github.com/godotengine/godot/pull/92231)). +- Fix scene hash not updated when scene is empty ([GH-92253](https://github.com/godotengine/godot/pull/92253)). +- Fix TextEdit HScroll hiding after wrapping ([GH-92271](https://github.com/godotengine/godot/pull/92271)). +- Fix theme StyleBox override parameter completion ([GH-92296](https://github.com/godotengine/godot/pull/92296)). +- Fix crash on dictionary initialization after return to default in C# ([GH-92351](https://github.com/godotengine/godot/pull/92351)). +- Fix profiler seek line color in light modes, update on theme change ([GH-92389](https://github.com/godotengine/godot/pull/92389)). +- Avoid editor error reporting using resource loader thread's call queues ([GH-92426](https://github.com/godotengine/godot/pull/92426)). +- Select text in SpriteFramesEditor spin boxes on focus ([GH-92442](https://github.com/godotengine/godot/pull/92442)). +- Prevent connect `scroll_to_paragraph` multiple times to `class_desc` ([GH-92454](https://github.com/godotengine/godot/pull/92454)). +- Set `doc_name` even when categories are hidden in the inspector ([GH-92457](https://github.com/godotengine/godot/pull/92457)). +- Make signal connections dialog method picker respect bind/unbind ([GH-92465](https://github.com/godotengine/godot/pull/92465)). +- Fix error when dropping image onto the scene dock ([GH-92470](https://github.com/godotengine/godot/pull/92470)). +- Add missing space around the ratio lock button ([GH-92482](https://github.com/godotengine/godot/pull/92482)). +- Add range hint for `SubViewportContainer.stretch_shrink` ([GH-92500](https://github.com/godotengine/godot/pull/92500)). +- Fix AudioStreamPlayer icons, improve audio resource picker styling ([GH-92504](https://github.com/godotengine/godot/pull/92504)). +- Fix Window position preview in the editor ([GH-92506](https://github.com/godotengine/godot/pull/92506)). +- Remove unused `base_hint` from EditorPropertyNodePath ([GH-92511](https://github.com/godotengine/godot/pull/92511)). +- Enable custom separators to treat different characters as words ([GH-92514](https://github.com/godotengine/godot/pull/92514)). +- Update Add Scene button after TabBar resizes ([GH-92559](https://github.com/godotengine/godot/pull/92559)). +- Update editor `Window` preview position when resizing window ([GH-92577](https://github.com/godotengine/godot/pull/92577)). +- Rework and simplify update checking logic ([GH-92597](https://github.com/godotengine/godot/pull/92597)). +- Fix project settings reloading ([GH-92633](https://github.com/godotengine/godot/pull/92633)). +- Consistently display script icons for nodes in connect dialog's scene tree editor ([GH-92648](https://github.com/godotengine/godot/pull/92648)). +- Tweak property name style selector in the editor inspector ([GH-92665](https://github.com/godotengine/godot/pull/92665)). +- Fix huge .tscn icon and icon in background of File System panel ([GH-92669](https://github.com/godotengine/godot/pull/92669)). +- Swap last edited date and version/warning in Project Manager ([GH-92751](https://github.com/godotengine/godot/pull/92751)). +- Call `EditorNode::set_edited_scene()` manually instead of via the `replacing_by` signal ([GH-92760](https://github.com/godotengine/godot/pull/92760)). +- Add Globals tab to reorganize Project Settings dialog ([GH-92770](https://github.com/godotengine/godot/pull/92770)). +- Fix editor screenshots menu button's tooltip ([GH-92836](https://github.com/godotengine/godot/pull/92836)). +- Remove unused order variable from EditorResourcePreview ([GH-92871](https://github.com/godotengine/godot/pull/92871)). +- Add missing inspector dock update after node deletion ([GH-92930](https://github.com/godotengine/godot/pull/92930)). +- Fix theme updating of the inspector sections ([GH-93000](https://github.com/godotengine/godot/pull/93000)). +- Fix EditorFileSystem `update_files` after #92893 ([GH-93006](https://github.com/godotengine/godot/pull/93006)). +- System info: Remove empty parentheses when video adapter driver name is unknown ([GH-93033](https://github.com/godotengine/godot/pull/93033)). +- Fix `EditorHelpBit` title height is wrong on initialization ([GH-93040](https://github.com/godotengine/godot/pull/93040)). +- Fix find highlight when switching scripts ([GH-93056](https://github.com/godotengine/godot/pull/93056)). +- Fix EditorProperty spacing ([GH-93089](https://github.com/godotengine/godot/pull/93089)). +- Fix not being able to reopen signals panel immediately after connecting a signal ([GH-93110](https://github.com/godotengine/godot/pull/93110)). +- Fix crash when trying to undo SpriteFrames animation rename ([GH-93112](https://github.com/godotengine/godot/pull/93112)). +- Material: Fix marking as ready ([GH-93127](https://github.com/godotengine/godot/pull/93127)). +- Center the label in EditorObjectSelector ([GH-93129](https://github.com/godotengine/godot/pull/93129)). +- Fix noticeable freeze after saving a scene ([GH-93147](https://github.com/godotengine/godot/pull/93147)). +- Fix bug when downloading export templates and re-opening the template manager ([GH-93148](https://github.com/godotengine/godot/pull/93148)). +- Add missing TTR's for EditorProgress ([GH-93150](https://github.com/godotengine/godot/pull/93150)). +- EditorProgress: Use `BackgroundProgress` instead of `ProgressDialog` when called for a thread ([GH-93160](https://github.com/godotengine/godot/pull/93160)). +- Allow theming movie writer button icon color ([GH-93223](https://github.com/godotengine/godot/pull/93223)). +- Allow theming renderer colors ([GH-93229](https://github.com/godotengine/godot/pull/93229)). +- Unload addons before quitting to allow cleanup ([GH-93238](https://github.com/godotengine/godot/pull/93238)). +- Prevent generating preview for zero sized texture ([GH-93255](https://github.com/godotengine/godot/pull/93255)). +- Fix incorrect autoload path in error ([GH-93294](https://github.com/godotengine/godot/pull/93294)). +- Add missing RTL styles for InspectorActionButton ([GH-93318](https://github.com/godotengine/godot/pull/93318)). +- Add missing style overrides for viewport overlay buttons ([GH-93361](https://github.com/godotengine/godot/pull/93361)). +- Fix determining the availability of a new version ([GH-93391](https://github.com/godotengine/godot/pull/93391)). +- Make inspector spacing more themable ([GH-93435](https://github.com/godotengine/godot/pull/93435)). +- Add missing RTL styles for MainScreenButton ([GH-93520](https://github.com/godotengine/godot/pull/93520)). +- Include "PopupMenu" labels in POT gen ([GH-93521](https://github.com/godotengine/godot/pull/93521)). +- Add brief description tooltips to EditorResourcePicker ([GH-93523](https://github.com/godotengine/godot/pull/93523)). +- Update import dock when selecting resource in resource panel ([GH-93533](https://github.com/godotengine/godot/pull/93533)). +- Fix reselecting scene tree node after inspecting a resource ([GH-93543](https://github.com/godotengine/godot/pull/93543)). +- Center the label of EditorValidationPanel ([GH-93544](https://github.com/godotengine/godot/pull/93544)). +- Remove editor pseudolocalization debug feature ([GH-93554](https://github.com/godotengine/godot/pull/93554)). +- Fix crash on exit with shader editor ([GH-93558](https://github.com/godotengine/godot/pull/93558)). +- Fix clear custom color on invalid `tree_item_inspected` causing `Index p_column = 0 is out of bounds (cells.size() = 0).` error message ([GH-93576](https://github.com/godotengine/godot/pull/93576)). +- Add comment for editor particles Restart Emission shortcut not using Cmd on macOS ([GH-93581](https://github.com/godotengine/godot/pull/93581)). +- Add missing punctuation to the default TextEdit word separators ([GH-93656](https://github.com/godotengine/godot/pull/93656)). +- Center the label in overview of script editor ([GH-93661](https://github.com/godotengine/godot/pull/93661)). +- Fix find result current match count issues ([GH-93674](https://github.com/godotengine/godot/pull/93674)). +- Fix unnecessary overbright modulates used in a few editors ([GH-93720](https://github.com/godotengine/godot/pull/93720)). +- Speed up scene group scanning for text scenes ([GH-93723](https://github.com/godotengine/godot/pull/93723)). +- Make the frame time and info boxes use same margins ([GH-93736](https://github.com/godotengine/godot/pull/93736)). +- Set max width for icons in the quick open popup ([GH-93743](https://github.com/godotengine/godot/pull/93743)). +- macOS: Change the distraction-free mode shortcut ([GH-93789](https://github.com/godotengine/godot/pull/93789)). +- Update Node dock when theme changes ([GH-93868](https://github.com/godotengine/godot/pull/93868)). +- Fix a bunch of orphan StringName errors at ProjectSettings/Editor exit ([GH-93888](https://github.com/godotengine/godot/pull/93888)). +- Fix custom resources often missing from Quick Load dialog ([GH-93909](https://github.com/godotengine/godot/pull/93909)). +- Fix default font variation values handling in the property inspector ([GH-93957](https://github.com/godotengine/godot/pull/93957)). +- Fix `EditorHelpBitTooltip` for Signals dock ([GH-93967](https://github.com/godotengine/godot/pull/93967)). +- Update font preview directly instead of invalidating property list ([GH-93968](https://github.com/godotengine/godot/pull/93968)). +- Ignore trailing slashes in new project’s path when disabling Create Folder ([GH-94015](https://github.com/godotengine/godot/pull/94015)). +- Fix first time of Toggle Last Opened Bottom Panel opens Output panel ([GH-94040](https://github.com/godotengine/godot/pull/94040)). +- Fix Toggle Last Opened Bottom Panel not working after restoring FileSystem Dock to the side ([GH-94053](https://github.com/godotengine/godot/pull/94053)). +- Fix ScriptEditor `request_save_previous_state` signal type ([GH-94057](https://github.com/godotengine/godot/pull/94057)). +- Let EditorLog use the right call queue for thread safety ([GH-94079](https://github.com/godotengine/godot/pull/94079)). +- Fix editor inspector crashing when the old object is no longer valid ([GH-94101](https://github.com/godotengine/godot/pull/94101)). +- Fix wrong inspected node after drag&drop ([GH-94105](https://github.com/godotengine/godot/pull/94105)). +- Make `fdialog_project` up to become the child of `ProjectManager` instead of child of `ProjectDialog` ([GH-94113](https://github.com/godotengine/godot/pull/94113)). +- Unload addons when using `--import` or `--quit` ([GH-94116](https://github.com/godotengine/godot/pull/94116)). +- Fix edited node being removed before editor plugin handles focus loss ([GH-94162](https://github.com/godotengine/godot/pull/94162)). +- Fix resources being skipped in InstancePlaceholder ([GH-94345](https://github.com/godotengine/godot/pull/94345)). +- Fix removing a folder that contains a file is not removed from the FileSystem Dock ([GH-94435](https://github.com/godotengine/godot/pull/94435)). +- Fix crash when adding scenes with a group to the level scene ([GH-94450](https://github.com/godotengine/godot/pull/94450)). +- Consider tabs when calculating column for jump to error ([GH-94474](https://github.com/godotengine/godot/pull/94474)). +- Disable unique name in scene when making a node the root node ([GH-94491](https://github.com/godotengine/godot/pull/94491)). +- Improve Curve preview colors for consistency ([GH-94494](https://github.com/godotengine/godot/pull/94494)). +- Fix incorrect Curve editor preview thumbnail scaling ([GH-94571](https://github.com/godotengine/godot/pull/94571)). +- Fix editor crash when editor settings resource is invalid ([GH-94593](https://github.com/godotengine/godot/pull/94593)). +- Increase threshold for displaying scene group update progress ([GH-94594](https://github.com/godotengine/godot/pull/94594)). +- Change .gitignore to only exclude root android template folder ([GH-94597](https://github.com/godotengine/godot/pull/94597)). +- Fix Object encoded as id in dictionaries to be represented as int in the inspector ([GH-94610](https://github.com/godotengine/godot/pull/94610)). +- Fix certain resource previews empty with GL compat ([GH-94619](https://github.com/godotengine/godot/pull/94619)). +- Parse `auto_translate` when generating a POT file ([GH-94622](https://github.com/godotengine/godot/pull/94622)). +- Fix node gets wrongly selected after moving another node in the tree ([GH-94649](https://github.com/godotengine/godot/pull/94649)). +- Android Editor: Make progress dialog visible again ([GH-94662](https://github.com/godotengine/godot/pull/94662)). +- Fix editor settings still displayed when replaced ([GH-94932](https://github.com/godotengine/godot/pull/94932)). +- Split editor documentation cache by minor version ([GH-94980](https://github.com/godotengine/godot/pull/94980)). +- Fix global class cache file not present when no class name ([GH-94991](https://github.com/godotengine/godot/pull/94991)). +- Fix project name cleared when browsing path ([GH-95062](https://github.com/godotengine/godot/pull/95062)). +- [Android editor] Enable the display scale option in the Project manager's quick settings ([GH-95082](https://github.com/godotengine/godot/pull/95082)). +- [Android editor] Fix issue with importing projects ([GH-95086](https://github.com/godotengine/godot/pull/95086)). +- Don't drop `PackedScene` as property ([GH-95090](https://github.com/godotengine/godot/pull/95090)). +- Initialize project name when importing project ([GH-95245](https://github.com/godotengine/godot/pull/95245)). +- Fix use-after-free in `EditorHelp` ([GH-95307](https://github.com/godotengine/godot/pull/95307)). +- Fix order of Lock and Group icons in SceneTree ([GH-95329](https://github.com/godotengine/godot/pull/95329)). +- Fix label update for dict on item deletion ([GH-95364](https://github.com/godotengine/godot/pull/95364)). +- Fix FileSystem not updated on file deletion ([GH-95533](https://github.com/godotengine/godot/pull/95533)). #### Export -- Add a "version" project setting and use it in new export presets ([GH-35555](https://github.com/godotengine/godot/pull/35555)). -- Implement iOS one-click deploy ([GH-70662](https://github.com/godotengine/godot/pull/70662)). -- Add options to show icon in Android TV and run app as Android launcher ([GH-78164](https://github.com/godotengine/godot/pull/78164)). -- Add a button in the export dialog to fix missing texture formats ([GH-78457](https://github.com/godotengine/godot/pull/78457)). -- iOS: Add `export_project_only` flag ([GH-78641](https://github.com/godotengine/godot/pull/78641)). -- Re-architect how Android plugins are packaged and handled at export time ([GH-78958](https://github.com/godotengine/godot/pull/78958)). -- Fix export options of scripted `EditorExportPlugin`s ([GH-79025](https://github.com/godotengine/godot/pull/79025)). -- Android: Add option to always use WiFi to connect to remote debug ([GH-79504](https://github.com/godotengine/godot/pull/79504)). -- Improve headings for the export mode in the Export dialog ([GH-79725](https://github.com/godotengine/godot/pull/79725)). -- [macOS Export] Disable unpacked .app bundle export on Windows ([GH-79950](https://github.com/godotengine/godot/pull/79950)). -- Fix Windows console wrapper and icon being swapped ([GH-80357](https://github.com/godotengine/godot/pull/80357)). -- Add export setting to control whether to show the Godot app in the app library ([GH-80569](https://github.com/godotengine/godot/pull/80569)). -- Fix redundant enter tree notification in project export texture format ([GH-80967](https://github.com/godotengine/godot/pull/80967)). -- [iOS export] Switch export target extension based on export type ([GH-81365](https://github.com/godotengine/godot/pull/81365)). -- Expose `EditorExportPlatform::get_os_name()` ([GH-81430](https://github.com/godotengine/godot/pull/81430)). -- Fix `SubViewport` with `UPDATE_WHEN_VISIBLE` not working properly in exported project ([GH-81607](https://github.com/godotengine/godot/pull/81607)). -- [macOS export] Fix GDExtension framework `+x` flag errors, allow recursive signing on non macOS platform ([GH-81969](https://github.com/godotengine/godot/pull/81969)). -- Fix TextServer data export ([GH-82103](https://github.com/godotengine/godot/pull/82103)). -- iOS: Fix build on Xcode 14 and older ([GH-83088](https://github.com/godotengine/godot/pull/83088)). -- macOS: Remove deprecated altool notarization support, disable rcodesign for C# version ([GH-83482](https://github.com/godotengine/godot/pull/83482)). -- Use "version" project setting as macOS/iOS "short_version" fallback ([GH-83686](https://github.com/godotengine/godot/pull/83686)). -- Improve app / file version validation ([GH-84296](https://github.com/godotengine/godot/pull/84296)). -- [macOS export] Improve icon generation ([GH-84521](https://github.com/godotengine/godot/pull/84521)). -- Preserve the output from the gradle build command ([GH-84779](https://github.com/godotengine/godot/pull/84779)). -- Prevent the surface upgrade tool from running during export ([GH-85136](https://github.com/godotengine/godot/pull/85136)). -- iOS: Check if Xcode is installed in one-click deploy code ([GH-85168](https://github.com/godotengine/godot/pull/85168)). +- Provide ability to override `EditorExportPlugin::_export_end()` in C++ ([GH-72572](https://github.com/godotengine/godot/pull/72572)). +- Ensure Android keystore username and password are checked on export ([GH-83702](https://github.com/godotengine/godot/pull/83702)). +- [iOS export] Add export options for performance capabilities and min. iOS version ([GH-84162](https://github.com/godotengine/godot/pull/84162)). +- Update the validation logic for the package name ([GH-84676](https://github.com/godotengine/godot/pull/84676)). +- Add `single`/`double` as export features automatically ([GH-84711](https://github.com/godotengine/godot/pull/84711)). +- Fix order of operations for macOS template check ([GH-84990](https://github.com/godotengine/godot/pull/84990)). +- [iOS one-click] Add support for Xcode 15 devicectl ([GH-85546](https://github.com/godotengine/godot/pull/85546)). +- iOS: Use `mdfind` to check if Xcode is installed in one-click deploy code ([GH-85774](https://github.com/godotengine/godot/pull/85774)). +- Add option to install android build template for export ([GH-85819](https://github.com/godotengine/godot/pull/85819)). +- Ensure more export errors are reported to users ([GH-85845](https://github.com/godotengine/godot/pull/85845)). +- Add PWA option to ensure cross-origin isolation headers on web export ([GH-86089](https://github.com/godotengine/godot/pull/86089)). +- D3D12: Automatically copy runtime DLLs during export ([GH-86093](https://github.com/godotengine/godot/pull/86093)). +- Set an appropriate minimum size for labels in windows that display incorrectly ([GH-86145](https://github.com/godotengine/godot/pull/86145)). +- [iOS export] Improve `.xcframework` exporting ([GH-86288](https://github.com/godotengine/godot/pull/86288)). +- iOS: Remove deprecated LaunchImages support and switch to Storyboard by default ([GH-86312](https://github.com/godotengine/godot/pull/86312)). +- Specify the path to the Java SDK used for the Android gradle build ([GH-86383](https://github.com/godotengine/godot/pull/86383)). +- Add logging when macOS export will fail due to disabled texture formats ([GH-86769](https://github.com/godotengine/godot/pull/86769)). +- Hide Keystore Release password on Android's Export window ([GH-86882](https://github.com/godotengine/godot/pull/86882)). +- [macOS export] Fix RLE icon generation ([GH-86934](https://github.com/godotengine/godot/pull/86934)). +- [macOS/iOS export] Add option to set custom Info.plist data ([GH-87029](https://github.com/godotengine/godot/pull/87029)). +- Add clearer error message for missing project icon during Android export ([GH-87208](https://github.com/godotengine/godot/pull/87208)). +- Add basic multimesh data needed for headless export to the Dummy rendering server ([GH-87390](https://github.com/godotengine/godot/pull/87390)). +- Add DummyShader handling to Dummy RenderingServer to ensure shader parameters are saved in headless export ([GH-87392](https://github.com/godotengine/godot/pull/87392)). +- GDScript: Reintroduce binary tokenization on export ([GH-87634](https://github.com/godotengine/godot/pull/87634)). +- [macOS export] Allow unpacked .app export in "Distribution" export mode ([GH-87657](https://github.com/godotengine/godot/pull/87657)). +- Remove workaround in GLTF exporter that double converts `ra` textures to `rg` ([GH-87775](https://github.com/godotengine/godot/pull/87775)). +- Don't invoke adb with no runnable Android preset ([GH-87823](https://github.com/godotengine/godot/pull/87823)). +- macOS: Generate min. `Info.plist` for frameworks if it's missing. Validate framework bundle ID characters ([GH-87908](https://github.com/godotengine/godot/pull/87908)). +- Fix data race regarding `server_quit` in `EditorExportPlatformWeb` ([GH-88043](https://github.com/godotengine/godot/pull/88043)). +- Assign missing surface data fields in dummy render server ([GH-88210](https://github.com/godotengine/godot/pull/88210)). +- Allow export plugins to override export option values ([GH-88291](https://github.com/godotengine/godot/pull/88291)). +- Android: Allow using alternative Gradle build directory ([GH-88297](https://github.com/godotengine/godot/pull/88297)). +- Unify settings for PC texture formats, removed obsoleted ETC feature ([GH-88325](https://github.com/godotengine/godot/pull/88325)). +- GDScript: Fix extension comparison for exported scripts ([GH-88365](https://github.com/godotengine/godot/pull/88365)). +- Add export setting to specify whether the native libraries should be compressed for the gradle build ([GH-88385](https://github.com/godotengine/godot/pull/88385)). +- Add an `Advanced Options` toggle to the editor export preset ([GH-88419](https://github.com/godotengine/godot/pull/88419)). +- Display a warning if device CPU architecture is not active in the export preset ([GH-88611](https://github.com/godotengine/godot/pull/88611)). +- Physics: Fix exporting with 3D disabled ([GH-88668](https://github.com/godotengine/godot/pull/88668)). +- Update the list of advanced export options for the Android platform ([GH-88840](https://github.com/godotengine/godot/pull/88840)). +- GDScript: Canonicalize script path in FQCN ([GH-88853](https://github.com/godotengine/godot/pull/88853)). +- Don't attempt shutting down adb on exit if not started ([GH-88865](https://github.com/godotengine/godot/pull/88865)). +- GDScript: Fix paths in `ResourceFormatLoaderGDScript::load()` ([GH-89005](https://github.com/godotengine/godot/pull/89005)). +- Linux: Handle export preset compat with 'Linux/X11' platform name ([GH-89044](https://github.com/godotengine/godot/pull/89044)). +- Update the Android export validation logic to account for the custom gradle android source template ([GH-89173](https://github.com/godotengine/godot/pull/89173)). +- Use relative file base offset for embedded PCK ([GH-89214](https://github.com/godotengine/godot/pull/89214)). +- Fix reporting exit code when command line export fails ([GH-89234](https://github.com/godotengine/godot/pull/89234)). +- iOS: Restore backward compatibility with old export templates ([GH-89348](https://github.com/godotengine/godot/pull/89348)). +- GDScript: Fix continuation lines in `GDScriptTokenizerBuffer` ([GH-89472](https://github.com/godotengine/godot/pull/89472)). +- Windows: Fix exporting as ZIP when console wrapper and/or embedded PCK is enabled ([GH-89511](https://github.com/godotengine/godot/pull/89511)). +- Fix `gdextensionlibs.json` storage path in Android gradle build ([GH-89579](https://github.com/godotengine/godot/pull/89579)). +- [iOS Export] Check directory content before deleting old export leftovers ([GH-89790](https://github.com/godotengine/godot/pull/89790)). +- Allow skipping imported resource files from export ([GH-90365](https://github.com/godotengine/godot/pull/90365)). +- [iOS export] Add support for privacy manifest configuration ([GH-90375](https://github.com/godotengine/godot/pull/90375)). +- Android: Add `POST_NOTIFICATIONS` permission to the list of permissions available in the Export dialog ([GH-90377](https://github.com/godotengine/godot/pull/90377)). +- [iOS Export] Fix adding static libs to the Xcode project ([GH-90379](https://github.com/godotengine/godot/pull/90379)). +- Windows: Support all possible suffixes for console wrapper ([GH-90387](https://github.com/godotengine/godot/pull/90387)). +- [macOS export] Detect embedded helper executables using MachO header ([GH-90428](https://github.com/godotengine/godot/pull/90428)). +- Add `--import` command-line flag ([GH-90431](https://github.com/godotengine/godot/pull/90431)). +- Android: Standardize permission descriptions, add urls, remove deprecated tag from non-deprecated permission ([GH-90546](https://github.com/godotengine/godot/pull/90546)). +- Fix issue with resolving the path for the Android keystore file ([GH-90603](https://github.com/godotengine/godot/pull/90603)). +- Fix the logic to load export preset's options overrides ([GH-90606](https://github.com/godotengine/godot/pull/90606)). +- Automatically generate the Android debug keystore ([GH-90611](https://github.com/godotengine/godot/pull/90611)). +- Web: Fix serve.py utility on Windows ([GH-90698](https://github.com/godotengine/godot/pull/90698)). +- Fix issue causing the `copyAndRename*` task to fail on occasions on Windows machines ([GH-90802](https://github.com/godotengine/godot/pull/90802)). +- Splash image support and new progress bar for HTML5 Web Export ([GH-91128](https://github.com/godotengine/godot/pull/91128)). +- Fix export dialog sizing issue on small devices ([GH-91291](https://github.com/godotengine/godot/pull/91291)). +- Add more Remote Debug options to the web platform ([GH-91369](https://github.com/godotengine/godot/pull/91369)). +- [macOS export] Add support for privacy manifest configuration ([GH-91377](https://github.com/godotengine/godot/pull/91377)). +- Default to non-threaded export setting for the web ([GH-91623](https://github.com/godotengine/godot/pull/91623)). +- Web: Fix splash screen background color in HTML shell ([GH-91852](https://github.com/godotengine/godot/pull/91852)). +- Web: Fix quotes style in HTML shell head include ([GH-91856](https://github.com/godotengine/godot/pull/91856)). +- Disable remote debug button when there are no runnable presets ([GH-92032](https://github.com/godotengine/godot/pull/92032)). +- Use `GLOBAL_GET` for `window_{height,width}_override` ([GH-92075](https://github.com/godotengine/godot/pull/92075)). +- Fix web export state for Remote Debug ([GH-92163](https://github.com/godotengine/godot/pull/92163)). +- Ensure that Godot's version of `libc++_shared.so` is always selected ([GH-92525](https://github.com/godotengine/godot/pull/92525)). +- Fix iOS exports never embedding framework bundles ([GH-92692](https://github.com/godotengine/godot/pull/92692)). +- [iOS export] Automatically generate ARM64 simulator library from device library if it's missing ([GH-92750](https://github.com/godotengine/godot/pull/92750)). +- Fix issues related to code-signing for macOS exports ([GH-93101](https://github.com/godotengine/godot/pull/93101)). +- Android: Revert hiding of custom templates under the `Advanced Options` toggle ([GH-93551](https://github.com/godotengine/godot/pull/93551)). +- Web: Add "threads"/"nothreads" feature tags to export presets ([GH-93556](https://github.com/godotengine/godot/pull/93556)). +- Add `nothreads` feature tag to signify lack of `THREADS_ENABLED` ([GH-93563](https://github.com/godotengine/godot/pull/93563)). +- EditorExportPlugin: Call `_export_file` for all resource types ([GH-93878](https://github.com/godotengine/godot/pull/93878)). +- Fix error when exporting files without import parameters ([GH-94405](https://github.com/godotengine/godot/pull/94405)). +- Fix issue preventing enabling the remote button for Android/iOS ([GH-94425](https://github.com/godotengine/godot/pull/94425)). +- [macOS export] Do not stop export on signing errors ([GH-94677](https://github.com/godotengine/godot/pull/94677)). +- Fix Android export failing with custom keystores and no JDK setup in the OS environment ([GH-94809](https://github.com/godotengine/godot/pull/94809)). +- Windows: Improve editor grouping, set friendly name registry key for exported projects ([GH-94976](https://github.com/godotengine/godot/pull/94976)). +- iOS: Fix dylib GDExtension conversion ([GH-95323](https://github.com/godotengine/godot/pull/95323)). #### GDExtension -- Fix GDExtension classes derived from abstract GDExtension classes always being registered as abstract ([GH-67512](https://github.com/godotengine/godot/pull/67512)). -- Add GDExtension support for OpenXR extension wrappers ([GH-68259](https://github.com/godotengine/godot/pull/68259)). -- Allow GDExtension to register unexposed classes ([GH-70329](https://github.com/godotengine/godot/pull/70329)). -- Set vararg methods' ptrcall of builtin classes, and let them can be called without arguments ([GH-76047](https://github.com/godotengine/godot/pull/76047)). -- Add GDExtension function to construct StringName directly from `char*` ([GH-78580](https://github.com/godotengine/godot/pull/78580)). -- Allow implementing `get_class_category` in GDExtension ([GH-78995](https://github.com/godotengine/godot/pull/78995)). -- Allow CallableCustom objects to be created from GDExtensions ([GH-79005](https://github.com/godotengine/godot/pull/79005)). -- Allow resizing Strings from GDExtension ([GH-79156](https://github.com/godotengine/godot/pull/79156)). -- Prevent GDExtensions from trying to remove editor plugins at shutdown ([GH-79492](https://github.com/godotengine/godot/pull/79492)). -- Fix `_get_property_list` not working correctly in parent classes ([GH-79683](https://github.com/godotengine/godot/pull/79683)). -- Add `_bind_compatibility_methods` to Object ([GH-79702](https://github.com/godotengine/godot/pull/79702)). -- Fix incorrect virtual function in `VideoStream.set_paused` ([GH-79710](https://github.com/godotengine/godot/pull/79710)). -- Add support for indexed properties in GDExtension ([GH-79763](https://github.com/godotengine/godot/pull/79763)). -- Add `get_script_instance` to GDExtension ([GH-80040](https://github.com/godotengine/godot/pull/80040)). -- `PtrToArg::convert()` uses const-reference where possible ([GH-80075](https://github.com/godotengine/godot/pull/80075)). -- Fix or workaround recent extension API compatibility issues ([GH-80168](https://github.com/godotengine/godot/pull/80168)). -- Copy DLL to a temp file before opening ([GH-80188](https://github.com/godotengine/godot/pull/80188)). -- CI: Make extension API compatibility check mandatory ([GH-80220](https://github.com/godotengine/godot/pull/80220)). -- Implement reloading of GDExtensions ([GH-80284](https://github.com/godotengine/godot/pull/80284)). -- Add compatibility notice after #78266 ([GH-80374](https://github.com/godotengine/godot/pull/80374)). -- Expose PlaceHolderScriptInstance to GDExtension ([GH-80394](https://github.com/godotengine/godot/pull/80394)). -- Fix version check for GDExtension ([GH-80591](https://github.com/godotengine/godot/pull/80591)). -- Use `String::resize()` and `CharString` in `text_server_adv` again ([GH-80642](https://github.com/godotengine/godot/pull/80642)). -- Add functions for non-ptr style virtual calls in GDExtension ([GH-80671](https://github.com/godotengine/godot/pull/80671)). -- SCons: Fix ThorVG build option in TextServers with #80095 ([GH-80713](https://github.com/godotengine/godot/pull/80713)). -- Remove DLL copy if it fails to load ([GH-80720](https://github.com/godotengine/godot/pull/80720)). -- Godot Android plugin re-architecture ([GH-80740](https://github.com/godotengine/godot/pull/80740)). -- Exclude unexposed classes from the `extension_api.json` ([GH-80852](https://github.com/godotengine/godot/pull/80852)). -- Fix overriding `_export_begin`, `_export_file` and `_export_end` from GDExtension ([GH-80999](https://github.com/godotengine/godot/pull/80999)). -- Allocate `GDExtensionScriptInstanceInfo2` for compatibility on the heap to prevent crash ([GH-81206](https://github.com/godotengine/godot/pull/81206)). -- Use godot-cpp 4.1 for the "Godot CPP" CI workflow to prevent circular dependency ([GH-81238](https://github.com/godotengine/godot/pull/81238)). -- fix `bool` unknown in C ([GH-81247](https://github.com/godotengine/godot/pull/81247)). -- Allow implementing `ScriptInstance::validate_property()` from GDExtension ([GH-81261](https://github.com/godotengine/godot/pull/81261)). -- Fix bindings of `PhysicsServer3DRenderingServerHandler` ([GH-81298](https://github.com/godotengine/godot/pull/81298)). -- Add compatibility methods for RenderingDevice BarrierMask ([GH-81356](https://github.com/godotengine/godot/pull/81356)). -- Allow implementing `Object::_validate_property()` from GDExtension ([GH-81515](https://github.com/godotengine/godot/pull/81515)). -- Fix method hashes with default arguments ([GH-81521](https://github.com/godotengine/godot/pull/81521)). -- Delete left-over DLL copy before making a new copy ([GH-81576](https://github.com/godotengine/godot/pull/81576)). -- Expose `texture_create_from_extension` to GDExtension ([GH-82168](https://github.com/godotengine/godot/pull/82168)). -- Remove redundant method bind hash check ([GH-82191](https://github.com/godotengine/godot/pull/82191)). -- Optionally include documentation in GDExtension API dump ([GH-82331](https://github.com/godotengine/godot/pull/82331)). -- Fix type of `notification_func` ([GH-82332](https://github.com/godotengine/godot/pull/82332)). -- Moved `face_index` field in 3D `RayResult` to end of struct ([GH-82403](https://github.com/godotengine/godot/pull/82403)). -- Fix inconsistent `last_modified_time` handling in GDExtension ([GH-82603](https://github.com/godotengine/godot/pull/82603)). -- Don't deprecate old method of getting script category ([GH-82682](https://github.com/godotengine/godot/pull/82682)). -- Fixes to allow object-less callables throughout Godot ([GH-82695](https://github.com/godotengine/godot/pull/82695)). -- Web: Catch using GDExtensions in a non-dlink build ([GH-82790](https://github.com/godotengine/godot/pull/82790)). -- Convert `validated_call()` to `ptrcall()` (rather than `call()`) ([GH-82794](https://github.com/godotengine/godot/pull/82794)). -- Expose `Object::free_instance_binding()` to GDExtension ([GH-82799](https://github.com/godotengine/godot/pull/82799)). -- Resolve relative icon paths for GDExtensions ([GH-82842](https://github.com/godotengine/godot/pull/82842)). -- Fix extensions loading/initializing even when entry point fails ([GH-82861](https://github.com/godotengine/godot/pull/82861)). -- Remove I/O error popup when failing to load/unload extension ([GH-82907](https://github.com/godotengine/godot/pull/82907)). -- On Linux, favor local symbols when loading a shared library ([GH-82973](https://github.com/godotengine/godot/pull/82973)). -- Use correct return pointer for validated calls that return `Variant` ([GH-83054](https://github.com/godotengine/godot/pull/83054)). -- Fix incorrect error message about vararg methods ([GH-83107](https://github.com/godotengine/godot/pull/83107)). -- Fix missing editor singletons when dumping extension api ([GH-83239](https://github.com/godotengine/godot/pull/83239)). -- Prevent issues with the editor trying to reload GDExtensions through its usual mechanism ([GH-83285](https://github.com/godotengine/godot/pull/83285)). -- Add brief description in GDExtension API dump with docs ([GH-83318](https://github.com/godotengine/godot/pull/83318)). -- Fix comment in `gdextension_interface.h` ([GH-83415](https://github.com/godotengine/godot/pull/83415)). -- Allow coexistence of GDScript and GDExtension virtual methods in the same object ([GH-83583](https://github.com/godotengine/godot/pull/83583)). -- Add `path` option to `ScriptLanguageExtension::_validate` ([GH-83588](https://github.com/godotengine/godot/pull/83588)). -- Fix `variant_iter_get()` actually calling `iter_next()` ([GH-83681](https://github.com/godotengine/godot/pull/83681)). -- Fixed error on loading extensions ([GH-83734](https://github.com/godotengine/godot/pull/83734)). -- Use `ObjectID` when creating custom callable ([GH-83800](https://github.com/godotengine/godot/pull/83800)). -- Linux: Disable `RTLD_DEEPBIND` mode for `dlopen()` in sanitizer builds ([GH-84210](https://github.com/godotengine/godot/pull/84210)). -- Save and compare modification times separately for reload ([GH-84315](https://github.com/godotengine/godot/pull/84315)). -- [iOS, GDExtension] Fix loading and exporting static libraries and xcframeworks ([GH-84493](https://github.com/godotengine/godot/pull/84493)). -- Change `GDExtension`'s `library_path` back to an absolute path ([GH-84620](https://github.com/godotengine/godot/pull/84620)). -- Remove Android specific abis from the export preset feature list ([GH-84720](https://github.com/godotengine/godot/pull/84720)). -- Check that `GDExtensionCompatHashes` are valid when generating `extension_api.json` ([GH-84973](https://github.com/godotengine/godot/pull/84973)). -- iOS: Fix GDExtension init callback array reallocation ([GH-85216](https://github.com/godotengine/godot/pull/85216)). +- Allow registering "runtime classes" from GDExtension ([GH-82554](https://github.com/godotengine/godot/pull/82554)). +- Add an interface for loading extra documentation ([GH-83747](https://github.com/godotengine/godot/pull/83747)). +- Fix some DEFVALs to use the right type ([GH-84906](https://github.com/godotengine/godot/pull/84906)). +- Fix updating cached singletons when reloading GDScripts ([GH-85373](https://github.com/godotengine/godot/pull/85373)). +- CI: Add 4.2-stable.expected file for GDExtension compatibility checks ([GH-85748](https://github.com/godotengine/godot/pull/85748)). +- Fix overriding `CollisionObject3D::_mouse_enter()` and `_mouse_exit()` from GDExtension ([GH-85870](https://github.com/godotengine/godot/pull/85870)). +- Fix operator documentation in GDExtension API dump with docs ([GH-86087](https://github.com/godotengine/godot/pull/86087)). +- Replace `GDVIRTUAL_CALL` with `GDVIRTUAL_REQUIRED_CALL` where applicable ([GH-86169](https://github.com/godotengine/godot/pull/86169)). +- Correctly register editor-only module classes with the API ([GH-86209](https://github.com/godotengine/godot/pull/86209)). +- Fix `ScriptLanguageExtension::_find_function` argument names ([GH-86520](https://github.com/godotengine/godot/pull/86520)). +- Distinguish between dynamic library not found and can't be opened ([GH-86682](https://github.com/godotengine/godot/pull/86682)). +- Fix Android dynamic library loading ([GH-86792](https://github.com/godotengine/godot/pull/86792)). +- Editor: Add missing virtual bind to `EditorNode3DGizmo(Plugin)` ([GH-86881](https://github.com/godotengine/godot/pull/86881)). +- Fix virtual calls for GDExtension in `CollisionObject2D` ([GH-86908](https://github.com/godotengine/godot/pull/86908)). +- Add renaming of PDB files to avoid blocking them ([GH-87117](https://github.com/godotengine/godot/pull/87117)). +- Allow GDExtensions to register virtual methods and call them on scripts ([GH-87758](https://github.com/godotengine/godot/pull/87758)). +- Expose `NOTIFICATION_EXTENSION_RELOADED` to `ClassDB` ([GH-87863](https://github.com/godotengine/godot/pull/87863)). +- Add null check for GDExtension deinitialization ([GH-87938](https://github.com/godotengine/godot/pull/87938)). +- Fix `gdextension_compat_hashes.cpp` for double precision builds ([GH-88188](https://github.com/godotengine/godot/pull/88188)). +- Fix loading GDExtension dependencies on Android ([GH-88381](https://github.com/godotengine/godot/pull/88381)). +- Allow GDExtensions to set a `compatibility_maximum` ([GH-88417](https://github.com/godotengine/godot/pull/88417)). +- Unbind GDExtension methods that can't reasonably be used ([GH-88418](https://github.com/godotengine/godot/pull/88418)). +- Fix `-Wtype-limits` warning in `compatibility_maximum` patch check ([GH-88527](https://github.com/godotengine/godot/pull/88527)). +- Expose OpenXR hand tracker handles ([GH-88566](https://github.com/godotengine/godot/pull/88566)). +- Allow registering "runtime classes" in modules (not just GDExtension) ([GH-88683](https://github.com/godotengine/godot/pull/88683)). +- Use godot-cpp 4.2 for the "Godot CPP" CI workflow ([GH-88736](https://github.com/godotengine/godot/pull/88736)). +- Fix calling ancestor methods on runtime classes ([GH-88870](https://github.com/godotengine/godot/pull/88870)). +- Add extension support for argument count to `ScriptInstance` ([GH-89050](https://github.com/godotengine/godot/pull/89050)). +- Pass count when freeing method and property lists for script instances ([GH-89055](https://github.com/godotengine/godot/pull/89055)). +- TextServer: Use GDVIRTUAL_REQUIRED_CALL for required extensions methods, update extension docs ([GH-89207](https://github.com/godotengine/godot/pull/89207)). +- OpenXR: Allow GDExtensions to provide multiple, ordered composition layers ([GH-89460](https://github.com/godotengine/godot/pull/89460)). +- Print correct path when unable to find GDExtension library ([GH-89677](https://github.com/godotengine/godot/pull/89677)). +- Bind constants related to 6DOF joints ([GH-89851](https://github.com/godotengine/godot/pull/89851)). +- Fix `Resource::get_rid override` not working in GDExtension ([GH-90273](https://github.com/godotengine/godot/pull/90273)). +- XR: Fix binds for composition layer virtuals ([GH-90391](https://github.com/godotengine/godot/pull/90391)). +- Use `likely()` in `PtrToArg` when checking for null `Object *`s ([GH-90394](https://github.com/godotengine/godot/pull/90394)). +- Fix GDExtension hot reload for classes not created via `ClassDB::instantiate()` ([GH-90447](https://github.com/godotengine/godot/pull/90447)). +- Defer call to `set_break_language` ([GH-90776](https://github.com/godotengine/godot/pull/90776)). +- Compatibility: Add stub for VisualShaderNodeComment ([GH-90797](https://github.com/godotengine/godot/pull/90797)). +- Expose `ClassDB::class_get_property_default_value` method ([GH-90916](https://github.com/godotengine/godot/pull/90916)). +- Fix missing library path breaking hot reloading ([GH-90961](https://github.com/godotengine/godot/pull/90961)). +- Fix GDExtension documentation disappearing after hot-reload ([GH-91126](https://github.com/godotengine/godot/pull/91126)). +- Fix ptrcalls to static GDExtension methods ([GH-91153](https://github.com/godotengine/godot/pull/91153)). +- Provide `free_property_list_func` with length of array ([GH-91179](https://github.com/godotengine/godot/pull/91179)). +- Bind compatibility GDExtension methods removed in #88418 ([GH-91502](https://github.com/godotengine/godot/pull/91502)). +- Generate docs from GDExtensions using `--gdextension-docs` with `--doctool` ([GH-91518](https://github.com/godotengine/godot/pull/91518)). +- Add default implementation of `ScriptLanguageExtension::preferred_file_name_casing` ([GH-91570](https://github.com/godotengine/godot/pull/91570)). +- Prevent crash during shutdown as singletons are deleted ([GH-91806](https://github.com/godotengine/godot/pull/91806)). +- Release Engine after unregistering GDExtensions ([GH-92060](https://github.com/godotengine/godot/pull/92060)). +- Don't use `ERR_PRINT_ONCE()` for runtime class error because it will hide errors ([GH-92216](https://github.com/godotengine/godot/pull/92216)). +- Fix `ClassDB` not checking for editor classes properly ([GH-92345](https://github.com/godotengine/godot/pull/92345)). +- [TextServer, GDExtension] Fix building text servers as GDExtension, expose new/changed low-level methods to GDExtension API ([GH-92715](https://github.com/godotengine/godot/pull/92715)). +- Use GDExtension `to_string` in Node ([GH-92827](https://github.com/godotengine/godot/pull/92827)). +- Make `profiling_get_frame_data` call the correct GDVIRTUAL method ([GH-93281](https://github.com/godotengine/godot/pull/93281)). +- Object: Use const correct `GDExtensionConstStringNamePtr` ([GH-93288](https://github.com/godotengine/godot/pull/93288)). +- Fix setting base class properties on a runtime class ([GH-94089](https://github.com/godotengine/godot/pull/94089)). +- GDExtension docs: Advise bindings to use `uint64_t` for bitfields ([GH-94307](https://github.com/godotengine/godot/pull/94307)). +- Fix to restore `library_path` as absolute path ([GH-94373](https://github.com/godotengine/godot/pull/94373)). #### GDScript -- Highlight doc comments in a different color ([GH-72751](https://github.com/godotengine/godot/pull/72751)). -- Fix jumping to function definition using `Ctrl+LMB` or the "Lookup Symbol" button ([GH-73196](https://github.com/godotengine/godot/pull/73196)). -- Improve GDScript identifier tokenization ([GH-73226](https://github.com/godotengine/godot/pull/73226)). -- Add code region folding to CodeEdit ([GH-74843](https://github.com/godotengine/godot/pull/74843)). -- Add raw string literals (r-strings) ([GH-74995](https://github.com/godotengine/godot/pull/74995)). -- Show script errors from depended scripts ([GH-75216](https://github.com/godotengine/godot/pull/75216)). -- Fix for not being able to ignore shadowing warnings on class scope ([GH-75620](https://github.com/godotengine/godot/pull/75620)). -- Add a script method to get its class icon ([GH-75656](https://github.com/godotengine/godot/pull/75656)). -- Improve call analysis ([GH-75988](https://github.com/godotengine/godot/pull/75988)). -- Support threads in the script debugger ([GH-76582](https://github.com/godotengine/godot/pull/76582)). -- Fix conflict between property and group names ([GH-78254](https://github.com/godotengine/godot/pull/78254)). -- Add error message when a GDScript resource fails to load ([GH-78540](https://github.com/godotengine/godot/pull/78540)). -- Check `get_node()` shorthand in static functions ([GH-78552](https://github.com/godotengine/godot/pull/78552)). -- Editor: Remove unused Class Name field from Create Script dialog ([GH-78573](https://github.com/godotengine/godot/pull/78573)). -- Fix incorrect error message for utility functions ([GH-78882](https://github.com/godotengine/godot/pull/78882)). -- Add `@deprecated` and `@experimental` doc comment tags ([GH-78941](https://github.com/godotengine/godot/pull/78941)). -- Fix regression with GDScript enum descriptions now showing up in documentation ([GH-78953](https://github.com/godotengine/godot/pull/78953)). -- Add static analysis error reporting in `GDScriptCache::get_full_script()` ([GH-79163](https://github.com/godotengine/godot/pull/79163)). -- Make onready variables created from dropping nodes include custom types ([GH-79198](https://github.com/godotengine/godot/pull/79198)). -- Solve `_populate_class_members()` cyclic dependency problem ([GH-79205](https://github.com/godotengine/godot/pull/79205)). -- Properly track extents of constants ([GH-79301](https://github.com/godotengine/godot/pull/79301)). -- Load global classes when running debug tests ([GH-79425](https://github.com/godotengine/godot/pull/79425)). -- Fix subscript resolution for constant non-metatypes ([GH-79510](https://github.com/godotengine/godot/pull/79510)). -- Change GDScript tests to use InstancePlaceholder as the example abstract class ([GH-79524](https://github.com/godotengine/godot/pull/79524)). -- Highlight comment markers (`TODO`, `FIXME`, etc.) ([GH-79761](https://github.com/godotengine/godot/pull/79761)). -- Fix bug with identifier shadowed below in current scope ([GH-79880](https://github.com/godotengine/godot/pull/79880)). -- Replace ptrcalls on MethodBind to validated calls ([GH-79893](https://github.com/godotengine/godot/pull/79893)). -- Add validation for `@export_node_path` annotation arguments ([GH-79935](https://github.com/godotengine/godot/pull/79935)). -- Optimize operators by assuming the types ([GH-79990](https://github.com/godotengine/godot/pull/79990)). -- Add constant string support for POT generator ([GH-80020](https://github.com/godotengine/godot/pull/80020)). -- Implement pattern guards for match statement ([GH-80085](https://github.com/godotengine/godot/pull/80085)). -- Fix regression with native signal not found ([GH-80165](https://github.com/godotengine/godot/pull/80165)). -- Add static typing for `for` loop variable ([GH-80247](https://github.com/godotengine/godot/pull/80247)). -- Assign temporary path to preloaded resources ([GH-80281](https://github.com/godotengine/godot/pull/80281)). -- Fix completion option location not found ([GH-80283](https://github.com/godotengine/godot/pull/80283)). -- Allow mixed indentation on blank lines ([GH-80365](https://github.com/godotengine/godot/pull/80365)). -- Fix `get_method` from named lambda ([GH-80506](https://github.com/godotengine/godot/pull/80506)). -- Fix "Identifier not found" error when accessing inner class from inside ([GH-80510](https://github.com/godotengine/godot/pull/80510)). -- Fix superfluous `"` in error message ([GH-80568](https://github.com/godotengine/godot/pull/80568)). -- Check if any global script class is shadowed by a variable ([GH-80587](https://github.com/godotengine/godot/pull/80587)). -- Fixes LSP connection error when launched in a separate thread ([GH-80686](https://github.com/godotengine/godot/pull/80686)). -- Improve DocGen ([GH-80745](https://github.com/godotengine/godot/pull/80745)). -- Fix expected argument count for `Callable` call errors ([GH-80844](https://github.com/godotengine/godot/pull/80844)). -- Fix lambda resolution with cyclic references ([GH-80923](https://github.com/godotengine/godot/pull/80923)). -- Allow using local constants as types ([GH-80964](https://github.com/godotengine/godot/pull/80964)). -- Language Server: Improve hovered symbol resolution, fix renaming bugs, implement reference lookup ([GH-80973](https://github.com/godotengine/godot/pull/80973)). -- Fix `_get_debug_tooltip` crash if tooltip string is too large ([GH-81018](https://github.com/godotengine/godot/pull/81018)). -- Fix highlighting of hex numbers with separators ([GH-81039](https://github.com/godotengine/godot/pull/81039)). -- Fix `get_*_list()` methods return incorrect info ([GH-81079](https://github.com/godotengine/godot/pull/81079)). -- Optimize GDScript VM codegen for MSVC ([GH-81200](https://github.com/godotengine/godot/pull/81200)). -- Fix subclass methods not inheriting RPC info ([GH-81201](https://github.com/godotengine/godot/pull/81201)). -- Fix an error when dragging nodes into built-in scripts because script does not inherit Node ([GH-81299](https://github.com/godotengine/godot/pull/81299)). -- Don't make array literal typed in weak type context ([GH-81332](https://github.com/godotengine/godot/pull/81332)). -- Add an optional `untyped_declaration` warning ([GH-81355](https://github.com/godotengine/godot/pull/81355)). -- Remove `REDUNDANT_FOR_VARIABLE_TYPE` warning ([GH-81440](https://github.com/godotengine/godot/pull/81440)). -- Fix compilation of expressions compiling other classes ([GH-81577](https://github.com/godotengine/godot/pull/81577)). -- Fix dumping of signal API parameters ([GH-81599](https://github.com/godotengine/godot/pull/81599)). -- Fix some lambda bugs ([GH-81605](https://github.com/godotengine/godot/pull/81605)). -- Fix lambda hot reloading ([GH-81628](https://github.com/godotengine/godot/pull/81628)). -- Fix POT generator crash on assignee with index ([GH-81653](https://github.com/godotengine/godot/pull/81653)). -- Fix and improve doc comment parsing ([GH-81699](https://github.com/godotengine/godot/pull/81699)). -- Add check for `super()` methods not being implemented ([GH-81808](https://github.com/godotengine/godot/pull/81808)). -- LSP: Fix autocomplete quote handling ([GH-81833](https://github.com/godotengine/godot/pull/81833)). -- LSP: Add `--lsp-port` as a command line argument ([GH-81844](https://github.com/godotengine/godot/pull/81844)). -- Rewrite a small comment in GDScript tokenizer code ([GH-81881](https://github.com/godotengine/godot/pull/81881)). -- Make array literal typed if `for` loop variable type is specified ([GH-82030](https://github.com/godotengine/godot/pull/82030)). -- GDScript DocGen: Fix and improve appearance of metatypes and values ([GH-82067](https://github.com/godotengine/godot/pull/82067)). -- Prevent constructing and inheriting engine singletons ([GH-82098](https://github.com/godotengine/godot/pull/82098)). -- Fix `--gdscript-docs` tool failing when autoloads are used in the project ([GH-82116](https://github.com/godotengine/godot/pull/82116)). -- Add `INFERRED_DECLARATION` warning ([GH-82139](https://github.com/godotengine/godot/pull/82139)). -- Fix duplication of inherited script properties ([GH-82186](https://github.com/godotengine/godot/pull/82186)). -- Fix crash with `GDScriptNativeClass` ([GH-82294](https://github.com/godotengine/godot/pull/82294)). -- Fix for GDScriptHighlighter dictionaries as function arguments ([GH-82326](https://github.com/godotengine/godot/pull/82326)). -- Add return type covariance and parameter type contravariance ([GH-82477](https://github.com/godotengine/godot/pull/82477)). -- Improve highlighting of types ([GH-82516](https://github.com/godotengine/godot/pull/82516)). -- Fix `UNSAFE_CALL_ARGUMENT` warning for `Variant` constructors ([GH-82547](https://github.com/godotengine/godot/pull/82547)). -- Core: Fix `Object::has_method()` for script static methods ([GH-82767](https://github.com/godotengine/godot/pull/82767)). -- Fix `native_type` is empty for autoload without script ([GH-82784](https://github.com/godotengine/godot/pull/82784)). -- Fix unresolved datatype for incomplete binary operator ([GH-82789](https://github.com/godotengine/godot/pull/82789)). -- Add error when exporting node in non `Node`-derived classes ([GH-82843](https://github.com/godotengine/godot/pull/82843)). -- Fixes internal Script Editor crash with External Editor active ([GH-82956](https://github.com/godotengine/godot/pull/82956)). -- Fix external editor hot reload for GDScript ([GH-82986](https://github.com/godotengine/godot/pull/82986)). -- Fix GDScript cache assigning UID as scene path ([GH-83039](https://github.com/godotengine/godot/pull/83039)). -- GDScript DocGen: Fix regression with return metatypes ([GH-83049](https://github.com/godotengine/godot/pull/83049)). -- Deleting unnecessary include in GDScriptParser ([GH-83050](https://github.com/godotengine/godot/pull/83050)). -- Fix modifying base script exports not propagating to derived scripts ([GH-83123](https://github.com/godotengine/godot/pull/83123)). -- Add autocompletion for static variables accessed via class ([GH-83150](https://github.com/godotengine/godot/pull/83150)). -- Code Editor: Fix regression with using doc comments for code regions ([GH-83216](https://github.com/godotengine/godot/pull/83216)). -- Fix unresolved datatype for incomplete expressions ([GH-83257](https://github.com/godotengine/godot/pull/83257)). -- Fix grammar typo in GDScript error message ([GH-83455](https://github.com/godotengine/godot/pull/83455)). -- Fix non-static call is allowed in static var lambda body ([GH-83486](https://github.com/godotengine/godot/pull/83486)). -- Fix `GDScriptCache::get_full_script` eating parsing errors because of early exit ([GH-83540](https://github.com/godotengine/godot/pull/83540)). -- Don't optimize division and modulo on debug ([GH-83569](https://github.com/godotengine/godot/pull/83569)). -- Fix comment typo in `gdscript_parser.h` ([GH-83792](https://github.com/godotengine/godot/pull/83792)). -- SCons: Fix build with GDScript LSP disabled ([GH-84191](https://github.com/godotengine/godot/pull/84191)). -- Fix lambda cross-thread dynamics (take 2) ([GH-85248](https://github.com/godotengine/godot/pull/85248)). -- Fix GDScript thread-exit routine assuming thread-enter was called ([GH-85432](https://github.com/godotengine/godot/pull/85432)). +- Add editor settings for autocompletion with NodePath and StringName ([GH-66481](https://github.com/godotengine/godot/pull/66481)). +- Add `@export_custom` annotation ([GH-72912](https://github.com/godotengine/godot/pull/72912)). +- Improve autocompletion with `get_node` ([GH-79386](https://github.com/godotengine/godot/pull/79386)). +- Update completion menu even if no options exist ([GH-79387](https://github.com/godotengine/godot/pull/79387)). +- Add module description in markdown ([GH-81345](https://github.com/godotengine/godot/pull/81345)). +- Documentation: Add support for deprecated/experimental messages ([GH-81458](https://github.com/godotengine/godot/pull/81458)). +- Include lambda dependencies ([GH-81629](https://github.com/godotengine/godot/pull/81629)). +- Change GDScriptDataType `container_element_type` to vector container ([GH-81662](https://github.com/godotengine/godot/pull/81662)). +- Add `@export_storage` annotation ([GH-82122](https://github.com/godotengine/godot/pull/82122)). +- Core: Allow methods of built-in `Variant` types to be used as Callables ([GH-82264](https://github.com/godotengine/godot/pull/82264)). +- Improve error messages for invalid indexing ([GH-82639](https://github.com/godotengine/godot/pull/82639)). +- Allow `@export`ed Arrays to set property hints for their elements ([GH-82952](https://github.com/godotengine/godot/pull/82952)). +- Fix `@warning_ignore` annotation issues ([GH-83037](https://github.com/godotengine/godot/pull/83037)). +- Allow empty parentheses for property getter declaration ([GH-83120](https://github.com/godotengine/godot/pull/83120)). +- Highlight code region comments ([GH-83220](https://github.com/godotengine/godot/pull/83220)). +- Fix `UNSAFE_CAST` warning ([GH-84043](https://github.com/godotengine/godot/pull/84043)). +- Fix crash when extending taken-over named class ([GH-84148](https://github.com/godotengine/godot/pull/84148)). +- Autocompletion: Mark datatype as constant for constant arrays ([GH-84492](https://github.com/godotengine/godot/pull/84492)). +- Fix autocompletion for enum members in the core classes ([GH-84532](https://github.com/godotengine/godot/pull/84532)). +- Fix autocompletion after DOLLAR token ([GH-84706](https://github.com/godotengine/godot/pull/84706)). +- Fix DAP breakpoints being cleared on closed scripts ([GH-84898](https://github.com/godotengine/godot/pull/84898)). +- Add unit test runner for autocompletion ([GH-85178](https://github.com/godotengine/godot/pull/85178)). +- Filter groups and categories from autocompletion ([GH-85196](https://github.com/godotengine/godot/pull/85196)). +- Handle global classes when resolving type from `PropertyInfo` ([GH-85215](https://github.com/godotengine/godot/pull/85215)). +- Prefer identifiers annotated type if assigned type is incompatible to it ([GH-85224](https://github.com/godotengine/godot/pull/85224)). +- Handle global classes when resolving property location ([GH-85239](https://github.com/godotengine/godot/pull/85239)). +- Generate `arghint` for script types ([GH-85382](https://github.com/godotengine/godot/pull/85382)). +- Suggest scene unique nodes in `get_node` autocompletion ([GH-85384](https://github.com/godotengine/godot/pull/85384)). +- Make annotations register statically in parser ([GH-85487](https://github.com/godotengine/godot/pull/85487)). +- Move "Expected indented block" error message's line number back to where the error is ([GH-85488](https://github.com/godotengine/godot/pull/85488)). +- Stop caching packed scenes in GDScript cache (on preload) ([GH-85501](https://github.com/godotengine/godot/pull/85501)). +- Speed up `GDScript::get_must_clear_dependencies()` ([GH-85603](https://github.com/godotengine/godot/pull/85603)). +- Make GDScriptAnalyzer aware of properties from other languages ([GH-85703](https://github.com/godotengine/godot/pull/85703)). +- Adjust `STATIC_CALLED_ON_INSTANCE` warning to not force native type ([GH-85918](https://github.com/godotengine/godot/pull/85918)). +- Fix accessing static function as `Callable` in static context ([GH-86088](https://github.com/godotengine/godot/pull/86088)). +- Fix POT generator skips some nodes ([GH-86091](https://github.com/godotengine/godot/pull/86091)). +- Fix regression when autocompleting subscript on get node ([GH-86111](https://github.com/godotengine/godot/pull/86111)). +- Fix type highlighting ([GH-86176](https://github.com/godotengine/godot/pull/86176)). +- Fix the autocomplete function for the `self` keyword ([GH-86341](https://github.com/godotengine/godot/pull/86341)). +- Fix POT generator skips some nodes (part 2) ([GH-86471](https://github.com/godotengine/godot/pull/86471)). +- Fix symbol lookup in index subscript ([GH-86554](https://github.com/godotengine/godot/pull/86554)). +- Lambda hotswap fixes ([GH-86569](https://github.com/godotengine/godot/pull/86569)). +- Improve sorting of enum autocompletion ([GH-86667](https://github.com/godotengine/godot/pull/86667)). +- Hot-reload changed scripts only ([GH-86676](https://github.com/godotengine/godot/pull/86676)). +- Add `StringName` support to `@GDScript.len` ([GH-86704](https://github.com/godotengine/godot/pull/86704)). +- Allow utility functions to be used as `Callable` ([GH-86823](https://github.com/godotengine/godot/pull/86823)). +- Allow specifying a scene in completion tests ([GH-86961](https://github.com/godotengine/godot/pull/86961)). +- Add tests for `get_node` autocompletion ([GH-86973](https://github.com/godotengine/godot/pull/86973)). +- Improve error message when a GDScript instance fails to be constructed ([GH-86999](https://github.com/godotengine/godot/pull/86999)). +- Simplify script paths to ensure proper resource path checks ([GH-87124](https://github.com/godotengine/godot/pull/87124)). +- Handle GDScript in `_type_from_variant` for autocompletion ([GH-87278](https://github.com/godotengine/godot/pull/87278)). +- Allow `free()` to be used as Callable ([GH-87294](https://github.com/godotengine/godot/pull/87294)). +- Better hide internal properties from users ([GH-87381](https://github.com/godotengine/godot/pull/87381)). +- Use autoload singleton name in `GDScriptDocGen` ([GH-87421](https://github.com/godotengine/godot/pull/87421)). +- Make `GDScriptUtilityCallable` return call error when method is invalid ([GH-87783](https://github.com/godotengine/godot/pull/87783)). +- Add `is not` operator ([GH-87939](https://github.com/godotengine/godot/pull/87939)). +- Prevent running `String` number functions on invalid literal ([GH-87941](https://github.com/godotengine/godot/pull/87941)). +- Set `has_type` false if it is `BUILTIN` but `Variant::NIL` ([GH-88020](https://github.com/godotengine/godot/pull/88020)). +- Enable Add Type Hints editor setting by default ([GH-88026](https://github.com/godotengine/godot/pull/88026)). +- Fix NodePath autocompletion to ensure paths are quoted when required ([GH-88071](https://github.com/godotengine/godot/pull/88071)). +- Add fallback argument hints for default values ([GH-88211](https://github.com/godotengine/godot/pull/88211)). +- Fix type highlighting after whitespace ([GH-88876](https://github.com/godotengine/godot/pull/88876)). +- Clean up some unused code ([GH-88899](https://github.com/godotengine/godot/pull/88899)). +- Core: Add `Callable.create` static method for `Variant` callables ([GH-88948](https://github.com/godotengine/godot/pull/88948)). +- Fix some test file paths ([GH-89151](https://github.com/godotengine/godot/pull/89151)). +- Fix use after free in `GDScriptLanguage::debug_get_globals` ([GH-89274](https://github.com/godotengine/godot/pull/89274)). +- Allow LSP to process multiple messages per poll ([GH-89284](https://github.com/godotengine/godot/pull/89284)). +- Fix enum autocompletion for core classes ([GH-89382](https://github.com/godotengine/godot/pull/89382)). +- Update `@GDScript` documentation ([GH-89484](https://github.com/godotengine/godot/pull/89484)). +- Fix missing gutter icon for inner class method overrides ([GH-89545](https://github.com/godotengine/godot/pull/89545)). +- Fix object iterator opcodes ([GH-89639](https://github.com/godotengine/godot/pull/89639)). +- Correctly report invalid read-only access ([GH-89648](https://github.com/godotengine/godot/pull/89648)). +- Fix `for` expression is highlighted as type ([GH-89659](https://github.com/godotengine/godot/pull/89659)). +- Improve DocGen for non-constant expressions ([GH-89738](https://github.com/godotengine/godot/pull/89738)). +- Completion Tests: Add script to owner ([GH-89884](https://github.com/godotengine/godot/pull/89884)). +- Fix uninitialized local variables not being reset ([GH-89990](https://github.com/godotengine/godot/pull/89990)). +- Fix errors when renaming/moving/deleting global scripts ([GH-90186](https://github.com/godotengine/godot/pull/90186)). +- Don't pass `self` when calling a static function from a non-static context ([GH-90223](https://github.com/godotengine/godot/pull/90223)). +- Fix multiline array/dictionary match statements ([GH-90373](https://github.com/godotengine/godot/pull/90373)). +- Add tests for signal await with parameters ([GH-90398](https://github.com/godotengine/godot/pull/90398)). +- Fix highlighting escapes in multiline raw strings ([GH-90419](https://github.com/godotengine/godot/pull/90419)). +- Don't warn on unassigned for builtin-typed variables ([GH-90442](https://github.com/godotengine/godot/pull/90442)). +- Infer type with string format operator ([GH-90448](https://github.com/godotengine/godot/pull/90448)). +- Register the export info correctly when a script is used as the variable type for Node ([GH-90487](https://github.com/godotengine/godot/pull/90487)). +- Resolve types from autoload scenes ([GH-90498](https://github.com/godotengine/godot/pull/90498)). +- Assume constructor to be accessible from class ([GH-90552](https://github.com/godotengine/godot/pull/90552)). +- Allow casting enum to int ([GH-90580](https://github.com/godotengine/godot/pull/90580)). +- Fix out of date errors in depended scripts ([GH-90601](https://github.com/godotengine/godot/pull/90601)). +- Fix some export annotation issues ([GH-90716](https://github.com/godotengine/godot/pull/90716)). +- Warn when enum variable has no default ([GH-90756](https://github.com/godotengine/godot/pull/90756)). +- Suppress unused constant warning with underscore ([GH-90794](https://github.com/godotengine/godot/pull/90794)). +- LSP: Have `GDScriptWorkspace::list_script_files` respect `.gdignore` ([GH-90949](https://github.com/godotengine/godot/pull/90949)). +- Fix test `reset_uninit_local_vars.gd` failure ([GH-91120](https://github.com/godotengine/godot/pull/91120)). +- Perform validated calls with static methods ([GH-91192](https://github.com/godotengine/godot/pull/91192)). +- Call implicit ready on base script first ([GH-91364](https://github.com/godotengine/godot/pull/91364)). +- Fix access non-static members in static context ([GH-91412](https://github.com/godotengine/godot/pull/91412)). +- Initialize static variables with defaults in-editor ([GH-91472](https://github.com/godotengine/godot/pull/91472)). +- Autocompletion: Analyze CLASS types as they are encountered ([GH-91653](https://github.com/godotengine/godot/pull/91653)). +- Show custom icons in autocompletion suggestions ([GH-91923](https://github.com/godotengine/godot/pull/91923)). +- Add support for `atr` and `atr_n` to POT generator ([GH-91951](https://github.com/godotengine/godot/pull/91951)). +- Fix `STANDALONE_EXPRESSION` warning for `preload()` ([GH-92027](https://github.com/godotengine/godot/pull/92027)). +- Fix segfault on invalid script ([GH-92035](https://github.com/godotengine/godot/pull/92035)). +- Fix broken built-in script reloading ([GH-92177](https://github.com/godotengine/godot/pull/92177)). +- Fix lambdas capturing non-local variables ([GH-92241](https://github.com/godotengine/godot/pull/92241)). +- Fix completion for `new` arguments ([GH-92251](https://github.com/godotengine/godot/pull/92251)). +- Fix synchronization of global class name ([GH-92303](https://github.com/godotengine/godot/pull/92303)). +- DAP: Add `--dap-port` as a command line argument ([GH-92336](https://github.com/godotengine/godot/pull/92336)). +- [GDScript LSP] Fix `show_native_symbol_in_editor` ([GH-92386](https://github.com/godotengine/godot/pull/92386)). +- Fix subscript resolution on constant non-metatype GDScript base ([GH-92544](https://github.com/godotengine/godot/pull/92544)). +- Do not produce `INFERRED_DECLARATION` on type import ([GH-92558](https://github.com/godotengine/godot/pull/92558)). +- Partially allow member lookup on invalid scripts ([GH-92609](https://github.com/godotengine/godot/pull/92609)). +- Invalidate cached parser chain when reloading ([GH-92616](https://github.com/godotengine/godot/pull/92616)). +- Add more autocompletion tests ([GH-92688](https://github.com/godotengine/godot/pull/92688)). +- Editor: Hide GDScript internal functions from method selectors ([GH-92802](https://github.com/godotengine/godot/pull/92802)). +- Add coloring for completion of Color components ([GH-92874](https://github.com/godotengine/godot/pull/92874)). +- Fix goto definition for `new` method ([GH-92885](https://github.com/godotengine/godot/pull/92885)). +- Avoid deadlock possibility in multi-threaded load ([GH-93032](https://github.com/godotengine/godot/pull/93032)). +- Autocompletion: Add support for string name option in more places ([GH-93057](https://github.com/godotengine/godot/pull/93057)). +- Fix mismatched external parser with binary exports ([GH-93166](https://github.com/godotengine/godot/pull/93166)). +- Enhance handling of cyclic dependencies ([GH-93346](https://github.com/godotengine/godot/pull/93346)). +- Fix non-global class export ([GH-93384](https://github.com/godotengine/godot/pull/93384)). +- Fix symbol lookup for native enums ([GH-93566](https://github.com/godotengine/godot/pull/93566)). +- Fix editor crash when invalid global class script path ([GH-93575](https://github.com/godotengine/godot/pull/93575)). +- Add `CONFUSABLE_CAPTURE_REASSIGNMENT` warning ([GH-93691](https://github.com/godotengine/godot/pull/93691)). +- Fix false positive `CONFUSABLE_CAPTURE_REASSIGNMENT` warnings ([GH-93699](https://github.com/godotengine/godot/pull/93699)). +- Autocompletion: Don't use `in` operator to decide over variant lookup ([GH-93815](https://github.com/godotengine/godot/pull/93815)). +- Fix GDScript analyzer error when instantiating EditorPlugins ([GH-93942](https://github.com/godotengine/godot/pull/93942)). +- Fix `get_argument_count` for lambda `Callable`s ([GH-93964](https://github.com/godotengine/godot/pull/93964)). +- Fix implicit cast to typed array when passing parameter ([GH-94025](https://github.com/godotengine/godot/pull/94025)). +- Fix `get_method` for lambda self `Callable`s ([GH-94076](https://github.com/godotengine/godot/pull/94076)). +- Fix "Mismatched external parser" for autoloads ([GH-94131](https://github.com/godotengine/godot/pull/94131)). +- Call setter on simple setter chain without getter ([GH-94138](https://github.com/godotengine/godot/pull/94138)). +- Make errors on `RefCounted.free()` more accurate ([GH-94238](https://github.com/godotengine/godot/pull/94238)). +- Restore support for `Token::UNDERSCORE` in identifiers ([GH-94327](https://github.com/godotengine/godot/pull/94327)). +- Autocompletion: Register depended parsers with the main parser ([GH-94424](https://github.com/godotengine/godot/pull/94424)). +- Speed up `GDScriptLanguage::finish` ([GH-94505](https://github.com/godotengine/godot/pull/94505)). +- Fix false positive cases of `ENUM_VARIABLE_WITHOUT_DEFAULT` ([GH-94635](https://github.com/godotengine/godot/pull/94635)). +- Fix incorrect default values ​​in `_make_arguments_hint()` ([GH-94664](https://github.com/godotengine/godot/pull/94664)). +- Fix incorrect setter call for reference types ([GH-94674](https://github.com/godotengine/godot/pull/94674)). +- GDScriptTestRunner: Fix compiler error output ([GH-94676](https://github.com/godotengine/godot/pull/94676)). +- GDScriptCache: Clear abandoned parser refs ([GH-94678](https://github.com/godotengine/godot/pull/94678)). +- Fix locals clearing after exiting `while` block ([GH-94730](https://github.com/godotengine/godot/pull/94730)). +- Fix common mismatched external parser errors (second try) ([GH-94871](https://github.com/godotengine/godot/pull/94871)). +- Fix unnecessary calls to `remove_parser` ([GH-95115](https://github.com/godotengine/godot/pull/95115)). +- Fix resolve class inheritance after file rename ([GH-95330](https://github.com/godotengine/godot/pull/95330)). #### GUI -- Add option to allow echo events in menu shortcuts ([GH-36493](https://github.com/godotengine/godot/pull/36493)). -- Expose and rename ItemList's `_check_shape_changed` to `force_update_list_size` ([GH-63634](https://github.com/godotengine/godot/pull/63634)). -- Add Duplicate Lines shortcut to CodeTextEditor ([GH-66553](https://github.com/godotengine/godot/pull/66553)). -- Refactor `mouse_entered` and `mouse_exited` signals ([GH-67791](https://github.com/godotengine/godot/pull/67791)). -- Fix cursor behavior for multiselect in Tree while holding CTRL ([GH-71024](https://github.com/godotengine/godot/pull/71024)). -- Fix code completion override of home and end keys ([GH-71519](https://github.com/godotengine/godot/pull/71519)). -- ItemList: Clarify distinction between disabled and selected in sending signals ([GH-74250](https://github.com/godotengine/godot/pull/74250)). -- Add `inner_item_margin_*` Theme constants to the Tree control ([GH-75460](https://github.com/godotengine/godot/pull/75460)). -- Expose finding valid focus neighbors of a `Control` by side ([GH-76027](https://github.com/godotengine/godot/pull/76027)). -- Fix RichTextLabel character line and paragraph index getters ([GH-76759](https://github.com/godotengine/godot/pull/76759)). -- Add a `[pulse]` built-in effect to RichTextLabel ([GH-77117](https://github.com/godotengine/godot/pull/77117)). -- Fix unnecessary break when calculating the height of visible lines ([GH-77280](https://github.com/godotengine/godot/pull/77280)). -- Prevent disappearance of mouse when SpinBox is hidden while dragging ([GH-77804](https://github.com/godotengine/godot/pull/77804)). -- Make it possible to change character transform in RichTextEffect ([GH-77819](https://github.com/godotengine/godot/pull/77819)). -- Add `loop` property to VideoStreamPlayer ([GH-77857](https://github.com/godotengine/godot/pull/77857)). -- Expose VideoStreamPlayer video length ([GH-77858](https://github.com/godotengine/godot/pull/77858)). -- Ensure that `_drop_physics_mouseover` only happens when necessary ([GH-78078](https://github.com/godotengine/godot/pull/78078)). -- Use S, V in hue bar of ColorPicker ([GH-78100](https://github.com/godotengine/godot/pull/78100)). -- Move registration of `fallbacks` property in the base Font class ([GH-78266](https://github.com/godotengine/godot/pull/78266)). -- Add ability to set the tooltip text of a `TreeItem` button ([GH-78393](https://github.com/godotengine/godot/pull/78393)). -- Make GraphEdit's cpp virtuals equal to gdscript ([GH-78426](https://github.com/godotengine/godot/pull/78426)). -- Fix ColorPicker margin theme property ([GH-78468](https://github.com/godotengine/godot/pull/78468)). -- Embedded Popups store their safe_rect in their embedder ([GH-78476](https://github.com/godotengine/godot/pull/78476)). -- Fix text overlapping icon in `Tree` ([GH-78756](https://github.com/godotengine/godot/pull/78756)). -- Enable `InputEvent`-filtering in `SubViewportContainer` ([GH-78762](https://github.com/godotengine/godot/pull/78762)). -- Fix disabled slider highlighting ([GH-78776](https://github.com/godotengine/godot/pull/78776)). -- Fix delay on tab resizing when (un)hovering tabs ([GH-78777](https://github.com/godotengine/godot/pull/78777)). -- Fix invalid minimum size for translated messages in option button ([GH-78835](https://github.com/godotengine/godot/pull/78835)). -- Fix incorrect property names in `FontFile::_get_property_list()` ([GH-78907](https://github.com/godotengine/godot/pull/78907)). -- Add compatibility properties to `TouchScreenButton` ([GH-78940](https://github.com/godotengine/godot/pull/78940)). -- RTL: Add `pop_all`, `push_context` and `pop_context` methods, and use it for `print_rich` to avoid unclosed tags ([GH-79011](https://github.com/godotengine/godot/pull/79011)). -- Move cached values into `color_mode.cpp` and apply fixes to OKHSL ([GH-79037](https://github.com/godotengine/godot/pull/79037)). -- Bind missing default value for `RichTextLabel` methods ([GH-79053](https://github.com/godotengine/godot/pull/79053)). -- Rename `button_pressed` default signal binding to avoid shadowing ([GH-79064](https://github.com/godotengine/godot/pull/79064)). -- Revert "Fix focusloss of non-exclusive `AcceptDialog` with `close_on_escape`" ([GH-79084](https://github.com/godotengine/godot/pull/79084)). -- Allow to focus individual tabs in `TabBar`/`TabContainer` ([GH-79104](https://github.com/godotengine/godot/pull/79104)). -- Enabled missing Tree title button font and font size theme settings ([GH-79165](https://github.com/godotengine/godot/pull/79165)). -- Debug CanvasItem redraw ([GH-79169](https://github.com/godotengine/godot/pull/79169)). -- Deselect curve point with RMB on the empty space ([GH-79175](https://github.com/godotengine/godot/pull/79175)). -- Add `closed` property to Line2D ([GH-79182](https://github.com/godotengine/godot/pull/79182)). -- Update FileDialog button activity when `file_mode` is changed ([GH-79211](https://github.com/godotengine/godot/pull/79211)). -- Make `SubViewportContainer` event propagation aware of focused Control ([GH-79248](https://github.com/godotengine/godot/pull/79248)). -- HarfBuzz: Update to version 8.0.0 ([GH-79260](https://github.com/godotengine/godot/pull/79260)). -- ICU4C: Update to version 73.2 ([GH-79272](https://github.com/godotengine/godot/pull/79272)). -- FreeType: Update to version 2.13.1 ([GH-79273](https://github.com/godotengine/godot/pull/79273)). -- Check `FLAG_POPUP` to close an AcceptDialog when parent is focused ([GH-79293](https://github.com/godotengine/godot/pull/79293)). -- Remove GraphNode's comment property and related functionality ([GH-79307](https://github.com/godotengine/godot/pull/79307)). -- Clean up/refactor GraphEdit ([GH-79308](https://github.com/godotengine/godot/pull/79308)). -- Clean up/refactor GraphNode and make it more flexible ([GH-79311](https://github.com/godotengine/godot/pull/79311)). -- Fix `Tree` performance regression by using cache ([GH-79325](https://github.com/godotengine/godot/pull/79325)). -- macOS: Add `about_to_open` and `popup_hide` callback for the global menus ([GH-79361](https://github.com/godotengine/godot/pull/79361)). -- Add a default theme for unfocused Windows ([GH-79393](https://github.com/godotengine/godot/pull/79393)). -- Fix Button clipping when internal margins exist ([GH-79455](https://github.com/godotengine/godot/pull/79455)). -- Fix native popups auto-closing when interacting with non-client area ([GH-79456](https://github.com/godotengine/godot/pull/79456)). -- Make `OptionButton` resize when disabling "Fit to Longest Item" ([GH-79494](https://github.com/godotengine/godot/pull/79494)). -- Add drag'n'drop text option for `LineEdit` and `RichTextLabel` ([GH-79563](https://github.com/godotengine/godot/pull/79563)). -- macOS: Fix uncapped frame rate for windows in the non-active workspaces ([GH-79572](https://github.com/godotengine/godot/pull/79572)). -- Fix `root_node_layout_direction` project setting being incorrectly exposed as a range ([GH-79611](https://github.com/godotengine/godot/pull/79611)). -- Fix corner radius not scaling with theme scale in the default theme ([GH-79640](https://github.com/godotengine/godot/pull/79640)). -- Snap CharFX offset to nearest pixel when setting is enabled ([GH-79705](https://github.com/godotengine/godot/pull/79705)). -- Remove spaces from input of HTML color in color picker ([GH-79782](https://github.com/godotengine/godot/pull/79782)). -- Correctly display tooltips for buttons in Tree when they overlap cell content ([GH-79792](https://github.com/godotengine/godot/pull/79792)). -- Prevent SubViewportContainer overriding Subviewport's cursor with its own cursor ([GH-79805](https://github.com/godotengine/godot/pull/79805)). -- RichTextLabel: Ensure the `select_all` function selects all items ([GH-79818](https://github.com/godotengine/godot/pull/79818)). -- [Text Server] Fix ellipsis outline drawing ([GH-79844](https://github.com/godotengine/godot/pull/79844)). -- Label: Remove extra line spacing from Label minimum size calculations ([GH-79913](https://github.com/godotengine/godot/pull/79913)). -- Fix Tree check propagation not unchecking parent items ([GH-79946](https://github.com/godotengine/godot/pull/79946)). -- Free submenu children when clearing PopupMenu ([GH-79965](https://github.com/godotengine/godot/pull/79965)). -- Expose `Window`'s `_get_contents_minimum_size()` to scripting ([GH-80178](https://github.com/godotengine/godot/pull/80178)). -- Handle potential platform-specific `Window` mouse-enter/exit bugs gracefully ([GH-80187](https://github.com/godotengine/godot/pull/80187)). -- Add shortcut handling to `OptionButton` ([GH-80203](https://github.com/godotengine/godot/pull/80203)). -- Improve `Window._get_contents_minimum_size()`'s code ([GH-80219](https://github.com/godotengine/godot/pull/80219)). -- Expose the `TabBar` of a `TabContainer` ([GH-80227](https://github.com/godotengine/godot/pull/80227)). -- Fix scrolling `PopupMenu` on keyboard/controller input ([GH-80271](https://github.com/godotengine/godot/pull/80271)). -- Further separate icon from text of buttons in both editor and default themes ([GH-80285](https://github.com/godotengine/godot/pull/80285)). -- Dismiss currently visible or upcoming tooltips when pressing Escape ([GH-80364](https://github.com/godotengine/godot/pull/80364)). -- Fix `OptionButton` minimum size when "Fit Longest Item" is enabled ([GH-80366](https://github.com/godotengine/godot/pull/80366)). -- Fix `Button` text when the overrun behavior is other than "No Trimming" ([GH-80402](https://github.com/godotengine/godot/pull/80402)). -- RTL: Add support for image dynamic updating, padding, tooltips and size in percent ([GH-80410](https://github.com/godotengine/godot/pull/80410)). -- Fix CodeEdit completion being very slow in certain cases ([GH-80472](https://github.com/godotengine/godot/pull/80472)). -- Support other input methods on Popup/Dialogs' `_input_from_window` ([GH-80594](https://github.com/godotengine/godot/pull/80594)). -- [Bitmap fonts] Add support for scaling ([GH-80605](https://github.com/godotengine/godot/pull/80605)). -- RTL: Improve scroll bar responsiveness during updates ([GH-80606](https://github.com/godotengine/godot/pull/80606)). -- Add buttons to reorder inspector array items without dragging ([GH-80617](https://github.com/godotengine/godot/pull/80617)). -- Fix 2D/3D viewport context switching issues when script editor is floating ([GH-80647](https://github.com/godotengine/godot/pull/80647)). -- TextServer: Fix system font fallback and caret/selection behavior for composite characters ([GH-80650](https://github.com/godotengine/godot/pull/80650)). -- Allow comma as a decimal separator for SpinBox ([GH-80699](https://github.com/godotengine/godot/pull/80699)). -- TextServer: Fix issues with character breaks, add more tests ([GH-80777](https://github.com/godotengine/godot/pull/80777)). -- Fix crash when hiding subwindow during popup of new subwindow ([GH-80780](https://github.com/godotengine/godot/pull/80780)). -- Exit early in `TextEdit::_get_column_pos_of_word` to improve highlight performance ([GH-80809](https://github.com/godotengine/godot/pull/80809)). -- Fix "Go to parent folder" in `EditorFileDialog` ([GH-80821](https://github.com/godotengine/godot/pull/80821)). -- RTL: Fix `remove_paragraph` crashes ([GH-80847](https://github.com/godotengine/godot/pull/80847)). -- RTL: Adds "lang" tag to allow overriding language specific text rendering without starting a new paragraph ([GH-80848](https://github.com/godotengine/godot/pull/80848)). -- RTL: Improve performance by using list iterators for item/paragraph removal ([GH-80857](https://github.com/godotengine/godot/pull/80857)). -- Fix ColorPicker deferred mode not working for sliders ([GH-80916](https://github.com/godotengine/godot/pull/80916)). -- TextServer: Store extra spacing of individual font variations ([GH-80954](https://github.com/godotengine/godot/pull/80954)). -- Deselect multi caret when alt clicking on it ([GH-80956](https://github.com/godotengine/godot/pull/80956)). -- FileDialog: Avoid selecting the first item automatically in Open Folder Mode ([GH-81034](https://github.com/godotengine/godot/pull/81034)). -- Fix setting TabContainer's `font_hovered_color` theme property ([GH-81040](https://github.com/godotengine/godot/pull/81040)). -- RTL: Fix character line index for non-visual characters and characters on the line edge ([GH-81064](https://github.com/godotengine/godot/pull/81064)). -- Move default theme files to `scene/theme` ([GH-81065](https://github.com/godotengine/godot/pull/81065)). -- Only allow finite numbers in `Range.value` ([GH-81076](https://github.com/godotengine/godot/pull/81076)). -- Fix SpinBox not clearing text on improper input ([GH-81094](https://github.com/godotengine/godot/pull/81094)). -- TextServer: Fix SVG emoji placement ([GH-81103](https://github.com/godotengine/godot/pull/81103)). -- Fix a crash when plugin tries to call `make_mesh_previews` on enable ([GH-81121](https://github.com/godotengine/godot/pull/81121)). -- Unfocus LineEdit when pressing Escape ([GH-81128](https://github.com/godotengine/godot/pull/81128)). -- Implement a system to contextualize global themes ([GH-81130](https://github.com/godotengine/godot/pull/81130)). -- ItemList: Draw separators before selected style boxes ([GH-81155](https://github.com/godotengine/godot/pull/81155)). -- Fix TreeItem range slider not working properly ([GH-81174](https://github.com/godotengine/godot/pull/81174)). -- Fix ItemList not updating when icon scale changes ([GH-81268](https://github.com/godotengine/godot/pull/81268)). -- Fix ThemeDB initialization in tests ([GH-81305](https://github.com/godotengine/godot/pull/81305)). -- Register theme properties with ThemeDB ([GH-81312](https://github.com/godotengine/godot/pull/81312)). -- Update and properly list versions of the built-in fonts ([GH-81326](https://github.com/godotengine/godot/pull/81326)). -- Fix `TextEdit.get_rect_at_line_column returning` negative pos even though cursor is in viewable area of the control ([GH-81354](https://github.com/godotengine/godot/pull/81354)). -- TextServer: Use locale or first span language to select preferred direction for neutral text ([GH-81361](https://github.com/godotengine/godot/pull/81361)). -- Remove unnecessary validity checks from `Button` and `TextureRect` ([GH-81383](https://github.com/godotengine/godot/pull/81383)). -- Fix TextEdit placeholder with Inherited text direction ([GH-81396](https://github.com/godotengine/godot/pull/81396)). -- TextServer: Pass Dictionary properties by value and check property values instead of references ([GH-81406](https://github.com/godotengine/godot/pull/81406)). -- Fix subpixel layouts in text rendering ([GH-81438](https://github.com/godotengine/godot/pull/81438)). -- LineEdit: Update line edit offset on text delete ([GH-81443](https://github.com/godotengine/godot/pull/81443)). -- Correctly setup tooltip's style as theme variation ([GH-81463](https://github.com/godotengine/godot/pull/81463)). -- Fix submenu alignment with parent menu item ([GH-81477](https://github.com/godotengine/godot/pull/81477)). -- Fix accessing editor theme items throughout the UI ([GH-81516](https://github.com/godotengine/godot/pull/81516)). -- Hide the `dialog_text` property from `FileDialog` ([GH-81546](https://github.com/godotengine/godot/pull/81546)). -- Bind remaining theme properties to their respective classes ([GH-81551](https://github.com/godotengine/godot/pull/81551)). -- Improve the looks of 2D/3D viewport contextual toolbars ([GH-81557](https://github.com/godotengine/godot/pull/81557)). -- Use bound theme properties for documentation ([GH-81573](https://github.com/godotengine/godot/pull/81573)). -- Make `GraphEdit` toolbar more customizable ([GH-81582](https://github.com/godotengine/godot/pull/81582)). -- Fix GraphEdit port valid connections incorrectly checking sides ([GH-81600](https://github.com/godotengine/godot/pull/81600)). -- Expose `PopupMenu` `activate_item_by_event` method ([GH-81621](https://github.com/godotengine/godot/pull/81621)). -- Fix SpinBox will reset unsubmitted text when redrawing ([GH-81638](https://github.com/godotengine/godot/pull/81638)). -- Remove the equality check for `TabBar.set_tab_metadata` ([GH-81648](https://github.com/godotengine/godot/pull/81648)). -- Enable transparent background for GUI tooltips ([GH-81669](https://github.com/godotengine/godot/pull/81669)). -- Connect `CodeHighlighter` with `TextEdit` without friend-access ([GH-81921](https://github.com/godotengine/godot/pull/81921)). -- Replace flat buttons with flat-styled buttons with a visible pressed state ([GH-81939](https://github.com/godotengine/godot/pull/81939)). -- Check for type variations in inherited themes ([GH-82218](https://github.com/godotengine/godot/pull/82218)). -- Fix tooltips behaving incorrectly on `Tree` nodes ([GH-82226](https://github.com/godotengine/godot/pull/82226)). -- Add Font and Mesh icons that aren't grayed out ([GH-82302](https://github.com/godotengine/godot/pull/82302)). -- Rename close requests to delete requests in `GraphEdit` ([GH-82370](https://github.com/godotengine/godot/pull/82370)). -- Make hovered tabs be drawn with the unselected's width at minimum ([GH-82384](https://github.com/godotengine/godot/pull/82384)). -- Document, cleanup and fix some theme properties ([GH-82409](https://github.com/godotengine/godot/pull/82409)). -- TextServer: Store font extra spacing variations without making a full copy of font ([GH-82475](https://github.com/godotengine/godot/pull/82475)). -- FileDialog: Make `set_visible` compatible with native dialogs ([GH-82552](https://github.com/godotengine/godot/pull/82552)). -- Tweak the region folding icons ([GH-82653](https://github.com/godotengine/godot/pull/82653)). -- Fix storing invalid item height values in `ItemList` ([GH-82660](https://github.com/godotengine/godot/pull/82660)). -- SystemFont: Check name when selecting the best matching face from a collection ([GH-82712](https://github.com/godotengine/godot/pull/82712)). -- [File Dialog] Do not open native file dialogs in the edited scene ([GH-82743](https://github.com/godotengine/godot/pull/82743)). -- Organize TextEdit's inspector ([GH-82776](https://github.com/godotengine/godot/pull/82776)). -- Place LineEdit secret in its own section ([GH-82811](https://github.com/godotengine/godot/pull/82811)). -- Accept cancel event when unfocusing LineEdit ([GH-82914](https://github.com/godotengine/godot/pull/82914)). -- Fix right-click menu position for the debugger breakpoint tree ([GH-82924](https://github.com/godotengine/godot/pull/82924)). -- RTL: Remove unnecessary glyph position rounding ([GH-82970](https://github.com/godotengine/godot/pull/82970)). -- Do not apply extra spacing twice ([GH-83062](https://github.com/godotengine/godot/pull/83062)). -- Allow clicking buttons of non-selectable TreeItems ([GH-83065](https://github.com/godotengine/godot/pull/83065)). -- Remove vertical scrollbar padding from line width calc ([GH-83286](https://github.com/godotengine/godot/pull/83286)). -- Fix phantom tab right button ([GH-83296](https://github.com/godotengine/godot/pull/83296)). -- Fix incorrect offset of `PopupMenu` separator icons ([GH-83517](https://github.com/godotengine/godot/pull/83517)). -- Add bulk change guards to successive theme overrides in Editor and GUI ([GH-83626](https://github.com/godotengine/godot/pull/83626)). -- Fix `TabBar` and `TabContainer` dragging issues ([GH-83637](https://github.com/godotengine/godot/pull/83637)). -- Fix missing initial position modes for the main window ([GH-83824](https://github.com/godotengine/godot/pull/83824)). -- TextServerAdvanced: Keep dynamically loaded ICU data in memory ([GH-83827](https://github.com/godotengine/godot/pull/83827)). -- Increase precision of RAW mode in ColorPicker ([GH-83851](https://github.com/godotengine/godot/pull/83851)). -- Fix GraphNode slot index inconsistency ([GH-83892](https://github.com/godotengine/godot/pull/83892)). -- Save current tab in `TabBar` and `TabContainer` ([GH-83893](https://github.com/godotengine/godot/pull/83893)). -- Fix BaseButton `shortcut_feedback`'s timer will raise error when the button is removed from the scene tree ([GH-83925](https://github.com/godotengine/godot/pull/83925)). -- Translate TextEdit placeholder ([GH-83946](https://github.com/godotengine/godot/pull/83946)). -- Ensure input event is valid in `PopupMenu::activate_item_by_event` ([GH-83952](https://github.com/godotengine/godot/pull/83952)). -- [Menu Bar] Update min. size when items are added/removed/changed ([GH-83961](https://github.com/godotengine/godot/pull/83961)). -- Fix disabled tabs being selected when removing the current one ([GH-83963](https://github.com/godotengine/godot/pull/83963)). -- Fix `TabContainer` drag to rearrange issue ([GH-83966](https://github.com/godotengine/godot/pull/83966)). -- Fix TreeItem truncating node names too much when using a custom icon ([GH-84001](https://github.com/godotengine/godot/pull/84001)). -- Add foreign validation warning for rename actions ([GH-84022](https://github.com/godotengine/godot/pull/84022)). -- Include empty type variations in `Theme::get_type_list` ([GH-84127](https://github.com/godotengine/godot/pull/84127)). -- [Text Mesh] Fix incorrectly cached glyph offsets ([GH-84180](https://github.com/godotengine/godot/pull/84180)). -- Fix `activate_item_by_event` infinite recursion crash ([GH-84183](https://github.com/godotengine/godot/pull/84183)). -- TextServer: Fix glyph comparator ambiguous output ([GH-84232](https://github.com/godotengine/godot/pull/84232)). -- RTL: Fix underline/strikethrough line color changes ([GH-84233](https://github.com/godotengine/godot/pull/84233)). -- TextServer: Fix line breaks for dropcap and resizing embedded objects ([GH-84287](https://github.com/godotengine/godot/pull/84287)). -- Fix `ColorPicker` shape icon is invisible until shape is changed ([GH-84535](https://github.com/godotengine/godot/pull/84535)). -- Make mouse enter/exit notifications match mouse events ([GH-84547](https://github.com/godotengine/godot/pull/84547)). -- RTL: Fix list bullet alignment ([GH-84605](https://github.com/godotengine/godot/pull/84605)). -- Warn about autowrapped labels in containers ([GH-84662](https://github.com/godotengine/godot/pull/84662)). -- Allow auto-generated node names in `PopupMenu::add_submenu_item` ([GH-84668](https://github.com/godotengine/godot/pull/84668)). -- Add protection in `RichTextLabel.update_image` to prevent crash ([GH-84833](https://github.com/godotengine/godot/pull/84833)). -- Make Tree's `set_selected` check if the TreeItem belongs to the tree ([GH-84870](https://github.com/godotengine/godot/pull/84870)). -- Fix remapped font reloading on locale change ([GH-84873](https://github.com/godotengine/godot/pull/84873)). -- RTL: Fix excessive underline and table border draw calls ([GH-84874](https://github.com/godotengine/godot/pull/84874)). -- Add GraphEdit connection layer child as internal ([GH-85009](https://github.com/godotengine/godot/pull/85009)). -- Fix crash when hiding a Control during mouse-entering ([GH-85284](https://github.com/godotengine/godot/pull/85284)). -- Fix crash on late mouse enter/exit event arrival ([GH-85418](https://github.com/godotengine/godot/pull/85418)). +- Use black for font outlines by default instead of white ([GH-54641](https://github.com/godotengine/godot/pull/54641)). +- Make the drawing logic clearer in `Button` ([GH-64351](https://github.com/godotengine/godot/pull/64351)). +- Toggle control expand flag directly via top bar ([GH-65258](https://github.com/godotengine/godot/pull/65258)). +- Add FlowContainer wrap options for center alignment ([GH-72323](https://github.com/godotengine/godot/pull/72323)). +- Show selected end of line in TextEdit ([GH-72341](https://github.com/godotengine/godot/pull/72341)). +- Add option to reverse FlowContainer fill direction (HFlow bottom-to-top, VFlow right-to-left) ([GH-74195](https://github.com/godotengine/godot/pull/74195)). +- DisplayServer: Use screen "usable rect" instead of full rect to calculate initial window rect ([GH-75489](https://github.com/godotengine/godot/pull/75489)). +- Make editor inspector follow focus ([GH-78960](https://github.com/godotengine/godot/pull/78960)). +- Fix read-only EditorSpinSlider display ([GH-80544](https://github.com/godotengine/godot/pull/80544)). +- Trigger zoom from pan gestures when pressing ctrl ([GH-80994](https://github.com/godotengine/godot/pull/80994)). +- Add Ctrl + L / Cmd + Shift + G shortcut to focus path bar in FileDialog ([GH-81177](https://github.com/godotengine/godot/pull/81177)). +- Enable scrolling of output with UI scale changes ([GH-82079](https://github.com/godotengine/godot/pull/82079)). +- Option to put TabContainer tabs at bottom ([GH-82468](https://github.com/godotengine/godot/pull/82468)). +- Fix opening docs writing extra navigation history ([GH-82498](https://github.com/godotengine/godot/pull/82498)). +- [Text Overrun] Add option to set custom ellipsis character, add support for system font fallback ([GH-82661](https://github.com/godotengine/godot/pull/82661)). +- Add `set_slot_custom_icon` and `get_slot_custom_icon` to GraphNode ([GH-82669](https://github.com/godotengine/godot/pull/82669)). +- PopupMenu: Handle `physical_keycode` and `key_label` of shortcuts ([GH-82897](https://github.com/godotengine/godot/pull/82897)). +- PopupMenu: Handle shortcuts with "global" flag directly ([GH-82900](https://github.com/godotengine/godot/pull/82900)). +- Support updating tooltip immediately after editor description change ([GH-82916](https://github.com/godotengine/godot/pull/82916)). +- Show revert button for MeshInstance3D blendshape values ([GH-82984](https://github.com/godotengine/godot/pull/82984)). +- Add automatic translation of items to ItemList ([GH-83577](https://github.com/godotengine/godot/pull/83577)). +- Make ProgressBar reflect the real value in the percent label when "allow greater" is checked ([GH-83623](https://github.com/godotengine/godot/pull/83623)). +- Add dotted grid to GraphEdit ([GH-83785](https://github.com/godotengine/godot/pull/83785)). +- Fix dock visibility issues ([GH-84122](https://github.com/godotengine/godot/pull/84122)). +- Label: Add get_character_bounds method to get bounding rectangles of the characters ([GH-84185](https://github.com/godotengine/godot/pull/84185)). +- RichTextLabel: Fix `remove_paragraph` crash by popping current ([GH-84312](https://github.com/godotengine/godot/pull/84312)). +- Allow additional hexadecimal color codes in ColorPicker ([GH-84442](https://github.com/godotengine/godot/pull/84442)). +- Cache allowed types in EditorResourcePicker ([GH-84443](https://github.com/godotengine/godot/pull/84443)). +- Don't check resource type assigned in property ([GH-84446](https://github.com/godotengine/godot/pull/84446)). +- Display a revert icon on ColorPicker's old sample ([GH-84527](https://github.com/godotengine/godot/pull/84527)). +- Fetch override list from ThemeDB ([GH-84760](https://github.com/godotengine/godot/pull/84760)). +- Fetch theme editor items from ThemeDB ([GH-84763](https://github.com/godotengine/godot/pull/84763)). +- VideoPlayer: Fix reloading translation remapped stream ([GH-84794](https://github.com/godotengine/godot/pull/84794)). +- Implement disabled state for Checkbox in Tree ([GH-84845](https://github.com/godotengine/godot/pull/84845)). +- Hide ineffective TextureProgressBar properties in the editor ([GH-84940](https://github.com/godotengine/godot/pull/84940)). +- Use disabled icons for CheckBox in DefaultTheme ([GH-84946](https://github.com/godotengine/godot/pull/84946)). +- Fix conflicted indeterminate state in asset importer ([GH-84953](https://github.com/godotengine/godot/pull/84953)). +- Editor: Add option to override editor UI layout direction ([GH-85000](https://github.com/godotengine/godot/pull/85000)). +- Fetch argument options from ThemeDB ([GH-85015](https://github.com/godotengine/godot/pull/85015)). +- Highlight error lines in minimap ([GH-85054](https://github.com/godotengine/godot/pull/85054)). +- Restored Control properties when you undo a parenting of a Control to a Container ([GH-85181](https://github.com/godotengine/godot/pull/85181)). +- Fix updating delimiter cache of `CodeEdit` when typing on the first line ([GH-85191](https://github.com/godotengine/godot/pull/85191)). +- Make sure `Window`'s title is respected before we compute the size ([GH-85312](https://github.com/godotengine/godot/pull/85312)). +- Fix crash on hiding grandparent Control on mouse exit ([GH-85313](https://github.com/godotengine/godot/pull/85313)). +- Fixes for undo in text editor grouping unrelated actions ([GH-85325](https://github.com/godotengine/godot/pull/85325)). +- RTL: Fix CharFX character offset calculation ([GH-85363](https://github.com/godotengine/godot/pull/85363)). +- Add methods to add submenus without using names ([GH-85477](https://github.com/godotengine/godot/pull/85477)). +- Limit window size updates on title change ([GH-85542](https://github.com/godotengine/godot/pull/85542)). +- Ensure slider grabs focus only when it can ([GH-85652](https://github.com/godotengine/godot/pull/85652)). +- Fix unnecessarily quantizing current color in color picker ([GH-85749](https://github.com/godotengine/godot/pull/85749)). +- Fix size and visuals of the `InputEventConfigurationDialog` ([GH-85790](https://github.com/godotengine/godot/pull/85790)). +- Allow dragging selection when selecting whole words in `LineEdit` ([GH-85801](https://github.com/godotengine/godot/pull/85801)). +- Limit window size updates on title translation change ([GH-85828](https://github.com/godotengine/godot/pull/85828)). +- Correctly enforce minimum window size in editor ([GH-85887](https://github.com/godotengine/godot/pull/85887)). +- Windows: Set application user model ID to prevent editor / running project and different versions of editor taskbar icon stacking ([GH-85905](https://github.com/godotengine/godot/pull/85905)). +- TextServer: Implement soft hyphen handling ([GH-85940](https://github.com/godotengine/godot/pull/85940)). +- Expose a method to get hovered Control in Viewport ([GH-85966](https://github.com/godotengine/godot/pull/85966)). +- Prevent crash when calling `set_text()` on a removed TreeItem ([GH-86028](https://github.com/godotengine/godot/pull/86028)). +- Fix theme access in the Groups editor ([GH-86031](https://github.com/godotengine/godot/pull/86031)). +- Fix `ColorPicker`'s alpha slider arrow offset ([GH-86034](https://github.com/godotengine/godot/pull/86034)). +- TextServer: Do not draw non-visual characters ([GH-86065](https://github.com/godotengine/godot/pull/86065)). +- Fix so undoing complex operations in `TextEdit` will restore selections ([GH-86118](https://github.com/godotengine/godot/pull/86118)). +- Remember last `color_mode` and `picker_shape` in `ColorPicker`s in the editor ([GH-86129](https://github.com/godotengine/godot/pull/86129)). +- Fix Popup hover and height calculation are off by some pixels ([GH-86141](https://github.com/godotengine/godot/pull/86141)). +- Rework `GraphEdit` connections (drawing, API, optimizations) ([GH-86158](https://github.com/godotengine/godot/pull/86158)). +- Fix various issues with the folder color lookup ([GH-86171](https://github.com/godotengine/godot/pull/86171)). +- Fix `Node` selection when navigating `Tree` with Arrow keys ([GH-86218](https://github.com/godotengine/godot/pull/86218)). +- Fix changing `gui_embed_subwindows` while a child window is displayed ([GH-86220](https://github.com/godotengine/godot/pull/86220)). +- macOS: Fix updating editor tab titles in the dock menu ([GH-86290](https://github.com/godotengine/godot/pull/86290)). +- Fix `MenuBar` and `MenuButton` hover position scaling properly with the scale factor multiplier ([GH-86304](https://github.com/godotengine/godot/pull/86304)). +- MenuBar: Store and use global menu item indices ([GH-86322](https://github.com/godotengine/godot/pull/86322)). +- Emit slider's `drag_started` signal before the first value change ([GH-86377](https://github.com/godotengine/godot/pull/86377)). +- Implement a `transient_to_focused` Window mode ([GH-86446](https://github.com/godotengine/godot/pull/86446)). +- Fix double `text_changed` signal when overwriting selection in LineEdit ([GH-86460](https://github.com/godotengine/godot/pull/86460)). +- Fix D&D viewport position calculation ([GH-86511](https://github.com/godotengine/godot/pull/86511)). +- Fix non-embedded tooltips, popups and dialogs resizing to match Viewport content scale factors != 1.0 ([GH-86553](https://github.com/godotengine/godot/pull/86553)). +- Make `LineEdit` scrolling show as much text as possible ([GH-86732](https://github.com/godotengine/godot/pull/86732)). +- In `merge_with` also merge some default fields of theme ([GH-86894](https://github.com/godotengine/godot/pull/86894)). +- Overhaul multicaret editing and selection in TextEdit ([GH-86978](https://github.com/godotengine/godot/pull/86978)). +- Fix `LineEdit` caret rendering/positioning on Undo ([GH-87012](https://github.com/godotengine/godot/pull/87012)). +- Button: Add autowrap feature ([GH-87025](https://github.com/godotengine/godot/pull/87025)). +- Refactor editor theme generation and add spacing presets ([GH-87085](https://github.com/godotengine/godot/pull/87085)). +- Allow no tabs to be selected in TabBar and TabContainer ([GH-87194](https://github.com/godotengine/godot/pull/87194)). +- macOS: Do not unbind PopupMenu from global menu on `clear` call ([GH-87249](https://github.com/godotengine/godot/pull/87249)). +- [Native File Dialog] Add support for adding custom options to the dialogs (w/o editor changes) ([GH-87303](https://github.com/godotengine/godot/pull/87303)). +- Add indeterminate mode to ProgressBar ([GH-87318](https://github.com/godotengine/godot/pull/87318)). +- TextServer: Fix precision loss in the string drawing methods ([GH-87335](https://github.com/godotengine/godot/pull/87335)). +- Add method to get "base" system UI color and system theme change callback ([GH-87384](https://github.com/godotengine/godot/pull/87384)). +- Expose `PopupMenu` `get_item_multistate()` and `set/get_item_multistate_max()` ([GH-87395](https://github.com/godotengine/godot/pull/87395)). +- Redraw `TreeItem` on more changes ([GH-87415](https://github.com/godotengine/godot/pull/87415)). +- Use callable for `TreeItem` custom draw ([GH-87417](https://github.com/godotengine/godot/pull/87417)). +- Fix issue where `set_global_position(global_position)` in `Control` resulted in a different result than `global_position` ([GH-87432](https://github.com/godotengine/godot/pull/87432)). +- Move `global_menu_*` methods to a separate `NativeMenu` class ([GH-87452](https://github.com/godotengine/godot/pull/87452)). +- Fix PopupMenu doesn't respect its ScrollContainer's margins ([GH-87462](https://github.com/godotengine/godot/pull/87462)). +- Fix forgetting `h_separation` when internal elements exist ([GH-87474](https://github.com/godotengine/godot/pull/87474)). +- Fix TextEdit IME issues ([GH-87479](https://github.com/godotengine/godot/pull/87479)). +- Rework the auto translation system ([GH-87530](https://github.com/godotengine/godot/pull/87530)). +- Replace internal usage of ImageTexture in VideoStreamPlayer for Texture2D ([GH-87555](https://github.com/godotengine/godot/pull/87555)). +- RTL: Connect image update signals ([GH-87587](https://github.com/godotengine/godot/pull/87587)). +- [TextServer / Font] Add support for customizable baseline offset ([GH-87668](https://github.com/godotengine/godot/pull/87668)). +- TreeItem: Add `get_button_color()` ([GH-87686](https://github.com/godotengine/godot/pull/87686)). +- Fix script editor `undo` shortcut with global menu enabled ([GH-87773](https://github.com/godotengine/godot/pull/87773)). +- Automatically set viewport background to transparent when window flag is set ([GH-87856](https://github.com/godotengine/godot/pull/87856)). +- Fix freeze in TextEdit with `scroll_past_end_of_file` and `fit_content_height` ([GH-87880](https://github.com/godotengine/godot/pull/87880)). +- Add 'Skip to next (text) occurrence' feature to text editor ([GH-87883](https://github.com/godotengine/godot/pull/87883)). +- macOS: Fix changing main menu item names ([GH-87912](https://github.com/godotengine/godot/pull/87912)). +- Only recurse depth wise in `Tree::_count_selected_items` ([GH-87943](https://github.com/godotengine/godot/pull/87943)). +- macOS: Do not show file type popup in the native file dialog if there's only one option, improve `*.*` filter handling ([GH-87954](https://github.com/godotengine/godot/pull/87954)). +- Fix `set_item_submenu` infinite recursion crash ([GH-87967](https://github.com/godotengine/godot/pull/87967)). +- Implement GraphFrame and integrate it in VisualShader ([GH-88014](https://github.com/godotengine/godot/pull/88014)). +- Fix `Slider`'s mouse drag position when grabber is centered ([GH-88068](https://github.com/godotengine/godot/pull/88068)). +- TextServer: Fix bitmap font kerning override ([GH-88089](https://github.com/godotengine/godot/pull/88089)). +- TextServer: Add extra fallback step, to lookup for individual characters ([GH-88091](https://github.com/godotengine/godot/pull/88091)). +- Tweak property order in the inspector for OptionButton ([GH-88145](https://github.com/godotengine/godot/pull/88145)). +- Add PropertyListHelper to PopupMenu ([GH-88162](https://github.com/godotengine/godot/pull/88162)). +- Font: Do not use trim with ellipsis in the basic Font string drawing functions ([GH-88185](https://github.com/godotengine/godot/pull/88185)). +- Fix vertical alignment of editor version `LinkButton` in the bottom panel ([GH-88197](https://github.com/godotengine/godot/pull/88197)). +- Fix recursive Tree expand/collapse shortcuts not working ([GH-88265](https://github.com/godotengine/godot/pull/88265)). +- Fix `TabBar` size when theme changes ([GH-88293](https://github.com/godotengine/godot/pull/88293)). +- Add `is_visible_in_tree` in `TreeItem` ([GH-88300](https://github.com/godotengine/godot/pull/88300)). +- [Fallback TextServer] Add support for non breaking spaces ([GH-88344](https://github.com/godotengine/godot/pull/88344)). +- Fix ItemList click detection gaps ([GH-88347](https://github.com/godotengine/godot/pull/88347)). +- Editor: Improve clarity and style of `ResourcePicker` menu ([GH-88435](https://github.com/godotengine/godot/pull/88435)). +- Editor: Add missing ellipses to menu options that open dialogs ([GH-88436](https://github.com/godotengine/godot/pull/88436)). +- Improve text editor status bar and zooming UX ([GH-88474](https://github.com/godotengine/godot/pull/88474)). +- Tweak property order in the inspector for TabBar ([GH-88477](https://github.com/godotengine/godot/pull/88477)). +- Fix `LineEdit` delete all the way to the left/right when something is selected ([GH-88479](https://github.com/godotengine/godot/pull/88479)). +- Fix error spam when adding tabs to `TabBar` without deselect ([GH-88494](https://github.com/godotengine/godot/pull/88494)). +- Fix regression in auto translation overhaul ([GH-88521](https://github.com/godotengine/godot/pull/88521)). +- TextEdit: Add support for optional wrapped line indentation ([GH-88546](https://github.com/godotengine/godot/pull/88546)). +- Hide separators in ItemList in editor theme ([GH-88575](https://github.com/godotengine/godot/pull/88575)). +- Fix item positioning, text alignment & unwanted clipping of ItemList items ([GH-88577](https://github.com/godotengine/godot/pull/88577)). +- Fix `RichTextLabel`'s tag stack being overridden on translation change ([GH-88598](https://github.com/godotengine/godot/pull/88598)). +- Fix implementation of `property_can_revert()` in PropertyListHelper ([GH-88665](https://github.com/godotengine/godot/pull/88665)). +- Don't translate filenames in FileSystem dock ([GH-88716](https://github.com/godotengine/godot/pull/88716)). +- If SpinBox text can't be parsed use last updated text ([GH-88794](https://github.com/godotengine/godot/pull/88794)). +- Mention how Control focus loss affects `Viewport.gui_focus_change` ([GH-88811](https://github.com/godotengine/godot/pull/88811)). +- Fix crash when selecting re-added `TreeItem::Cell` ([GH-88917](https://github.com/godotengine/godot/pull/88917)). +- Fix mouse entered notifications ([GH-88992](https://github.com/godotengine/godot/pull/88992)). +- RTL: Add optional `push_meta` argument to control how meta underline is drawn ([GH-89024](https://github.com/godotengine/godot/pull/89024)). +- Add auto translation to `Tree` ([GH-89032](https://github.com/godotengine/godot/pull/89032)). +- Fix issues with text clearing in `RichTextLabel` ([GH-89100](https://github.com/godotengine/godot/pull/89100)). +- Label3D: Calculate AABB from the full text rect instead of individual glyphs ([GH-89145](https://github.com/godotengine/godot/pull/89145)). +- RTL: Fix meta hover area detection ([GH-89158](https://github.com/godotengine/godot/pull/89158)). +- TextServer: Fix fallback line breaking code adding two breaks for CR-LF ([GH-89171](https://github.com/godotengine/godot/pull/89171)). +- Window: Allow to override viewport and project settings and force use of native window ([GH-89172](https://github.com/godotengine/godot/pull/89172)). +- NativeMenu: Add checks to avoid unnecessary warnings ([GH-89224](https://github.com/godotengine/godot/pull/89224)). +- Add text tooltip for TabBar & TabContainer ([GH-89247](https://github.com/godotengine/godot/pull/89247)). +- NativeMenu: Implement native popup menu support on Windows ([GH-89273](https://github.com/godotengine/godot/pull/89273)). +- StatusIndicator: Add method to get indicator icon screen rect ([GH-89275](https://github.com/godotengine/godot/pull/89275)). +- Fix packed scene translation parser missing strings ([GH-89286](https://github.com/godotengine/godot/pull/89286)). +- Add pre-4.3 Editor theme color names for compatibility ([GH-89302](https://github.com/godotengine/godot/pull/89302)). +- Fix Label3D, TextMesh & Font not following project default theme in editor ([GH-89311](https://github.com/godotengine/godot/pull/89311)). +- Font: Add option to disable embedded bitmaps loading ([GH-89383](https://github.com/godotengine/godot/pull/89383)). +- RTL: Use "visible characters" property for inline object visibility ([GH-89395](https://github.com/godotengine/godot/pull/89395)). +- Fix some AcceptDialog argument types ([GH-89419](https://github.com/godotengine/godot/pull/89419)). +- Fix help label will be partly outside the view area at 150% editor scale ([GH-89437](https://github.com/godotengine/godot/pull/89437)). +- Fix bug related to multicursor and backspacing with brackets ([GH-89469](https://github.com/godotengine/godot/pull/89469)). +- Fix `Control::set_global_position` for rotated/scaled transforms ([GH-89502](https://github.com/godotengine/godot/pull/89502)). +- Fix NativeMenu layout direction on macOS, add extra check for Windows menu ([GH-89506](https://github.com/godotengine/godot/pull/89506)). +- Label: Move shadow drawing into a separate draw step ([GH-89510](https://github.com/godotengine/godot/pull/89510)). +- NativeMenu: Fix MinGW build ([GH-89513](https://github.com/godotengine/godot/pull/89513)). +- NativeMenu: Fix changes lost due to incorrect rebase (menu goes under task bar, dark mode, item text get, docs) and check to ensure help menu is not using native menu on Windows ([GH-89540](https://github.com/godotengine/godot/pull/89540)). +- StatusIndicator: Switch API to use Texture2D instead of Image, improve handling on macOS, add method to set native popup menu directly ([GH-89588](https://github.com/godotengine/godot/pull/89588)). +- Fix TextEdit selection end of line drawing for wrapped lines and gaps ([GH-89625](https://github.com/godotengine/godot/pull/89625)). +- Fix `empty_clicked` signal in Tree when using `hide_root` ([GH-89664](https://github.com/godotengine/godot/pull/89664)). +- Font: Apply oversampling to the "embolden" strength ([GH-89666](https://github.com/godotengine/godot/pull/89666)). +- Do not apply `force_native` to the edited scene windows ([GH-89673](https://github.com/godotengine/godot/pull/89673)). +- Add minimum width/height to dialog buttons ([GH-89693](https://github.com/godotengine/godot/pull/89693)). +- RTL: Move shadow and foreground/background boxes drawing into a separate draw steps ([GH-89705](https://github.com/godotengine/godot/pull/89705)). +- Fix a pixel misalignment in the blue robot logo ([GH-89711](https://github.com/godotengine/godot/pull/89711)). +- [Native File Dialog] Add support for using native dialogs in the editor ([GH-89735](https://github.com/godotengine/godot/pull/89735)). +- Prefer family name in fonts' names table ([GH-89817](https://github.com/godotengine/godot/pull/89817)). +- Correct FileDialog Theme overrides ([GH-89845](https://github.com/godotengine/godot/pull/89845)). +- MenuBar: Use NativeMenu RIDs instead of indices to track items ([GH-89875](https://github.com/godotengine/godot/pull/89875)). +- NativeMenu: Move files to the `display` subfolder ([GH-89900](https://github.com/godotengine/godot/pull/89900)). +- Remove Control z-index warning ([GH-89956](https://github.com/godotengine/godot/pull/89956)). +- Fix TreeItem shows cell edit in the wrong column when `select_mode=Row` and TreeItem has multiple columns ([GH-89977](https://github.com/godotengine/godot/pull/89977)). +- Make `TextEdit.clip_contents` more transparent to users ([GH-89993](https://github.com/godotengine/godot/pull/89993)). +- TextServer: Expose ICU title case string conversion to scripting ([GH-90196](https://github.com/godotengine/godot/pull/90196)). +- Fix error message when removing only child from GraphNode ([GH-90229](https://github.com/godotengine/godot/pull/90229)). +- Fix potential null access in `TextEdit` ([GH-90274](https://github.com/godotengine/godot/pull/90274)). +- Remove border roundness inside panels of `AcceptDialog` windows ([GH-90283](https://github.com/godotengine/godot/pull/90283)). +- Fix built-in `FileDialog` appearing instead of the native one on some cases ([GH-90318](https://github.com/godotengine/godot/pull/90318)). +- TextServer: Improve empty glyph handling to allow glyphs smaller than 2px and avoid unnecessary texture updates ([GH-90349](https://github.com/godotengine/godot/pull/90349)). +- RTL: Add support for character code BBCode tag `[char=...]` ([GH-90405](https://github.com/godotengine/godot/pull/90405)). +- Fix `TabContainer` desync when tabs share names ([GH-90415](https://github.com/godotengine/godot/pull/90415)). +- RTL: Fix dropcaps and list prefixes not taking visible characters into account ([GH-90472](https://github.com/godotengine/godot/pull/90472)). +- RTL: Rewrite `remove_paragraph` code ([GH-90518](https://github.com/godotengine/godot/pull/90518)). +- Remove `Popup`'s unused "panel" style ([GH-90633](https://github.com/godotengine/godot/pull/90633)). +- Fix submenus erroneously closing on some occasions ([GH-90639](https://github.com/godotengine/godot/pull/90639)). +- Fix decimal and hex ranges not working with image fonts ([GH-90647](https://github.com/godotengine/godot/pull/90647)). +- Don't store deprecated `auto_translate` property ([GH-90685](https://github.com/godotengine/godot/pull/90685)). +- Add project setting for root node auto translate mode ([GH-90730](https://github.com/godotengine/godot/pull/90730)). +- Improve TextEdit/LineEdit word selection ([GH-90732](https://github.com/godotengine/godot/pull/90732)). +- Fix potential infinite loop when using global menu ([GH-90791](https://github.com/godotengine/godot/pull/90791)). +- Button: Fix theme elements size rounding errors not keeping sufficient space for the text ([GH-90838](https://github.com/godotengine/godot/pull/90838)). +- Fix TreeItem button handling ([GH-90839](https://github.com/godotengine/godot/pull/90839)). +- Revert "Correctly display tooltips for buttons in Tree when they overlap cell content ([GH-90842](https://github.com/godotengine/godot/pull/90842)). +- Fix buttons offset to the right when dialog is at minsize ([GH-90852](https://github.com/godotengine/godot/pull/90852)). +- Don't translate ColorPicker color labels ([GH-90869](https://github.com/godotengine/godot/pull/90869)). +- Fix crash when GraphFrame `sb_to_draw_panel` is not a StyleBoxFlat ([GH-90874](https://github.com/godotengine/godot/pull/90874)). +- Fix offset of node filter menu separator icon ([GH-90886](https://github.com/godotengine/godot/pull/90886)). +- Fix TabContainer not redrawing after toggling tab icon ([GH-90942](https://github.com/godotengine/godot/pull/90942)). +- Enable `Scrolling` signal when scrolling with middle mouse on `RichTextLabel` or `ScrollContainer` ([GH-90988](https://github.com/godotengine/godot/pull/90988)). +- Add line limit to Output Log in Editor ([GH-91012](https://github.com/godotengine/godot/pull/91012)). +- Fix TabContainer using wrong content rect after tab title update ([GH-91038](https://github.com/godotengine/godot/pull/91038)). +- Fix wrong Tree column title position ([GH-91044](https://github.com/godotengine/godot/pull/91044)). +- Fix port cache calculation in GraphNode ([GH-91083](https://github.com/godotengine/godot/pull/91083)). +- Fix Tree minimum size calculation ([GH-91095](https://github.com/godotengine/godot/pull/91095)). +- RTL: Add extra argument to `remove_paragraph` to skip cache invalidation and a method for manual cache invalidation ([GH-91098](https://github.com/godotengine/godot/pull/91098)). +- PopupMenu: Fix incorrect vertical scroll bar visible at fractional content scale ([GH-91114](https://github.com/godotengine/godot/pull/91114)). +- Use TextEdit caret color for minimap highlight (fix minimap regression) ([GH-91137](https://github.com/godotengine/godot/pull/91137)). +- Add no-change check to `Label3D::set_text` ([GH-91177](https://github.com/godotengine/godot/pull/91177)). +- Fix `TabContainer` regressions related to switching tabs in certain cases ([GH-91188](https://github.com/godotengine/godot/pull/91188)). +- Don't use vscroll when fit to content height in TextEdit ([GH-91190](https://github.com/godotengine/godot/pull/91190)). +- Allow setting max icon width per tab for TabContainer ([GH-91193](https://github.com/godotengine/godot/pull/91193)). +- Fix RichTextLabel "Scroll Following" randomly stops working ([GH-91275](https://github.com/godotengine/godot/pull/91275)). +- Fix disabled files in FileDialog using the wrong color ([GH-91281](https://github.com/godotengine/godot/pull/91281)). +- Update `LineEdit` to include `read_only` StyleBox in `get_minimum_size()` ([GH-91326](https://github.com/godotengine/godot/pull/91326)). +- Windows: Fix `WINDOW_EVENT_FOCUS_IN` not delivered in some cases ([GH-91361](https://github.com/godotengine/godot/pull/91361)). +- Unhide carets in add selection for occurrence and fix error ([GH-91390](https://github.com/godotengine/godot/pull/91390)). +- Make `mouse_focus` and `mouse_focus_mask` consistent for `force_drag` ([GH-91425](https://github.com/godotengine/godot/pull/91425)). +- Fix TextEdit crash with multiple carets disabled and paste ([GH-91457](https://github.com/godotengine/godot/pull/91457)). +- Add `as_sortable_control()` to unify Container checks ([GH-91613](https://github.com/godotengine/godot/pull/91613)). +- Fold TreeItems when clicking to the left of fold icon ([GH-91699](https://github.com/godotengine/godot/pull/91699)). +- Fix CheckBox and CheckButton not using `icon_max_width` ([GH-91700](https://github.com/godotengine/godot/pull/91700)). +- Fix TextEdit minimap tab drawing and click check ([GH-91720](https://github.com/godotengine/godot/pull/91720)). +- Use `as_sortable_control()` in SplitContainer ([GH-91728](https://github.com/godotengine/godot/pull/91728)). +- Fix placement of ColorPicker in the editor ([GH-91757](https://github.com/godotengine/godot/pull/91757)). +- Fallback to default theme for variation items ([GH-91793](https://github.com/godotengine/godot/pull/91793)). +- Round the icon's drawing rect when drawing the button ([GH-91802](https://github.com/godotengine/godot/pull/91802)). +- Fix Control resizing wrongly after "change type" in editor ([GH-91804](https://github.com/godotengine/godot/pull/91804)). +- Editor: Add editor setting to control `disable_embedded_bitmaps` property of the editor fonts ([GH-91931](https://github.com/godotengine/godot/pull/91931)). +- GraphEdit: Fix GraphNode's ports interactable through other GraphNodes ([GH-91991](https://github.com/godotengine/godot/pull/91991)). +- Fix tooltip mouse position conversion for scaled controls ([GH-91997](https://github.com/godotengine/godot/pull/91997)). +- Improve button min. size calculation ([GH-92009](https://github.com/godotengine/godot/pull/92009)). +- Fix Tree and FileSystemList edit popup double events and ESC behavior ([GH-92042](https://github.com/godotengine/godot/pull/92042)). +- Fix scrollbar issues in `ScrollContainer` ([GH-92138](https://github.com/godotengine/godot/pull/92138)). +- Fix TextureButton's click mask texture size ignored if missing normal texture ([GH-92222](https://github.com/godotengine/godot/pull/92222)). +- Fix `PopupMenu` focus issues after `Viewport::set_embedding_subwindows` is changed ([GH-92243](https://github.com/godotengine/godot/pull/92243)). +- Fix crash during code editor folding and LSP ([GH-92301](https://github.com/godotengine/godot/pull/92301)). +- Fix `get_position_with_decorations` and `get_size_with_decorations` for embedded windows ([GH-92317](https://github.com/godotengine/godot/pull/92317)). +- Remove duplicate if/else code in `TextEdit::_notification` ([GH-92342](https://github.com/godotengine/godot/pull/92342)). +- Fix duplicate AcceptDialog cancel/confirm events ([GH-92460](https://github.com/godotengine/godot/pull/92460)). +- RTL: Use real text/object height instead of line height for meta click/hover detection ([GH-92461](https://github.com/godotengine/godot/pull/92461)). +- GraphEdit: Convert to minimap line after getting connection line ([GH-92463](https://github.com/godotengine/godot/pull/92463)). +- Invalidate `Control` global transform before notifying about resize / rect change ([GH-92489](https://github.com/godotengine/godot/pull/92489)). +- TextEdit: Use style margins for selection in read-only mode ([GH-92505](https://github.com/godotengine/godot/pull/92505)). +- Fix minimap error when moving to the top ([GH-92557](https://github.com/godotengine/godot/pull/92557)). +- RTL: Clear default justification flags if custom are set ([GH-92565](https://github.com/godotengine/godot/pull/92565)). +- Fix `RichTextLabel` table overlapping with next line ([GH-92605](https://github.com/godotengine/godot/pull/92605)). +- Fix `NOTIFICATION_SORT_CHILDREN` is called twice on startup ([GH-92645](https://github.com/godotengine/godot/pull/92645)). +- Fix popup windows content margins ([GH-92647](https://github.com/godotengine/godot/pull/92647)). +- Add visibility mode to `as_sortable_control()` ([GH-92664](https://github.com/godotengine/godot/pull/92664)). +- Button: Adds theme option to align button text and icon to either largest or current stylebox ([GH-92701](https://github.com/godotengine/godot/pull/92701)). +- Force canvas item update on oversampling change ([GH-92731](https://github.com/godotengine/godot/pull/92731)). +- Fix IME activation in subviewports ([GH-92740](https://github.com/godotengine/godot/pull/92740)). +- RTL: Fix nested ordered lists inside unordered lists ([GH-92745](https://github.com/godotengine/godot/pull/92745)). +- macOS: Improve native menu open/close callbacks ([GH-92781](https://github.com/godotengine/godot/pull/92781)). +- Fix excessive canvas items updates ([GH-92808](https://github.com/godotengine/godot/pull/92808)). +- Stop color picker tooltip from stealing input events ([GH-92843](https://github.com/godotengine/godot/pull/92843)). +- Force editor progress dialog size update ([GH-92856](https://github.com/godotengine/godot/pull/92856)). +- Fix `TextureProgressBar` radial mode invalid polygon edge case ([GH-92901](https://github.com/godotengine/godot/pull/92901)). +- Window: Fix mouse hover state of the main window when mouse enter event was sent before setting callbacks ([GH-92908](https://github.com/godotengine/godot/pull/92908)). +- Fix native file dialogs being shown on `set_visible(false)` ([GH-92943](https://github.com/godotengine/godot/pull/92943)). +- RTL: Fix list item prefix width not taken into account ([GH-92968](https://github.com/godotengine/godot/pull/92968)). +- Fix `Container::pending_sort` tracking ([GH-93008](https://github.com/godotengine/godot/pull/93008)). +- TextEdit: Don't error when undo stack is empty ([GH-93042](https://github.com/godotengine/godot/pull/93042)). +- Button: Do not include internal margins into base button minimum size ([GH-93128](https://github.com/godotengine/godot/pull/93128)). +- RTL: Fix `align_to_row` for the last table row ([GH-93137](https://github.com/godotengine/godot/pull/93137)). +- RTL: Fix table h/v separation alignment ([GH-93140](https://github.com/godotengine/godot/pull/93140)). +- Fix engine crashing when using Down Arrow selection on Tree with no selection ([GH-93179](https://github.com/godotengine/godot/pull/93179)). +- TextServer: Save advances rounding remainders to prevent rounding error accumulation ([GH-93256](https://github.com/godotengine/godot/pull/93256)). +- Fix GridContainer minimum size when there's a hidden parent ([GH-93386](https://github.com/godotengine/godot/pull/93386)). +- Fix FlowContainer scale from also scaling wrap point ([GH-93444](https://github.com/godotengine/godot/pull/93444)). +- Fix atlas texture positioning in circular TextureProgressBar ([GH-93467](https://github.com/godotengine/godot/pull/93467)). +- Fix subwindow titlebar redraw on oversampling change ([GH-93490](https://github.com/godotengine/godot/pull/93490)). +- CodeEdit: Fix move lines up/down viewport and selection issues ([GH-93607](https://github.com/godotengine/godot/pull/93607)). +- Hide unused category vboxes in inspector ([GH-93627](https://github.com/godotengine/godot/pull/93627)). +- Button: Use `align_to_largest_stylebox` for min. size calculation ([GH-93708](https://github.com/godotengine/godot/pull/93708)). +- Fix RichTextLabel fade set `start_index` to command offset ([GH-93721](https://github.com/godotengine/godot/pull/93721)). +- Change GUI controls pixel snap to round halfway towards positive infinity (`floor(x + 0.5)`) ([GH-93749](https://github.com/godotengine/godot/pull/93749)). +- Fix division by zero in aspect ratio calculation ([GH-93764](https://github.com/godotengine/godot/pull/93764)). +- Fix `AtlasTexture::draw_rect` flipping for non-zero margin ([GH-93828](https://github.com/godotengine/godot/pull/93828)). +- Fix some VisualShader features for high DPI displays/custom UI scales ([GH-93903](https://github.com/godotengine/godot/pull/93903)). +- Fix `Control` nodes emitting unnecessary `resized` signals ([GH-93908](https://github.com/godotengine/godot/pull/93908)). +- Fix dropping on selection in script editor ([GH-93959](https://github.com/godotengine/godot/pull/93959)). +- Fix connections not updated after GraphNode slot update ([GH-93999](https://github.com/godotengine/godot/pull/93999)). +- Fix RichTextLabel + `ui_down` scrolling too far ([GH-94003](https://github.com/godotengine/godot/pull/94003)). +- NativeMenu: Do not auto toggle check/multi-state items. Add `is_native_menu` method ([GH-94061](https://github.com/godotengine/godot/pull/94061)). +- Fix LCD font AA modulation in RendererRD ([GH-94064](https://github.com/godotengine/godot/pull/94064)). +- Fix container minimum size with hidden parent ([GH-94085](https://github.com/godotengine/godot/pull/94085)). +- Prevent confirm button being overridden to "Open" when in save file mode ([GH-94172](https://github.com/godotengine/godot/pull/94172)). +- Avoid `FlowContainer` crash with `TextureRect` using `EXPAND_FIT_*` expand modes ([GH-94286](https://github.com/godotengine/godot/pull/94286)). +- macOS: Fix code completion list scrolling with trackpad ([GH-94363](https://github.com/godotengine/godot/pull/94363)). +- Fix input lock issue when drag scrolling on a `Tree` element on touchscreen devices ([GH-94422](https://github.com/godotengine/godot/pull/94422)). +- Fix ScriptEditor scrolling horizontally when reopening script ([GH-94439](https://github.com/godotengine/godot/pull/94439)). +- Fix game window stops responding when debugger pauses ([GH-94452](https://github.com/godotengine/godot/pull/94452)). +- RTL: Fix text size rounding with MSDF fonts ([GH-94606](https://github.com/godotengine/godot/pull/94606)). +- ScrollContainer: Fix RTL on follow focus ([GH-94621](https://github.com/godotengine/godot/pull/94621)). +- GraphEdit: Correctly disconnect signal to `connection_layer` ([GH-94810](https://github.com/godotengine/godot/pull/94810)). +- Fix `TextEdit` scroll properties editor hint suffix ([GH-94821](https://github.com/godotengine/godot/pull/94821)). +- Fix TextEdit placeholder fit content height ([GH-94848](https://github.com/godotengine/godot/pull/94848)). +- Use legacy color picking in single window mode ([GH-94931](https://github.com/godotengine/godot/pull/94931)). +- Windows: Check if transparency is enabled in the project setting before applying DWM blur ([GH-95009](https://github.com/godotengine/godot/pull/95009)). +- Fix GraphEdit port snapping in certain edge cases ([GH-95059](https://github.com/godotengine/godot/pull/95059)). +- Font: Add check for cyclic base font dependencies ([GH-95083](https://github.com/godotengine/godot/pull/95083)). +- Clear `TabBar` tab close button's rect after it's hidden ([GH-95122](https://github.com/godotengine/godot/pull/95122)). +- PopupMenu: Increase mouse button release timeout and reset it from `post_popup` ([GH-95232](https://github.com/godotengine/godot/pull/95232)). +- Stop popup release timeout on click ([GH-95432](https://github.com/godotengine/godot/pull/95432)). #### Import -- Fix ImageTextureLayered serialization issues ([GH-71394](https://github.com/godotengine/godot/pull/71394)). -- Add support for KTX image format so that we can use Basis Universal for GLTF ([GH-76572](https://github.com/godotengine/godot/pull/76572)). -- Add more physics options to the Scene importer ([GH-77533](https://github.com/godotengine/godot/pull/77533)). -- Fix reimporting files with non lowercase name extension ([GH-78567](https://github.com/godotengine/godot/pull/78567)). -- Add support for GLTF extension KHR_materials_emissive_strength ([GH-78621](https://github.com/godotengine/godot/pull/78621)). -- GLTF: Internal renames in material parsing code ([GH-78622](https://github.com/godotengine/godot/pull/78622)). -- Add layer, shadow and visibility range options to the Scene importer ([GH-78803](https://github.com/godotengine/godot/pull/78803)). -- Allow change import type without restarting editor ([GH-78890](https://github.com/godotengine/godot/pull/78890)). -- Fix property hint class name type string restriction and replace mode ([GH-79139](https://github.com/godotengine/godot/pull/79139)). -- Lossy WebP: Enable sharp RGB to YUV conversion ([GH-79257](https://github.com/godotengine/godot/pull/79257)). -- Add copyright to GLTFState ([GH-79267](https://github.com/godotengine/godot/pull/79267)). -- GLTF: Allow specifying export image format including from extensions ([GH-79314](https://github.com/godotengine/godot/pull/79314)). -- Add `KHR_materials_emissive_strength` extension support for exporting GLTFs ([GH-79421](https://github.com/godotengine/godot/pull/79421)). -- GLTF: Preserve the original bytes when extracting a texture while importing ([GH-79533](https://github.com/godotengine/godot/pull/79533)). -- Add `export_preserialize` to the GLTF export process ([GH-79623](https://github.com/godotengine/godot/pull/79623)). -- Set `base_path` and `filename` during GLTF export when writing to a file ([GH-79636](https://github.com/godotengine/godot/pull/79636)). -- Improve overriding the root type or root name in the scene importer ([GH-79774](https://github.com/godotengine/godot/pull/79774)). -- Cosmetic changes in GLTF node generation code ([GH-79775](https://github.com/godotengine/godot/pull/79775)). -- Improve GLTF export logic for scene root nodes ([GH-79801](https://github.com/godotengine/godot/pull/79801)). -- Fix reimporting scene with default values selected ([GH-79907](https://github.com/godotengine/godot/pull/79907)). -- Update ThorVG to v0.10.0 ([GH-80095](https://github.com/godotengine/godot/pull/80095)). -- Fix error message when reimporting resources with an empty scene open ([GH-80149](https://github.com/godotengine/godot/pull/80149)). -- More cosmetic improvements in the GLTF code ([GH-80205](https://github.com/godotengine/godot/pull/80205)). -- Fix doubly-reserved unique names in GLTF scene name assignment ([GH-80270](https://github.com/godotengine/godot/pull/80270)). -- GLTF: Improve logic for keeping track of the real root node ([GH-80272](https://github.com/godotengine/godot/pull/80272)). -- Use image index instead of texture index for `source_images` ([GH-80314](https://github.com/godotengine/godot/pull/80314)). -- Register and cleanup resource importer singletons in a predictable way ([GH-80377](https://github.com/godotengine/godot/pull/80377)). -- GLTF: Add center of mass property ([GH-80463](https://github.com/godotengine/godot/pull/80463)). -- Limit mesh complexity in LOD generation to prevent crashing ([GH-80467](https://github.com/godotengine/godot/pull/80467)). -- Fixed editor filesystem/import properties not being caught by the doctool ([GH-80576](https://github.com/godotengine/godot/pull/80576)). -- GLTF: Add a comment for skinned mesh tree placement ([GH-80807](https://github.com/godotengine/godot/pull/80807)). -- Fix skeletons when generating multiple Godot scenes from one GLTF ([GH-80831](https://github.com/godotengine/godot/pull/80831)). -- Make DDS loading code only check for R channel bitmask when loading grayscale images ([GH-80862](https://github.com/godotengine/godot/pull/80862)). -- Update Importing 3D scenes links to match splitting PR ([GH-80872](https://github.com/godotengine/godot/pull/80872)). -- Fix "Import Defaults" selector not being initialized incorrectly ([GH-80914](https://github.com/godotengine/godot/pull/80914)). -- Fix grayscale DDS loading ([GH-81134](https://github.com/godotengine/godot/pull/81134)). -- Update Blender export flags for 3.6 ([GH-81194](https://github.com/godotengine/godot/pull/81194)). -- GLTF: Change "Camera3D" generated node name to "Camera" ([GH-81264](https://github.com/godotengine/godot/pull/81264)). -- GLTF: Add root node export options and `GODOT_single_root` extension ([GH-81851](https://github.com/godotengine/godot/pull/81851)). -- Fix ImporterMesh bone weight handling during lightmap unwrap ([GH-81854](https://github.com/godotengine/godot/pull/81854)). -- Disable bounding box shadows for advanced scene importer ([GH-82190](https://github.com/godotengine/godot/pull/82190)). -- Fix GLTF importer forcing vertex colors on all materials ([GH-82272](https://github.com/godotengine/godot/pull/82272)). -- Avoid crash when generating LODs on meshes with non-finite vertices ([GH-82285](https://github.com/godotengine/godot/pull/82285)). -- Fix Image import crash ([GH-82408](https://github.com/godotengine/godot/pull/82408)). -- Avoid import dock cleanup for non-loadable assets ([GH-82490](https://github.com/godotengine/godot/pull/82490)). -- Fix the Advanced Import Settings window's 3D camera ([GH-82591](https://github.com/godotengine/godot/pull/82591)). -- ThorVG: update to v0.11.1 ([GH-83281](https://github.com/godotengine/godot/pull/83281)). -- Make translation importer skip not-supported lang tag, make it more robust ([GH-83600](https://github.com/godotengine/godot/pull/83600)). -- Prevent crash from importing a certain kind of invalid GLTF ([GH-83663](https://github.com/godotengine/godot/pull/83663)). -- Fix infinite loop when importing 3D object named "-colonly" ([GH-83764](https://github.com/godotengine/godot/pull/83764)). -- Fix crash when reimporting with Skeleton3D selected ([GH-83964](https://github.com/godotengine/godot/pull/83964)). -- Add method check for `_notify_skeleton_bones_renamed` ([GH-83986](https://github.com/godotengine/godot/pull/83986)). -- Enhance checks and user experience around tangent arrays in meshes ([GH-84252](https://github.com/godotengine/godot/pull/84252)). -- Implement glTF compatibility system for files imported in older Godot versions ([GH-84271](https://github.com/godotengine/godot/pull/84271)). -- Scan the filesystem in the first frame when using headless mode ([GH-84570](https://github.com/godotengine/godot/pull/84570)). -- Use the Blender file name instead of the generated GLTF file name ([GH-84678](https://github.com/godotengine/godot/pull/84678)). -- Fix Resource Importer use after free ([GH-84872](https://github.com/godotengine/godot/pull/84872)). +- Move 3D scene import classes to their own folder ([GH-51569](https://github.com/godotengine/godot/pull/51569)). +- Blend import: Allow importing `active_collection_only` ([GH-73941](https://github.com/godotengine/godot/pull/73941)). +- Tweak environment in the Advanced Import Settings dialog ([GH-75787](https://github.com/godotengine/godot/pull/75787)). +- Add secondary light to 3D Advanced Import Settings ([GH-76140](https://github.com/godotengine/godot/pull/76140)). +- Add an editor setting to import resources while unfocused ([GH-76991](https://github.com/godotengine/godot/pull/76991)). +- Fix lossless formats in PortableCompressedTexture2D ([GH-77712](https://github.com/godotengine/godot/pull/77712)). +- GLTF: Update `OMI_physics_body`, add `OMI_physics_shape`, keep `OMI_collider` ([GH-78967](https://github.com/godotengine/godot/pull/78967)). +- Add export settings to the export dialog for GLTF ([GH-79316](https://github.com/godotengine/godot/pull/79316)). +- Refactor DDS loading code ([GH-80900](https://github.com/godotengine/godot/pull/80900)). +- Support loading more DDS formats ([GH-81220](https://github.com/godotengine/godot/pull/81220)). +- Add ufbx for FBX importing ([GH-81746](https://github.com/godotengine/godot/pull/81746)). +- Rename ImportSettings dialogs to have "Dialog" in the name ([GH-82899](https://github.com/godotengine/godot/pull/82899)). +- Fix referring to ResourceImporterScene static importers via instances ([GH-82988](https://github.com/godotengine/godot/pull/82988)). +- Fix desynced duplicate GLTFNode transform properties ([GH-83231](https://github.com/godotengine/godot/pull/83231)). +- Fix Scene Importer crashing when animation or mesh save paths are invalid ([GH-83856](https://github.com/godotengine/godot/pull/83856)). +- Do not mutate source Image in `Image::save_jpg` and use encoder return value ([GH-84546](https://github.com/godotengine/godot/pull/84546)). +- Add support for comment (ignorable) column in translation csv ([GH-84569](https://github.com/godotengine/godot/pull/84569)). +- Reimport file when .import changes ([GH-84974](https://github.com/godotengine/godot/pull/84974)). +- Fix memory leak on error paths in tinyexr loader ([GH-85002](https://github.com/godotengine/godot/pull/85002)). +- Replace `//` with `\\` before sending path to Blender ([GH-85335](https://github.com/godotengine/godot/pull/85335)). +- Update `blender_path` behavior to require exact path to executable instead of trying to guess it ([GH-85448](https://github.com/godotengine/godot/pull/85448)). +- Added proper timeout for blender rpc connection ([GH-85519](https://github.com/godotengine/godot/pull/85519)). +- Fix memory corruption and assert failures in convex decomposition ([GH-85631](https://github.com/godotengine/godot/pull/85631)). +- Add toaster notifications for import warnings ([GH-85807](https://github.com/godotengine/godot/pull/85807)). +- Improve normal map VRAM Compression with RGTC ([GH-85842](https://github.com/godotengine/godot/pull/85842)). +- Fix squish RGTC_R decompression corruption ([GH-85863](https://github.com/godotengine/godot/pull/85863)). +- Prevent overriding file info of another file when reimport creates extra files ([GH-85922](https://github.com/godotengine/godot/pull/85922)). +- Fix `squish` DXT5 RA-As-RG channel swapping ([GH-85967](https://github.com/godotengine/godot/pull/85967)). +- GLTF: Import step interpolation for loc/rot/scale as nearest ([GH-86016](https://github.com/godotengine/godot/pull/86016)). +- Do not print error when editor meta was not found as it will be reimported anyway after ([GH-86137](https://github.com/godotengine/godot/pull/86137)). +- Disable mesh compression if vertex `position.z` is always 0 ([GH-86144](https://github.com/godotengine/godot/pull/86144)). +- Implement `ETC2_R` and `ETC2_RG` compression to etcpak ([GH-86313](https://github.com/godotengine/godot/pull/86313)). +- Support unspecified linear size in DDS files ([GH-86336](https://github.com/godotengine/godot/pull/86336)). +- Add obj importer changes to use ImporterMesh ([GH-86365](https://github.com/godotengine/godot/pull/86365)). +- GLTF: Fix three bugs which prevented extracted textures from being refreshed ([GH-86504](https://github.com/godotengine/godot/pull/86504)). +- Fix data format storage method for PortableCompressedTexture2D ([GH-86835](https://github.com/godotengine/godot/pull/86835)). +- Fix BasisUniversal ETC RA as RG transcoding ([GH-86916](https://github.com/godotengine/godot/pull/86916)). +- Misc changes to the GLTF module before audio PR ([GH-87063](https://github.com/godotengine/godot/pull/87063)). +- Use ETC2 compression for grayscale images ([GH-87144](https://github.com/godotengine/godot/pull/87144)). +- Allow configuring the maximum width for atlas import ([GH-87145](https://github.com/godotengine/godot/pull/87145)). +- Run resource previewer on the main thread if using GL compatibility ([GH-87229](https://github.com/godotengine/godot/pull/87229)). +- Fix crash in `GLTFBufferView::load_buffer_view_data` ([GH-87306](https://github.com/godotengine/godot/pull/87306)). +- Retain meta data set on importer nodes ([GH-87584](https://github.com/godotengine/godot/pull/87584)). +- Fix crash when previewing a scene with a mesh as the root node ([GH-87781](https://github.com/godotengine/godot/pull/87781)). +- Make MeshLibrary export do recursive depth-search for MeshInstance3D nodes ([GH-87923](https://github.com/godotengine/godot/pull/87923)). +- Fix crash when importing a GLTF file with a skeleton as the root ([GH-87933](https://github.com/godotengine/godot/pull/87933)). +- Fix GLTF exporting invalid meshes and attempting to export gizmo meshes ([GH-87934](https://github.com/godotengine/godot/pull/87934)). +- Add "skip file" import option to skip (and exclude from export) importable formats, auto set it for the images used by bitmap font ([GH-87972](https://github.com/godotengine/godot/pull/87972)). +- Optimize when colliders are regenerated for imported meshes ([GH-88045](https://github.com/godotengine/godot/pull/88045)). +- Font: Allow overriding advances, offsets and kerning in the ImageFont import settings ([GH-88088](https://github.com/godotengine/godot/pull/88088)). +- Fix exporting trigger shapes in GLTF ([GH-88201](https://github.com/godotengine/godot/pull/88201)). +- Add support for explicitly-defined compound triggers in GLTF files ([GH-88301](https://github.com/godotengine/godot/pull/88301)). +- Clean up and optimize BasisUniversal ([GH-88464](https://github.com/godotengine/godot/pull/88464)). +- Add ASTC support to BasisUniversal ([GH-88485](https://github.com/godotengine/godot/pull/88485)). +- Rework viewport capture in preview generation ([GH-88589](https://github.com/godotengine/godot/pull/88589)). +- BasisUniversal: Fix texture decompression ([GH-88676](https://github.com/godotengine/godot/pull/88676)). +- Properly calculate binormal when creating SurfaceTool from arrays ([GH-88725](https://github.com/godotengine/godot/pull/88725)). +- Multiple fixes for compressed meshes ([GH-88738](https://github.com/godotengine/godot/pull/88738)). +- Allow preserving the initial bone pose in rest fixer ([GH-88821](https://github.com/godotengine/godot/pull/88821)). +- EditorFileSystem: Add verbose print for file being (re)imported ([GH-88904](https://github.com/godotengine/godot/pull/88904)). +- Fix wrong indexing when generating dummy tangents in GLTF import ([GH-88931](https://github.com/godotengine/godot/pull/88931)). +- Only store vertices referenced by the indices per surface in the glTF importer ([GH-89418](https://github.com/godotengine/godot/pull/89418)). +- BasisUniversal: Fix artifacts on images with resolutions not divisible by 4 ([GH-89426](https://github.com/godotengine/godot/pull/89426)). +- Default to trimesh for generated collision shapes in Advanced Import Settings ([GH-89461](https://github.com/godotengine/godot/pull/89461)). +- Fix method bindings in FBXDocument by making them virtual in GLTFDocument ([GH-89532](https://github.com/godotengine/godot/pull/89532)). +- GLTF: Extract converting hull points to mesh to a helper function ([GH-89542](https://github.com/godotengine/godot/pull/89542)). +- Fix crash when columns are skipped in CSV translation ([GH-89573](https://github.com/godotengine/godot/pull/89573)). +- Fix import and saving related crashes ([GH-89780](https://github.com/godotengine/godot/pull/89780)). +- Fix 2 bugs with scale of position tracks in rest fixer ([GH-90065](https://github.com/godotengine/godot/pull/90065)). +- GLTF export: Propagate `property_list_changed` from extensions ([GH-90225](https://github.com/godotengine/godot/pull/90225)). +- Separate Shape3D resource logic in GLTFPhysicsShape ([GH-90230](https://github.com/godotengine/godot/pull/90230)). +- Fix `GLTFDocument.append_from_scene` crash on null node ([GH-90505](https://github.com/godotengine/godot/pull/90505)). +- Fix errors when re-importing 3D asset files ([GH-90531](https://github.com/godotengine/godot/pull/90531)). +- FBX: Fix material colors ([GH-90554](https://github.com/godotengine/godot/pull/90554)). +- Rename accessor GLTFType to GLTFAccessorType, fix verbose prints, document GLTFAccessor ([GH-90560](https://github.com/godotengine/godot/pull/90560)). +- Fix error when loading SVG imported as Image ([GH-90573](https://github.com/godotengine/godot/pull/90573)). +- Fix FBX texture path resolving ([GH-90635](https://github.com/godotengine/godot/pull/90635)). +- Remove unused Make Streamable option from scene import dialog ([GH-90722](https://github.com/godotengine/godot/pull/90722)). +- Fix FBX and glTF when root nodes are skeleton bones ([GH-90789](https://github.com/godotengine/godot/pull/90789)). +- Resolve bind poses from FBX clusters instead of FBX poses ([GH-91036](https://github.com/godotengine/godot/pull/91036)). +- fbx: Avoid name conflict with humanoid "Root" bone ([GH-91045](https://github.com/godotengine/godot/pull/91045)). +- Fix errors/crashes related to skipped imports ([GH-91078](https://github.com/godotengine/godot/pull/91078)). +- Enable tangents in blend shape format when using normals ([GH-91372](https://github.com/godotengine/godot/pull/91372)). +- FBX: Fix handling missing skins using ufbx importer ([GH-91526](https://github.com/godotengine/godot/pull/91526)). +- FBX: Print ufbx load warnings on import ([GH-91529](https://github.com/godotengine/godot/pull/91529)). +- GLTF export improvements ([GH-91783](https://github.com/godotengine/godot/pull/91783)). +- Editor: Ensure font image rows/columns are positive ([GH-91829](https://github.com/godotengine/godot/pull/91829)). +- Improve memory usage for image import and `PortableCompressedTexture2D` ([GH-92179](https://github.com/godotengine/godot/pull/92179)). +- FBX: Change trimming default and use FBX2glTF for compatibility ([GH-92197](https://github.com/godotengine/godot/pull/92197)). +- Fix script properties being lost and prevent node reference corruption upon scene reimport ([GH-92279](https://github.com/godotengine/godot/pull/92279)). +- Fix reimporting assets with csv in the project ([GH-92320](https://github.com/godotengine/godot/pull/92320)). +- Fix GLTFDocument so it can export CSG Meshes correctly ([GH-92368](https://github.com/godotengine/godot/pull/92368)). +- Avoid crash when importing .glsl in headless ([GH-92539](https://github.com/godotengine/godot/pull/92539)). +- Rename FBX2glTF binary path setting back to 4.2 name ([GH-92571](https://github.com/godotengine/godot/pull/92571)). +- Fix same importer will be added multiple times in `get_importers_for_extension` ([GH-92718](https://github.com/godotengine/godot/pull/92718)). +- Fix Keep/Skip File import selection crash ([GH-92815](https://github.com/godotengine/godot/pull/92815)). +- Fix incorrect camera transform of animation view in the import window ([GH-92974](https://github.com/godotengine/godot/pull/92974)). +- [Image Font Importer] Fix reading advance after hex/dec range ([GH-93074](https://github.com/godotengine/godot/pull/93074)). +- Unset the owner of `ImporterMeshInstance3D` before adding it to skeleton's child ([GH-93117](https://github.com/godotengine/godot/pull/93117)). +- [Image Font Importer] Adds support for `\uXXXX` in the kerning config strings ([GH-93119](https://github.com/godotengine/godot/pull/93119)). +- Fix ProgressDialog crash when importing TTF font ([GH-93161](https://github.com/godotengine/godot/pull/93161)). +- Avoid crashing when scene import settings are empty ([GH-93284](https://github.com/godotengine/godot/pull/93284)). +- Remove `monospace/fixed-width` from the `ResourceImporterImageFont` name and description ([GH-93337](https://github.com/godotengine/godot/pull/93337)). +- Fix `browse_dialog` in Blender scene importer to accept files ([GH-93411](https://github.com/godotengine/godot/pull/93411)). +- Make Basis Universal import quiet unless engine is in verbose mode ([GH-93442](https://github.com/godotengine/godot/pull/93442)). +- Fix default collision shape on imported rigidbody ([GH-93506](https://github.com/godotengine/godot/pull/93506)). +- Editor: Fix importers add-ons after 93238 ([GH-93518](https://github.com/godotengine/godot/pull/93518)). +- Use Hermite instead of Bezier for glTF spline interpolation ([GH-93597](https://github.com/godotengine/godot/pull/93597)). +- Fix reimport by scan parsing dependency paths incorrectly ([GH-93765](https://github.com/godotengine/godot/pull/93765)). +- Fix adding a translation CSV results in errors on initial import for many types of resources ([GH-93919](https://github.com/godotengine/godot/pull/93919)). +- Move GLTFAccessorType into GLTFAccessor ([GH-93920](https://github.com/godotengine/godot/pull/93920)). +- Update vertex color import to handle Blender 4.2 upwards ([GH-93998](https://github.com/godotengine/godot/pull/93998)). +- Fix .blend files with quotation marks in filename fail to import ([GH-94004](https://github.com/godotengine/godot/pull/94004)). +- Fix re-import glb model doesn't change the old glb model ([GH-94020](https://github.com/godotengine/godot/pull/94020)). +- Fix missing options in Project Import Defaults ([GH-94058](https://github.com/godotengine/godot/pull/94058)). +- Fix instanced .blend/GLTF scenes lose all children after update until .tscn is reopened ([GH-94093](https://github.com/godotengine/godot/pull/94093)). +- Fix error message being printed when importing an OBJ with no surfaces ([GH-94102](https://github.com/godotengine/godot/pull/94102)). +- Don't attempt to re-import broken files if they didn't change ([GH-94357](https://github.com/godotengine/godot/pull/94357)). +- Fix handling of missing bin file in gltf separate ([GH-94506](https://github.com/godotengine/godot/pull/94506)). +- Fix LOD generation for meshes with tangents & mirrored UVs ([GH-94682](https://github.com/godotengine/godot/pull/94682)). +- Android Editor: Disable file reimport when .import changes ([GH-94691](https://github.com/godotengine/godot/pull/94691)). +- Fix obj's name set in wrong order when importing ([GH-94968](https://github.com/godotengine/godot/pull/94968)). +- Fix reimporting textures after changing import project settings ([GH-94975](https://github.com/godotengine/godot/pull/94975)). +- Fix performance issue reimport file reload scene ([GH-95225](https://github.com/godotengine/godot/pull/95225)). +- Fix reimport file multiple scenes ([GH-95264](https://github.com/godotengine/godot/pull/95264)). #### Input -- Check if input marked handled before processing additional CollisionObjects ([GH-48800](https://github.com/godotengine/godot/pull/48800)). -- Add Unit tests for viewport.cpp Physics 2D Picking ([GH-73477](https://github.com/godotengine/godot/pull/73477)). -- Fix code editor scrolling experience on track pads ([GH-73502](https://github.com/godotengine/godot/pull/73502)). -- Prevent double input events on gamepad when running through steam input ([GH-76045](https://github.com/godotengine/godot/pull/76045)). -- Implement `DisplayServer.keyboard_get_label_from_physical` method ([GH-77993](https://github.com/godotengine/godot/pull/77993)). -- Fix Physics Picking captured Object initialization ([GH-78383](https://github.com/godotengine/godot/pull/78383)). -- Add the ability to get per-platform information for joypads ([GH-78539](https://github.com/godotengine/godot/pull/78539)). -- Mention Xbox menu button by name in Start button description ([GH-78701](https://github.com/godotengine/godot/pull/78701)). -- Android: Set `echo` property for the physical keyboard events ([GH-79089](https://github.com/godotengine/godot/pull/79089)). -- Fix physics passive hovering with `MOUSE_FILTER_IGNORE` ([GH-79443](https://github.com/godotengine/godot/pull/79443)). -- Make GridMap shortcuts editable and not conflict with other plugins ([GH-79529](https://github.com/godotengine/godot/pull/79529)). -- Separate input-handled-state for different events during physics-picking ([GH-79546](https://github.com/godotengine/godot/pull/79546)). -- Fix crash on Windows when closing `Window` ([GH-80142](https://github.com/godotengine/godot/pull/80142)). -- Ensure TileMap editor shortcuts are handled ([GH-80317](https://github.com/godotengine/godot/pull/80317)). -- Fix nodes receiving mouse events in black bars of `Window` ([GH-80334](https://github.com/godotengine/godot/pull/80334)). -- Properly load multiple action sets in XR ([GH-80419](https://github.com/godotengine/godot/pull/80419)). -- Ensure `joy_connection_changed` is emitted on the main thread ([GH-80432](https://github.com/godotengine/godot/pull/80432)). -- Android Stylus pressure and tilt support ([GH-80644](https://github.com/godotengine/godot/pull/80644)). -- Fix GridMap shortcuts that should not be physical ([GH-80774](https://github.com/godotengine/godot/pull/80774)). -- Fix action state when multiple events are assigned ([GH-80859](https://github.com/godotengine/godot/pull/80859)). -- Fix Android input routing logic when using a hardware keyboard ([GH-80932](https://github.com/godotengine/godot/pull/80932)). -- Add missing YEN, SECTION and OPENURL names to keycode mappings ([GH-81054](https://github.com/godotengine/godot/pull/81054)). -- Prevent axis-based actions from getting stuck ([GH-81170](https://github.com/godotengine/godot/pull/81170)). -- Android: Fix joypad trigger value range ([GH-81322](https://github.com/godotengine/godot/pull/81322)). -- Fix `Input.is_action_just_pressed` flicker on joypad axes ([GH-82056](https://github.com/godotengine/godot/pull/82056)). -- Make InputEventShortcut always pressed ([GH-82203](https://github.com/godotengine/godot/pull/82203)). -- Sync controller mappings DB with SDL2 community repo ([GH-82245](https://github.com/godotengine/godot/pull/82245)). -- Add XInput device ID for wireless Series 2 Elite controller ([GH-82508](https://github.com/godotengine/godot/pull/82508)). -- Fix the timeframe when the Android gestures properties are retrieved ([GH-83173](https://github.com/godotengine/godot/pull/83173)). -- Fix Android logic for deferred window input events being inverted ([GH-83301](https://github.com/godotengine/godot/pull/83301)). -- Fix shortcut input for `EditorSceneTabs` ([GH-83501](https://github.com/godotengine/godot/pull/83501)). -- Sync controller mappings DB with SDL2 community repo ([GH-83845](https://github.com/godotengine/godot/pull/83845)). -- Add save shortcut for text shader editor to prevent it propagating to scene ([GH-84064](https://github.com/godotengine/godot/pull/84064)). -- Fix stuck cursor in Advanced Scene Importer ([GH-84661](https://github.com/godotengine/godot/pull/84661)). -- Rework input actions to be reliable ([GH-84685](https://github.com/godotengine/godot/pull/84685)). +- Add setting for picking only top-most overlapping collision object ([GH-75688](https://github.com/godotengine/godot/pull/75688)). +- Fix `push_input` events not going through after first pressed mouse event ([GH-77730](https://github.com/godotengine/godot/pull/77730)). +- Web: Add IME input support ([GH-79362](https://github.com/godotengine/godot/pull/79362)). +- Support detecting and mapping Ctrl/Alt/Shift/Meta by their left/right physical location ([GH-80231](https://github.com/godotengine/godot/pull/80231)). +- Ensure the active window gains the keyboard focus ([GH-80548](https://github.com/godotengine/godot/pull/80548)). +- Fix controller vibration in macOS and migrate to GameController API ([GH-80709](https://github.com/godotengine/godot/pull/80709)). +- Fix internal events not being delivered to some Window types ([GH-81243](https://github.com/godotengine/godot/pull/81243)). +- Add support for OpenXR hand interaction extension ([GH-81533](https://github.com/godotengine/godot/pull/81533)). +- Add screen-related attributes to mouse input events ([GH-82800](https://github.com/godotengine/godot/pull/82800)). +- Fix InputEventScreenDrag on Android ([GH-84331](https://github.com/godotengine/godot/pull/84331)). +- Windows: Make Windows Ink tablet API default, add dummy driver to disable tablet input ([GH-84708](https://github.com/godotengine/godot/pull/84708)). +- Rework Input action pressed state to support multiple controllers ([GH-84943](https://github.com/godotengine/godot/pull/84943)). +- X11: Send IME update notification deferred ([GH-85306](https://github.com/godotengine/godot/pull/85306)). +- Fix IME key event being erased in macOS ([GH-85458](https://github.com/godotengine/godot/pull/85458)). +- Fix horizontal scroll in editor's 2D view ([GH-85473](https://github.com/godotengine/godot/pull/85473)). +- Add `event_index` to InputEventAction ([GH-86010](https://github.com/godotengine/godot/pull/86010)). +- Add bindings for setting and getting emulation mouse from touch and touch from mouse in input ([GH-86081](https://github.com/godotengine/godot/pull/86081)). +- Add MIDI controller device index to `InputEventMIDI.device` property ([GH-86620](https://github.com/godotengine/godot/pull/86620)). +- Prevent escape key from closing Editor Settings window when filtering for shortcuts ([GH-86654](https://github.com/godotengine/godot/pull/86654)). +- Clear drag preview nodes on `NOTIFICATION_DRAG_END` ([GH-87125](https://github.com/godotengine/godot/pull/87125)). +- macOS: Handle Trackpad / Magic Mouse swipe events and simulate XBUTTON1 / XBUTTON2 buttons ([GH-87277](https://github.com/godotengine/godot/pull/87277)). +- Check action exists in `Input.action_press` and `action_release` ([GH-87324](https://github.com/godotengine/godot/pull/87324)). +- Fix SubViewport physics picking ([GH-87385](https://github.com/godotengine/godot/pull/87385)). +- macOS: Fix missing modifier + space key down events ([GH-87498](https://github.com/godotengine/godot/pull/87498)). +- Add cancel transformation shortcut to 2D to match 3D ([GH-87616](https://github.com/godotengine/godot/pull/87616)). +- Remove unused internal Variable `Viewport::gui_input_group` ([GH-87632](https://github.com/godotengine/godot/pull/87632)). +- Fix LineEdit behavior for deleting all the way to the left/right ([GH-88057](https://github.com/godotengine/godot/pull/88057)). +- Add rotary input support for Android platform ([GH-88130](https://github.com/godotengine/godot/pull/88130)). +- Allow aborting `SpinSlider` value changes ([GH-88275](https://github.com/godotengine/godot/pull/88275)). +- macOS: Fix `Ctrl+Tab` and `Ctrl+Shift+Tab` not working ([GH-88334](https://github.com/godotengine/godot/pull/88334)). +- Handle warped mouse motion as floating point ([GH-88343](https://github.com/godotengine/godot/pull/88343)). +- macOS: Fix the "Toggle Hidden Files" shortcut ([GH-88389](https://github.com/godotengine/godot/pull/88389)). +- Fix global position for `InputEventMouse` in `viewport::push_input` ([GH-88473](https://github.com/godotengine/godot/pull/88473)). +- macOS: Ignore window decorations in confined mouse mode to match other platforms ([GH-88519](https://github.com/godotengine/godot/pull/88519)). +- Wayland: Restore tablet support and handle multiple tools ([GH-88744](https://github.com/godotengine/godot/pull/88744)). +- Improve `cursor_set_custom_image()` method ([GH-88970](https://github.com/godotengine/godot/pull/88970)). +- macOS: Enable input from controllers in the background ([GH-88978](https://github.com/godotengine/godot/pull/88978)). +- Expose `DEVICE_ID_EMULATION` constant in InputEvent ([GH-89526](https://github.com/godotengine/godot/pull/89526)). +- Fix mouse events when `physics_object_picking_first_only` enabled ([GH-89643](https://github.com/godotengine/godot/pull/89643)). +- Prohibit execution of delayed input events by different means ([GH-89920](https://github.com/godotengine/godot/pull/89920)). +- Fix a special case for button masks ([GH-89926](https://github.com/godotengine/godot/pull/89926)). +- Fix `Input.action_press()` accepting out-of-bounds strength values ([GH-89946](https://github.com/godotengine/godot/pull/89946)). +- Windows: Fix mouse handling regression ([GH-90382](https://github.com/godotengine/godot/pull/90382)). +- Update undo redo allowed after switching scene tab ([GH-90616](https://github.com/godotengine/godot/pull/90616)). +- iOS: Fix sensors orientation ([GH-91050](https://github.com/godotengine/godot/pull/91050)). +- Add `amplitude` argument to `Input.vibrate_handheld` ([GH-91143](https://github.com/godotengine/godot/pull/91143)). +- Fix Steam input "crc" errors, and some other Coverity reports of uninitialized scalar variable ([GH-91454](https://github.com/godotengine/godot/pull/91454)). +- [Web IME] Fix suggestion window position in Chromium based browsers ([GH-91695](https://github.com/godotengine/godot/pull/91695)). +- Disable viewports inputs when dragging and dropping into the viewport ([GH-91845](https://github.com/godotengine/godot/pull/91845)). +- Use Option+Cmd+Left/Right for script editor history navigation on macOS ([GH-91887](https://github.com/godotengine/godot/pull/91887)). +- Fix invalid detection of mouse input ([GH-92133](https://github.com/godotengine/godot/pull/92133)). +- Clean `Input::frame_parsed_events` before de-initialising scripting languages to ensure no script created events exist at the exit ([GH-92201](https://github.com/godotengine/godot/pull/92201)). +- Remove duplicate shortcut definitions ([GH-92223](https://github.com/godotengine/godot/pull/92223)). +- Windows: Use current keyboard state instead of saved values for modifier keys ([GH-92415](https://github.com/godotengine/godot/pull/92415)). +- Use current mouse button state instead of saved values ([GH-92424](https://github.com/godotengine/godot/pull/92424)). +- Fix creating cursor image from `AtlasTexture` ([GH-92702](https://github.com/godotengine/godot/pull/92702)). +- Fix Windows Activate Process leading to stuck input ([GH-92742](https://github.com/godotengine/godot/pull/92742)). +- Add input event callback to `DisplayServerHeadless` ([GH-92806](https://github.com/godotengine/godot/pull/92806)). +- Fix Left Joystick motion not registering on Android ([GH-93011](https://github.com/godotengine/godot/pull/93011)). +- Wayland: Implement IME support ([GH-93021](https://github.com/godotengine/godot/pull/93021)). +- Window: Ignore duplicate mouse enter events ([GH-93100](https://github.com/godotengine/godot/pull/93100)). +- Windows Input use GetKeyState instead of GetAsyncKeyState ([GH-93105](https://github.com/godotengine/godot/pull/93105)). +- Prevent node rename shortcut from stealing focus from controls ([GH-93165](https://github.com/godotengine/godot/pull/93165)). +- Fix ruler tool sticks after right click ([GH-93174](https://github.com/godotengine/godot/pull/93174)). +- Fix trackpads and graphics tablets being recognized as controllers on Linux/*BSD ([GH-93352](https://github.com/godotengine/godot/pull/93352)). +- Add stub method for `mouse_get_position` in headless display server ([GH-93494](https://github.com/godotengine/godot/pull/93494)). +- Fix undoredo handling in some dialogs ([GH-93898](https://github.com/godotengine/godot/pull/93898)). +- Wayland: Scale relative pointer motion ([GH-94021](https://github.com/godotengine/godot/pull/94021)). +- Web: Fix IME blocking controls ([GH-94024](https://github.com/godotengine/godot/pull/94024)). +- Fix custom Ctrl-Space shortcut in Script Editor adds a space ([GH-94033](https://github.com/godotengine/godot/pull/94033)). +- Cleanup Android input on render thread settings ([GH-94052](https://github.com/godotengine/godot/pull/94052)). +- Winink: Check pointer button states ([GH-94063](https://github.com/godotengine/godot/pull/94063)). +- Add Home/End to text caret movements on macOS ([GH-94073](https://github.com/godotengine/godot/pull/94073)). +- [iOS/Text Input] Avoid deleting and reentering unchanged part of text ([GH-94114](https://github.com/godotengine/godot/pull/94114)). +- Fix physics tick count in `Input.action_press` and `Input.action_release` ([GH-94413](https://github.com/godotengine/godot/pull/94413)). +- Fix update mouse cursor state wrong mouse position ([GH-94987](https://github.com/godotengine/godot/pull/94987)). +- X11: Use motion event button state instead of async state ([GH-95008](https://github.com/godotengine/godot/pull/95008)). +- Windows: Reject `WM_POINTER(UP/DOWN)` messages for non pen pointer type ([GH-95155](https://github.com/godotengine/godot/pull/95155)). #### Multiplayer -- Disallow nested custom multiplayers in `SceneTree` ([GH-77829](https://github.com/godotengine/godot/pull/77829)). -- Prevent crash when accessing `Node` Multiplayer from thread ([GH-79332](https://github.com/godotengine/godot/pull/79332)). -- Use `get/set_indexed` in MultiplayerSynchronizer ([GH-79479](https://github.com/godotengine/godot/pull/79479)). -- [Net/ENet] Better handle truncated socket messages ([GH-79699](https://github.com/godotengine/godot/pull/79699)). -- ENet: Properly set transfer flags when using custom channels ([GH-80293](https://github.com/godotengine/godot/pull/80293)). -- Fix watch properties not being correctly removed ([GH-81033](https://github.com/godotengine/godot/pull/81033)). -- Improve SceneReplicationConfig editor UX + optimizations ([GH-81136](https://github.com/godotengine/godot/pull/81136)). -- Various performance optimizations ([GH-82777](https://github.com/godotengine/godot/pull/82777)). -- Copy network authority when instancing placeholders ([GH-82846](https://github.com/godotengine/godot/pull/82846)). -- Fix synchronizer init and reset ([GH-83264](https://github.com/godotengine/godot/pull/83264)). -- Fix "on change" indexed properties ([GH-83279](https://github.com/godotengine/godot/pull/83279)). -- Display multiplayer authority ID in remote debugger ([GH-83437](https://github.com/godotengine/godot/pull/83437)). +- Fix `complete_auth` notifying the wrong peer ([GH-86257](https://github.com/godotengine/godot/pull/86257)). +- Fix auth not waiting for confirmation in some cases ([GH-86260](https://github.com/godotengine/godot/pull/86260)). +- Fix spawned nodes not working after reset ([GH-87185](https://github.com/godotengine/godot/pull/87185)). +- Fix remote net ID cleanup ([GH-87186](https://github.com/godotengine/godot/pull/87186)). +- Handle cleanup of "scene cache" nodes ([GH-87190](https://github.com/godotengine/godot/pull/87190)). +- Networking scene multiplayer: Fix removing connected peer during disconnection ([GH-88826](https://github.com/godotengine/godot/pull/88826)). +- Fix replication config reload error ([GH-89108](https://github.com/godotengine/godot/pull/89108)). +- Fix node config warning not updating for `Multiplayer{Spawner,Synchronizer}` ([GH-89839](https://github.com/godotengine/godot/pull/89839)). +- Gracefully handle cache confirmation of deleted nodes ([GH-90027](https://github.com/godotengine/godot/pull/90027)). +- Fix dead code doing unnecessary allocation ([GH-90315](https://github.com/godotengine/godot/pull/90315)). +- Fix `disconnect_peer` not doing the proper cleanup ([GH-91011](https://github.com/godotengine/godot/pull/91011)). +- Modify MultiplayerSpawner scene path error checking ([GH-91084](https://github.com/godotengine/godot/pull/91084)). +- Fix Multiplayer Spawner freeing node after client disconnected Issue ([GH-92359](https://github.com/godotengine/godot/pull/92359)). +- Fix undo not updating spawn checkbox in replication editor ([GH-92735](https://github.com/godotengine/godot/pull/92735)). +- Instantiate a replication config on synchronizer creation ([GH-93374](https://github.com/godotengine/godot/pull/93374)). +- Partially revert cache cleanup, track paths as fallback ([GH-94984](https://github.com/godotengine/godot/pull/94984)). +- ENet: Better handle disconnected peers in DTLS server ([GH-95067](https://github.com/godotengine/godot/pull/95067)). +- Avoid error spam in relay protocol when clients disconnect ([GH-95192](https://github.com/godotengine/godot/pull/95192)). +- Fix relay protocol routing with negative targets ([GH-95194](https://github.com/godotengine/godot/pull/95194)). #### Navigation -- Add NavigationRegion function to change navigation map ([GH-77191](https://github.com/godotengine/godot/pull/77191)). -- Add ProjectSettings navigation map default up ([GH-78365](https://github.com/godotengine/godot/pull/78365)). -- Add more basic tests for `NavigationServer3D` ([GH-78480](https://github.com/godotengine/godot/pull/78480)). -- Add advanced `NavigationServer3D` tests ([GH-78667](https://github.com/godotengine/godot/pull/78667)). -- Fix closest possible navigation path position ([GH-79004](https://github.com/godotengine/godot/pull/79004)). -- Add NavigationServer API to enable regions and links ([GH-79129](https://github.com/godotengine/godot/pull/79129)). -- Mark NavigationServer3D.region_bake_navigation_mesh() as deprecated ([GH-79137](https://github.com/godotengine/godot/pull/79137)). -- Add `clear` function to NavigationMesh / NavigationPolygon ([GH-79157](https://github.com/godotengine/godot/pull/79157)). -- Fix pathfinding funnel adding unwanted point ([GH-79228](https://github.com/godotengine/godot/pull/79228)). -- Fix NavigationObstacle2D debug position ([GH-79392](https://github.com/godotengine/godot/pull/79392)). -- Make NavigationRegion3D baking NavMesh on the main thread not finish deferred ([GH-79465](https://github.com/godotengine/godot/pull/79465)). -- Change 2D navigation ProjectSettings from integers to floats ([GH-79483](https://github.com/godotengine/godot/pull/79483)). -- Set default `cell_size` on new TileMap Layer navigation layer maps ([GH-79485](https://github.com/godotengine/godot/pull/79485)). -- Add more hints to navigation map cell size errors ([GH-79489](https://github.com/godotengine/godot/pull/79489)). -- Add a `fill_region` method to the `AStarGrid2D` ([GH-79495](https://github.com/godotengine/godot/pull/79495)). -- Move navigation mesh baking to NavigationServer ([GH-79643](https://github.com/godotengine/godot/pull/79643)). -- Disable NavigationMesh `edge_max_length` property by default ([GH-79786](https://github.com/godotengine/godot/pull/79786)). -- Add multi-threaded NavMesh baking to NavigationServer ([GH-79972](https://github.com/godotengine/godot/pull/79972)). -- Fix NavMesh `map_update_id` returning 0 results in errors ([GH-80189](https://github.com/godotengine/godot/pull/80189)). -- Fix missing include for `NavigationMesh` ([GH-80408](https://github.com/godotengine/godot/pull/80408)). -- Add 2D navigation mesh baking ([GH-80796](https://github.com/godotengine/godot/pull/80796)). -- Suppress expected errors in navigation-related unit tests ([GH-80833](https://github.com/godotengine/godot/pull/80833)). -- Fix compiling with 3D disabled due to unused navigation variable ([GH-81295](https://github.com/godotengine/godot/pull/81295)). -- Core: Some code style improvements to `AStarGrid2D` ([GH-81900](https://github.com/godotengine/godot/pull/81900)). -- Fix typo in dev assert in NavMeshGenerator2D ([GH-82368](https://github.com/godotengine/godot/pull/82368)). -- Update TileMap to use new navigation polygon baking ([GH-82465](https://github.com/godotengine/godot/pull/82465)). -- Fix NavigationObstacle3D debug being affected by rotation and scale ([GH-82593](https://github.com/godotengine/godot/pull/82593)). -- Fix enabling NavigationRegion3D saved disabled ([GH-83365](https://github.com/godotengine/godot/pull/83365)). -- Fix "Navigation map synchronization error" when using NavigationRegion2D ([GH-83568](https://github.com/godotengine/godot/pull/83568)). -- Fix NavRegion sync error messages ([GH-83574](https://github.com/godotengine/godot/pull/83574)). -- Fix NavigationObstacle3D height ([GH-83701](https://github.com/godotengine/godot/pull/83701)). -- Fix NavigationAgent3D stored y-axis velocity and make it optional ([GH-83705](https://github.com/godotengine/godot/pull/83705)). -- Fix NavigationLink enabled toggle ([GH-83709](https://github.com/godotengine/godot/pull/83709)). -- Fix hole in heightmap navigation mesh baking ([GH-83783](https://github.com/godotengine/godot/pull/83783)). -- Fix potential crashes with TileMap navmesh baking ([GH-83891](https://github.com/godotengine/godot/pull/83891)). -- Fix NavigationObstacle3DEditor parenting error ([GH-84055](https://github.com/godotengine/godot/pull/84055)). -- Fix NavigationObstacle elevation ([GH-84830](https://github.com/godotengine/godot/pull/84830)). -- Fix NavigationObstacle height ([GH-84857](https://github.com/godotengine/godot/pull/84857)). +- Add NavigationServer random point queries ([GH-75098](https://github.com/godotengine/godot/pull/75098)). +- Make navigation map spatial queries thread-safe ([GH-79577](https://github.com/godotengine/godot/pull/79577)). +- Add isometric cell shape mode to `AStarGrid2D` ([GH-81267](https://github.com/godotengine/godot/pull/81267)). +- Make `target_desired_distance` affect the navigation of `NavigationAgent2D/3D` ([GH-82561](https://github.com/godotengine/godot/pull/82561)). +- Fix missing NavigationLink property updates in constructor ([GH-83802](https://github.com/godotengine/godot/pull/83802)). +- Fix missing NavigationRegion property updates in constructor ([GH-83812](https://github.com/godotengine/godot/pull/83812)). +- Fix missing NavigationAgent property updates in constructor ([GH-83814](https://github.com/godotengine/godot/pull/83814)). +- Fix missing NavigationObstacle property updates in constructor ([GH-83816](https://github.com/godotengine/godot/pull/83816)). +- Add function to get navigation map iteration id from NavigationServer ([GH-84275](https://github.com/godotengine/godot/pull/84275)). +- Improve NavigationServer NavMap sync error msgs ([GH-84278](https://github.com/godotengine/godot/pull/84278)). +- Add missing getters to navigation servers ([GH-84729](https://github.com/godotengine/godot/pull/84729)). +- Fix memory leak in 'NavigationServer3D' involving static obstacles ([GH-84816](https://github.com/godotengine/godot/pull/84816)). +- Do not use travel cost for minimum when re-selecting end point ([GH-85253](https://github.com/godotengine/godot/pull/85253)). +- Fix NavigationRegion2D transform update ([GH-85258](https://github.com/godotengine/godot/pull/85258)). +- Make 2D navigation mesh baking parse all TileMapLayers ([GH-85856](https://github.com/godotengine/godot/pull/85856)). +- Fix default NavigationPolygon source geometry group name ([GH-86458](https://github.com/godotengine/godot/pull/86458)). +- Add NavigationMesh `border_size` property for tile baking ([GH-87378](https://github.com/godotengine/godot/pull/87378)). +- Auto-bake edited NavigationPolygons in the Editor on a timer ([GH-87504](https://github.com/godotengine/godot/pull/87504)). +- Expose `is_baking` method in navigation servers and region nodes ([GH-87715](https://github.com/godotengine/godot/pull/87715)). +- Add means for fixing navmap synchronization errors ([GH-87959](https://github.com/godotengine/godot/pull/87959)). +- Add NavigationPolygon `border_size` property for tile baking ([GH-87961](https://github.com/godotengine/godot/pull/87961)). +- Add a partial path return option for AStar ([GH-88047](https://github.com/godotengine/godot/pull/88047)). +- Fix property hints for parsed collision mask ([GH-88156](https://github.com/godotengine/godot/pull/88156)). +- Fix NavigationRegion errors from signal changes ([GH-88164](https://github.com/godotengine/godot/pull/88164)). +- Extend `NavigationMeshSourceGeometryData[23]D` to allow data merging ([GH-88221](https://github.com/godotengine/godot/pull/88221)). +- Remove NavigationServerDummy warnings ([GH-88375](https://github.com/godotengine/godot/pull/88375)). +- Add some missing compile checks ([GH-88679](https://github.com/godotengine/godot/pull/88679)). +- Add debug visual for NavigationRegion2D bake rect ([GH-88701](https://github.com/godotengine/godot/pull/88701)). +- Fix NavigationObstacle2D debug being affected by Node2D transform ([GH-88895](https://github.com/godotengine/godot/pull/88895)). +- Fix NavigationObstacle3D debug not reacting to visibility changes ([GH-89009](https://github.com/godotengine/godot/pull/89009)). +- Add NavigationObstacle options to affect navigation mesh baking ([GH-89034](https://github.com/godotengine/godot/pull/89034)). +- Add navigation baking crash prevention mechanism ([GH-89692](https://github.com/godotengine/godot/pull/89692)). +- Change 2D navigation mesh baking to use floating point coordinates ([GH-89929](https://github.com/godotengine/godot/pull/89929)). +- Fix `NavigationServer.set_debug_enabled()` doing nothing ([GH-90200](https://github.com/godotengine/godot/pull/90200)). +- Add navigation path simplification ([GH-90434](https://github.com/godotengine/godot/pull/90434)). +- Fix NavigationMeshSourceGeometryData merge crash ([GH-90504](https://github.com/godotengine/godot/pull/90504)). +- Use threads for baking navigation mesh inside editor ([GH-90508](https://github.com/godotengine/godot/pull/90508)). +- Use fmod for navigation mesh border size warning ([GH-90602](https://github.com/godotengine/godot/pull/90602)). +- Update NavigationRegion tests RID function ([GH-90744](https://github.com/godotengine/godot/pull/90744)). +- Remove experimental `constrain_avoidance` from `NavigationRegion2D` ([GH-90747](https://github.com/godotengine/godot/pull/90747)). +- Add navigation mesh source geometry parsers and callbacks ([GH-90876](https://github.com/godotengine/godot/pull/90876)). +- Warn that navigation mesh baking from Meshes is bad for runtime performance ([GH-90921](https://github.com/godotengine/godot/pull/90921)). +- Add NavigationMeshSourceGeometryData append functions ([GH-90935](https://github.com/godotengine/godot/pull/90935)). +- NavigationRegion test suppress warning about visual meshes ([GH-91103](https://github.com/godotengine/godot/pull/91103)). +- Fix TileMapLayer navmesh baking ([GH-91464](https://github.com/godotengine/godot/pull/91464)). +- Allow editing `NavigationObstacle2D` shape vertices ([GH-91872](https://github.com/godotengine/godot/pull/91872)). +- Remove duplicated vertices after 3D NavigationMesh bake ([GH-92181](https://github.com/godotengine/godot/pull/92181)). +- Fix NavigationRegion3D not reacting to runtime debug enabled change ([GH-92288](https://github.com/godotengine/godot/pull/92288)). +- Improve NavigationRegion2D debug performance ([GH-92372](https://github.com/godotengine/godot/pull/92372)). +- Fix crash when baking TileMap navigation ([GH-92422](https://github.com/godotengine/godot/pull/92422)). +- Fix `NavigationServer3D.get_closest_point_to_segment()` with `use_collision` ([GH-92850](https://github.com/godotengine/godot/pull/92850)). +- TileSet: Transform rotated navigation (sub)-polygons individually ([GH-92955](https://github.com/godotengine/godot/pull/92955)). +- Fix NavigationRegion2D debug not clearing canvas item ([GH-92991](https://github.com/godotengine/godot/pull/92991)). +- Fix NavigationRegion2D editor plugin clear button not updating debug visuals ([GH-92994](https://github.com/godotengine/godot/pull/92994)). +- Fix closest edge and face check in `NavigationServer3D.map_get_closest_point_to_segment` ([GH-93227](https://github.com/godotengine/godot/pull/93227)). +- Fix thread-use causing navigation mesh data corruption ([GH-93392](https://github.com/godotengine/godot/pull/93392)). +- Fix thread-use causing navigation source geometry data corruption ([GH-93407](https://github.com/godotengine/godot/pull/93407)). +- Fix potential crash due to invalid navigation mesh ref ([GH-93423](https://github.com/godotengine/godot/pull/93423)). +- Fix thread-use causing navigation polygon data corruption ([GH-93426](https://github.com/godotengine/godot/pull/93426)). +- Remove unused navigation polygon properties ([GH-93485](https://github.com/godotengine/godot/pull/93485)). +- `NavigationServer3D.map_get_closest_point_to_segment` - add an additional shortest distance check ([GH-93541](https://github.com/godotengine/godot/pull/93541)). +- Fix NavigationPolygon not updating consistently on rebakes ([GH-94362](https://github.com/godotengine/godot/pull/94362)). #### Network -- Fix `rpc` calls with binds ([GH-78551](https://github.com/godotengine/godot/pull/78551)). -- Web: Fix WebSocket returning empty close-reason ([GH-79407](https://github.com/godotengine/godot/pull/79407)). -- Web: Always return -1 as body length in HTTPClientWeb ([GH-79846](https://github.com/godotengine/godot/pull/79846)). +- Add unit test for `IP.resolve_hostname` ([GH-81465](https://github.com/godotengine/godot/pull/81465)). +- UPNP: Use local variable for UPNPUrls to stop memory leak ([GH-89897](https://github.com/godotengine/godot/pull/89897)). +- mbedTLS: Update to new LTS v3.6.0 ([GH-90482](https://github.com/godotengine/godot/pull/90482)). +- Fix missing return in `StreamPeerTCP::poll` when connection is `STATUS_CONNECTED` ([GH-90741](https://github.com/godotengine/godot/pull/90741)). +- Crypto: Expose `get_system_ca_certificates` ([GH-93176](https://github.com/godotengine/godot/pull/93176)). +- Crypto: Expose TLSOptions getters ([GH-93178](https://github.com/godotengine/godot/pull/93178)). +- WebSocket: Allow reusing closing and closed peers ([GH-94168](https://github.com/godotengine/godot/pull/94168)). +- WebSocket: Ensure `TCP_NODELAY` is always set ([GH-94618](https://github.com/godotengine/godot/pull/94618)). +- WS: Fix `set_no_delay` on Windows ([GH-95233](https://github.com/godotengine/godot/pull/95233)). #### Particles -- Add `finished` signal to CPUParticles ([GH-76853](https://github.com/godotengine/godot/pull/76853)). -- Add `finished` signal to GPUParticles ([GH-76859](https://github.com/godotengine/godot/pull/76859)). -- Initialize particles instance buffer in case it is used before being updated ([GH-78852](https://github.com/godotengine/godot/pull/78852)). -- Add option to center image when loading particle emission mask ([GH-78944](https://github.com/godotengine/godot/pull/78944)). -- Unify error condition for particles trail lifetime ([GH-79270](https://github.com/godotengine/godot/pull/79270)). -- Particle internal refactor and additions for more artistic control ([GH-79527](https://github.com/godotengine/godot/pull/79527)). -- Fix particle shader deterministic random values ([GH-80638](https://github.com/godotengine/godot/pull/80638)). -- Add motion vector support for GPU 3D Particles ([GH-80688](https://github.com/godotengine/godot/pull/80688)). -- Implement conversion from `CPUParticles` to `GPUParticles` (3D/2D) ([GH-80779](https://github.com/godotengine/godot/pull/80779)). -- Fix GPUParticles2D offset stutter ([GH-80984](https://github.com/godotengine/godot/pull/80984)). -- Fix z-billboard + y to velocity transform alignment to correctly respect non-uniform scale ([GH-81315](https://github.com/godotengine/godot/pull/81315)). -- Fix errors when freeing GPUParticles ([GH-82431](https://github.com/godotengine/godot/pull/82431)). -- Fixed multiple particle issues: division by zero, color ramp override, scale dependent on amount ratio ([GH-83488](https://github.com/godotengine/godot/pull/83488)). -- Fix typo in particles process material when using emission color texture ([GH-83620](https://github.com/godotengine/godot/pull/83620)). -- Fix massive performance hit due to enabling collision ([GH-83749](https://github.com/godotengine/godot/pull/83749)). -- Fix directed points not working, and fix friction formula ([GH-83831](https://github.com/godotengine/godot/pull/83831)). -- Fix `noise_direction` variable used before initialized in particle shader when using turbulence with collisions ([GH-83881](https://github.com/godotengine/godot/pull/83881)). -- Fix invalid parameter ranges ([GH-84006](https://github.com/godotengine/godot/pull/84006)). -- Fix friction being in the correct if/else branch ([GH-84028](https://github.com/godotengine/godot/pull/84028)). -- Fix damp as friction not updating shader code ([GH-84029](https://github.com/godotengine/godot/pull/84029)). -- Fix wrong rotation matrix for orbit z velocity ([GH-84056](https://github.com/godotengine/godot/pull/84056)). -- Fix turbulence post rework ([GH-84103](https://github.com/godotengine/godot/pull/84103)). -- OpenGL: Fix uninitialized memory usage for GPUParticles `interp_to_end` ([GH-84189](https://github.com/godotengine/godot/pull/84189)). -- Fix several Material texture parameter updates ([GH-84303](https://github.com/godotengine/godot/pull/84303)). -- Fix several ParticleProcessMaterial texture names ([GH-84829](https://github.com/godotengine/godot/pull/84829)). -- Fix radial inwards velocity clamping incorrectly (regression from #83488) ([GH-85252](https://github.com/godotengine/godot/pull/85252)). +- Support custom AABBs within MultiMesh resources ([GH-79833](https://github.com/godotengine/godot/pull/79833)). +- Improve editing of min/max particle properties ([GH-81260](https://github.com/godotengine/godot/pull/81260)). +- Fix `CPUParticles2D` tangential force does not match `GPUParticles2D` ([GH-84575](https://github.com/godotengine/godot/pull/84575)). +- Only allow MeshInstance3D-based nodes in particles emission shape node selector ([GH-84891](https://github.com/godotengine/godot/pull/84891)). +- Correctly emit sub-emitter's emission at the end ([GH-85189](https://github.com/godotengine/godot/pull/85189)). +- Fix particle spread values affecting particle velocity ([GH-85880](https://github.com/godotengine/godot/pull/85880)). +- Only update particle velocity when it changes ([GH-86474](https://github.com/godotengine/godot/pull/86474)). +- Fix collided particles getting stuck with zero velocity ([GH-87320](https://github.com/godotengine/godot/pull/87320)). +- Fix CPU/GPUParticles2D bugs on Compatibility Rendering (GLES3) on Adreno 3XX devices ([GH-88816](https://github.com/godotengine/godot/pull/88816)). +- Fix early activation of particle trail sections ([GH-89042](https://github.com/godotengine/godot/pull/89042)). +- Fix error in AABB calculation for particles with USERDATA ([GH-89046](https://github.com/godotengine/godot/pull/89046)). +- Fix `update_property()` in particle material editor ([GH-89048](https://github.com/godotengine/godot/pull/89048)). +- Fix `USERDATA` built-ins for GLES3 particle shaders ([GH-89094](https://github.com/godotengine/godot/pull/89094)). +- Fix `CPUParticles3D` using angle incorrectly when `ROTATE_Y` is set ([GH-89595](https://github.com/godotengine/godot/pull/89595)). +- Fix `INSTANCE_CUSTOM.w` not being assigned correctly in CPUParticles 2D and 3D ([GH-90095](https://github.com/godotengine/godot/pull/90095)). +- Fix inverted GPUParticlesCollisionHeightField3D ([GH-91219](https://github.com/godotengine/godot/pull/91219)). +- Fix particle cylinder emission shape random distribution ([GH-91223](https://github.com/godotengine/godot/pull/91223)). +- Fix sqrt application for radius in particle ring emission ([GH-91449](https://github.com/godotengine/godot/pull/91449)). +- Add Ctrl + R keyboard shortcut to restart particle emission in the editor ([GH-92134](https://github.com/godotengine/godot/pull/92134)). +- Fix 2d sdf collision for TileMapLayer Occluders ([GH-92173](https://github.com/godotengine/godot/pull/92173)). +- Fix collided 3D GPU particles sometimes jittering ([GH-92474](https://github.com/godotengine/godot/pull/92474)). +- Fix USERDATA not copied when trails started ([GH-93595](https://github.com/godotengine/godot/pull/93595)). #### Physics -- Add ability to get face index and barycentric coordinates from raycast ([GH-71233](https://github.com/godotengine/godot/pull/71233)). -- Add Mass Distribution, Deactivation, Solver inspector property groups ([GH-77943](https://github.com/godotengine/godot/pull/77943)). -- Correctly set mass for a rigid body with custom inertia and center of mass ([GH-78757](https://github.com/godotengine/godot/pull/78757)). -- Add `hit_back_faces` property to `RayCast3D` ([GH-79330](https://github.com/godotengine/godot/pull/79330)). -- Add state sync after call to `_integrate_forces` in `_body_state_changed` ([GH-79977](https://github.com/godotengine/godot/pull/79977)). -- Fix unit suffix for `HingeJoint3D`'s target velocity ([GH-80523](https://github.com/godotengine/godot/pull/80523)). -- Fix gizmo for `BoxShape3D` ([GH-80689](https://github.com/godotengine/godot/pull/80689)). -- Expose the `get_rid` method of Joint2D and Joint3D ([GH-80736](https://github.com/godotengine/godot/pull/80736)). -- Fix possible crash when Control overrides mouse input on Area2D ([GH-81006](https://github.com/godotengine/godot/pull/81006)). -- Update PinJoint2D API with angle limits and motor speed ([GH-81610](https://github.com/godotengine/godot/pull/81610)). -- Fix missing clear for some `set_exclude*` query parameter methods ([GH-82043](https://github.com/godotengine/godot/pull/82043)). -- Fix performance regression in RigidBody2D/3D and PhysicalBone3D ([GH-82393](https://github.com/godotengine/godot/pull/82393)). -- Fix not refitting upward from leaf nodes ([GH-82482](https://github.com/godotengine/godot/pull/82482)). -- Tweak Gravity Scale property hints to make dragging more useful ([GH-82634](https://github.com/godotengine/godot/pull/82634)). -- Allow TileMap physics/navigation to still work when hidden ([GH-83560](https://github.com/godotengine/godot/pull/83560)). -- Fix unit suffixes for `Generic6DOFJoint` ([GH-83672](https://github.com/godotengine/godot/pull/83672)). -- Ensure SoftBody3D does not use compressed mesh format ([GH-84165](https://github.com/godotengine/godot/pull/84165)). -- Fix rotated tile collision not working at runtime ([GH-84261](https://github.com/godotengine/godot/pull/84261)). -- Fix transform changes in `_integrate_forces` being overwritten ([GH-84799](https://github.com/godotengine/godot/pull/84799)). -- Fix transform sync in `RigidBody*D::_body_state_changed` ([GH-84924](https://github.com/godotengine/godot/pull/84924)). -- Update tilemap physics' World2D on reparenting ([GH-84968](https://github.com/godotengine/godot/pull/84968)). +- Disable registering 3D physics types when 3D is disabled ([GH-79185](https://github.com/godotengine/godot/pull/79185)). +- Prevent mapping areas with invalid IDs for `Area2D/3D` ([GH-79460](https://github.com/godotengine/godot/pull/79460)). +- Clear monitoring in `Area*` when its space changes to invalid ([GH-81809](https://github.com/godotengine/godot/pull/81809)). +- Change ShapeCast3D and RayCast3D debug to use RenderingServer directly ([GH-82599](https://github.com/godotengine/godot/pull/82599)). +- Orthonormalize PhysicalBone3D transforms when resetting them ([GH-82933](https://github.com/godotengine/godot/pull/82933)). +- Fix body leaving area gravity influence ([GH-82961](https://github.com/godotengine/godot/pull/82961)). +- Replace confusing code in `GodotCapsuleShape2D::get_supports` ([GH-83655](https://github.com/godotengine/godot/pull/83655)). +- Fix CollisionObject3D Gizmo not updated after calling `shape_owner_*` functions ([GH-84610](https://github.com/godotengine/godot/pull/84610)). +- Expose a method to get gravity for any physics body ([GH-84640](https://github.com/godotengine/godot/pull/84640)). +- Fix `PhysicsShapeQueryParameters3D.motion` type wrongly set to Vector2 ([GH-85393](https://github.com/godotengine/godot/pull/85393)). +- Improve visualization of WorldBoundary2D editor ([GH-86208](https://github.com/godotengine/godot/pull/86208)). +- Check skeleton RID when using cached AABB ([GH-86245](https://github.com/godotengine/godot/pull/86245)). +- Add warning for using concave shape on CharacterBody3D ([GH-86576](https://github.com/godotengine/godot/pull/86576)). +- Fix bounding boxes not being calculated properly and not respecting top-level nodes ([GH-87132](https://github.com/godotengine/godot/pull/87132)). +- Make CharacterBody properties public ([GH-87167](https://github.com/godotengine/godot/pull/87167)). +- RayCast2D and RayCast3D: warn to check `is_colliding` before `get_collision_point` and `get_collision_normal` ([GH-87414](https://github.com/godotengine/godot/pull/87414)). +- Bind physics server methods related to `SoftBody3D` ([GH-87502](https://github.com/godotengine/godot/pull/87502)). +- Fix error when pinning soft body point without attachment ([GH-87506](https://github.com/godotengine/godot/pull/87506)). +- Add HeightMapShape3D functions to get min / max height ([GH-87881](https://github.com/godotengine/godot/pull/87881)). +- Add HeightMapShape3D update with Image data ([GH-87889](https://github.com/godotengine/godot/pull/87889)). +- Fix `max_collisions` not being passed in `PhysicsBody3D::test_move` ([GH-87903](https://github.com/godotengine/godot/pull/87903)). +- Fix crash with `PhysicsBody2D/3D::get_gravity` with invalid state ([GH-87976](https://github.com/godotengine/godot/pull/87976)). +- Fix `get_contact_count` sometimes being incorrect in `_process` ([GH-88019](https://github.com/godotengine/godot/pull/88019)). +- `GodotCollisionSolver2D::solve_concave`: Fix culling in case of motion ([GH-88282](https://github.com/godotengine/godot/pull/88282)). +- Fix `SoftBody3D` for double-precision builds ([GH-88402](https://github.com/godotengine/godot/pull/88402)). +- Physics interpolation (2D) ([GH-88424](https://github.com/godotengine/godot/pull/88424)). +- Split monolithic physics class files ([GH-88862](https://github.com/godotengine/godot/pull/88862)). +- Fix physics platform crash ([GH-88947](https://github.com/godotengine/godot/pull/88947)). +- Move Max Contacts Reported below Contact Monitor in RigidBody inspector ([GH-89459](https://github.com/godotengine/godot/pull/89459)). +- Increase precision of RigidBody `mass` property ([GH-89468](https://github.com/godotengine/godot/pull/89468)). +- Allow for 32 max collisions in `test_body_motion` ([GH-89517](https://github.com/godotengine/godot/pull/89517)). +- Fix concave `CollisionPolygon2D` debug drawing and docs ([GH-89820](https://github.com/godotengine/godot/pull/89820)). +- Fix separating axes for 3D cylinder-face collisions ([GH-89960](https://github.com/godotengine/godot/pull/89960)). +- Make physics debug respect shape outline setting inside editor ([GH-90113](https://github.com/godotengine/godot/pull/90113)). +- Specify that `get_floor_normal()` does not return the surface normal ([GH-90254](https://github.com/godotengine/godot/pull/90254)). +- Fix PinJoint2D deferred call error ([GH-90340](https://github.com/godotengine/godot/pull/90340)). +- GridMap: Fix `physics_material` property ([GH-90503](https://github.com/godotengine/godot/pull/90503)). +- Store `ObjectID` instead of pointer for KinematicCollision owner ([GH-90668](https://github.com/godotengine/godot/pull/90668)). +- Increase size of WorldBoundaryShape to be much larger ([GH-90763](https://github.com/godotengine/godot/pull/90763)). +- Fix `move_and_slide` wall slide acceleration (3D) ([GH-90915](https://github.com/godotengine/godot/pull/90915)). +- Use same colors for editor and running project for collision/path debug ([GH-90966](https://github.com/godotengine/godot/pull/90966)). +- Deprecate unused parameter `angular_limit/softness` in `HingeJoint3D` ([GH-91127](https://github.com/godotengine/godot/pull/91127)). +- Update `body_create` description in PhysicsServer2D/3D ([GH-91596](https://github.com/godotengine/godot/pull/91596)). +- Add useful error msg in `GodotSoftBody3D::set_mesh` ([GH-91896](https://github.com/godotengine/godot/pull/91896)). +- Avoid duplicate connect in Joint2D and Joint3D `_update_joint` ([GH-91936](https://github.com/godotengine/godot/pull/91936)). +- Bind shape margin methods for `PhysicsServer3D` ([GH-92110](https://github.com/godotengine/godot/pull/92110)). +- GodotPhysics: Fix crash on null space ([GH-93286](https://github.com/godotengine/godot/pull/93286)). +- Fix physics tick counter ([GH-94039](https://github.com/godotengine/godot/pull/94039)). +- Only print physics sync warning on dev builds to avoid warning spam from using `move_and_slide` ([GH-94279](https://github.com/godotengine/godot/pull/94279)). +- Fix dynamic-stack-buffer-overflow crash when executing random functions on random physics objects ([GH-94521](https://github.com/godotengine/godot/pull/94521)). +- Bind `PhysicsServer*D::body_set_state_sync_callback` ([GH-94653](https://github.com/godotengine/godot/pull/94653)). #### Plugin -- Add `_get_unsaved_status()` method to EditorPlugin and implement it for script and shader editors ([GH-67503](https://github.com/godotengine/godot/pull/67503)). -- Expose editor viewports in EditorInterface ([GH-68696](https://github.com/godotengine/godot/pull/68696)). -- Allow changing feature profile via `EditorInterface` ([GH-74382](https://github.com/godotengine/godot/pull/74382)). -- Fix Camera2D is not working inside a MainScreenEditorPlugin ([GH-79867](https://github.com/godotengine/godot/pull/79867)). -- Keep `_export_begin()`'s `path` argument always consistent ([GH-81016](https://github.com/godotengine/godot/pull/81016)). -- Relax restriction on loading v1 Android plugins on Godot 4.2+ ([GH-81368](https://github.com/godotengine/godot/pull/81368)). -- Cleanups and improvements to the Godot Android library api ([GH-82893](https://github.com/godotengine/godot/pull/82893)). -- Editor: Fix `remove_control_from_dock` fails when dock is floating ([GH-83512](https://github.com/godotengine/godot/pull/83512)). +- Use existing `plugin.cfg` in configuration dialog ([GH-79723](https://github.com/godotengine/godot/pull/79723)). +- Expose `SceneTreeDialog` and `PropertySelector` via `EditorInterface` ([GH-81655](https://github.com/godotengine/godot/pull/81655)). +- Fix creating and updating plugin with dot in folder name ([GH-83329](https://github.com/godotengine/godot/pull/83329)). +- Correctly check scripts that must inherit `EditorPlugin` ([GH-85271](https://github.com/godotengine/godot/pull/85271)). +- Save external data even without scene ([GH-85513](https://github.com/godotengine/godot/pull/85513)). +- Always call `_can_handle()` before `_parse_property()` ([GH-86467](https://github.com/godotengine/godot/pull/86467)). +- Editor: Add `EditorPlugin::scene_saved` signal ([GH-87332](https://github.com/godotengine/godot/pull/87332)). +- Editor: Fix `_parse_category()` is not called for custom categories ([GH-87915](https://github.com/godotengine/godot/pull/87915)). +- Improve Project Settings' Plugin display ([GH-88308](https://github.com/godotengine/godot/pull/88308)). +- Update scene tabs after marking as unsaved ([GH-90135](https://github.com/godotengine/godot/pull/90135)). +- Fix `add_root_node()` being no-op ([GH-90136](https://github.com/godotengine/godot/pull/90136)). +- Expose `EditorFileDialog::popup_file_dialog()` to GDScript and GDExtension ([GH-91331](https://github.com/godotengine/godot/pull/91331)). +- Add logic to unregister the Godot plugins on engine termination ([GH-92143](https://github.com/godotengine/godot/pull/92143)). +- Prevent static XCFramework bundles from being embedded on iOS ([GH-92519](https://github.com/godotengine/godot/pull/92519)). #### Porting -- [macOS, sandbox] Implement optional native file selection dialog support for sandboxed apps ([GH-47499](https://github.com/godotengine/godot/pull/47499)). -- Add `clipboard_has/get_image` methods to DisplayServer ([GH-63826](https://github.com/godotengine/godot/pull/63826)). -- Refactor Godot Android architecture ([GH-76821](https://github.com/godotengine/godot/pull/76821)). -- Windows: Flash both the window caption and taskbar button on `request_attention` ([GH-78263](https://github.com/godotengine/godot/pull/78263)). -- Add error checks and harmonize behavior of the `set_icon` method ([GH-78437](https://github.com/godotengine/godot/pull/78437)). -- Fix formatting of dlopen error message on Windows ([GH-78802](https://github.com/godotengine/godot/pull/78802)). -- macOS: Fix `set_native_icon` crash with empty or invalid ICNS file ([GH-79010](https://github.com/godotengine/godot/pull/79010)). -- Windows: Fix setting initial non-exclusive window mode ([GH-79016](https://github.com/godotengine/godot/pull/79016)). -- [macOS/iOS] Set MoltenVK logging level based on `--verbose` flag ([GH-79061](https://github.com/godotengine/godot/pull/79061)). -- Fix the fallback logic of `OS::shell_show_in_file_manager` ([GH-79087](https://github.com/godotengine/godot/pull/79087)). -- Avoid freeze when interacting with menus on Wayland by re-aquiring next swapchain image after updating swapchain ([GH-79143](https://github.com/godotengine/godot/pull/79143)). -- Fix Linux `move_to_trash` wrongly reporting files as not found ([GH-79284](https://github.com/godotengine/godot/pull/79284)). -- Fix `ProjectSettings::localize_path` for Windows paths ([GH-79342](https://github.com/godotengine/godot/pull/79342)). -- Windows: Implement native file selection dialog support ([GH-79574](https://github.com/godotengine/godot/pull/79574)). -- Fix NullPointerException when registering the sensors ([GH-79681](https://github.com/godotengine/godot/pull/79681)). -- Windows: Initialize COM as apartment-threaded ([GH-79693](https://github.com/godotengine/godot/pull/79693)). -- Add `proxy_to_pthread` option to `platform=web` ([GH-79711](https://github.com/godotengine/godot/pull/79711)). -- Fix file permissions for the web platform (affects every Unix-like platform) ([GH-79866](https://github.com/godotengine/godot/pull/79866)). -- Use EWMH for `DisplayServerX11::_window_minimize_check()` implementation ([GH-80036](https://github.com/godotengine/godot/pull/80036)). -- Web: Update npm packages ([GH-80092](https://github.com/godotengine/godot/pull/80092)). -- [Linux/Freedesktop] Implement native file selection dialog support ([GH-80104](https://github.com/godotengine/godot/pull/80104)). -- Windows: Do not force redraw window background on mouse pass-through region change ([GH-80153](https://github.com/godotengine/godot/pull/80153)). -- X11: Do not fail DisplayServer init if non-essential extensions are missing ([GH-80240](https://github.com/godotengine/godot/pull/80240)). -- Track hovered `Window` in `DisplayServerX11` ([GH-80279](https://github.com/godotengine/godot/pull/80279)). -- FileAccess: Add methods to get/set "hidden" and "read-only" attributes on macOS/BSD and Windows ([GH-80404](https://github.com/godotengine/godot/pull/80404)). -- DisplayServer: Add method to estimate window title bar size ([GH-80409](https://github.com/godotengine/godot/pull/80409)). -- macOS: Fix missing mouse exit events on window close ([GH-80439](https://github.com/godotengine/godot/pull/80439)). -- Android: Change the default "org.godotengine" package name to "com.example" ([GH-80761](https://github.com/godotengine/godot/pull/80761)). -- [Native File Dialogs] Refocus last focused window on close ([GH-80952](https://github.com/godotengine/godot/pull/80952)). -- Make Windows' safe save more resilient ([GH-81001](https://github.com/godotengine/godot/pull/81001)). -- Fix JavaScript callback memory leak issue ([GH-81105](https://github.com/godotengine/godot/pull/81105)). -- [Native File Dialogs] Improve filter list handling, add selected filter to the callback ([GH-81218](https://github.com/godotengine/godot/pull/81218)). -- macOS: Fix live resize with the latest MoltenVK version ([GH-81339](https://github.com/godotengine/godot/pull/81339)). -- Implement `clipboard_get`/`has_image` for X11 ([GH-81439](https://github.com/godotengine/godot/pull/81439)). -- Web: Disable raycast module by default (no occlusion culling) ([GH-81716](https://github.com/godotengine/godot/pull/81716)). -- Windows: Use clear color for non exclusive fullscreen border, fix maximize for borderless window switching to exclusive fs ([GH-82031](https://github.com/godotengine/godot/pull/82031)). -- macOS: Enforce non-zero window size ([GH-82037](https://github.com/godotengine/godot/pull/82037)). -- X11: Add support for using EGL/GLES instead of GLX ([GH-82101](https://github.com/godotengine/godot/pull/82101)). -- Support dark mode on Android and iOS ([GH-82230](https://github.com/godotengine/godot/pull/82230)). -- macOS: Fix borderless mode on macOS 13.6+ ([GH-82357](https://github.com/godotengine/godot/pull/82357)). -- macOS: Check all exclusive fullscreen windows before setting presentation mode ([GH-82423](https://github.com/godotengine/godot/pull/82423)). -- Web: Clarify that `OS.get_unique_id` is not supported ([GH-82441](https://github.com/godotengine/godot/pull/82441)). -- Fix `godot_js_wrapper_create_cb` regression ([GH-82736](https://github.com/godotengine/godot/pull/82736)). -- macOS: Fix ambiguous method call with older SDKs ([GH-82876](https://github.com/godotengine/godot/pull/82876)). -- Add method to check if filesystem is case sensitive ([GH-82957](https://github.com/godotengine/godot/pull/82957)). -- macOS: Use occlusionState instead of isOnActiveSpace to determine when window is drawable ([GH-83096](https://github.com/godotengine/godot/pull/83096)). -- Web: Improve Emscripten `locateFile` glue ([GH-83165](https://github.com/godotengine/godot/pull/83165)). -- Add error messages to the native menu and file dialogs callback ([GH-83181](https://github.com/godotengine/godot/pull/83181)). -- macOS: Fix crash when using system default menu shortcuts ([GH-83243](https://github.com/godotengine/godot/pull/83243)). -- Linux: Implement `DirAccess.is_case_sensitive` for EXT4 and F2FS ([GH-83266](https://github.com/godotengine/godot/pull/83266)). -- Improve X11 `screen_get_refresh_rate` performance ([GH-83902](https://github.com/godotengine/godot/pull/83902)). -- Add support for EGL 1.4 ([GH-83930](https://github.com/godotengine/godot/pull/83930)). -- Update the `launchMode` for the `GodotApp` activity ([GH-83954](https://github.com/godotengine/godot/pull/83954)). -- Fix freeze when requesting clipboard image from our own window ([GH-83970](https://github.com/godotengine/godot/pull/83970)). -- Fix macOS and Windows build with statically linked ANGLE/EGL ([GH-83988](https://github.com/godotengine/godot/pull/83988)). -- TTS_Linux: Fix size_t template issue on OpenBSD by using int consistently ([GH-84017](https://github.com/godotengine/godot/pull/84017)). -- Fix retrieving command line flags in Android ([GH-84102](https://github.com/godotengine/godot/pull/84102)). -- Fix Android editor crash issue when pressing Back ([GH-84414](https://github.com/godotengine/godot/pull/84414)). -- Fix Android disabling splash screen Show Image ([GH-84491](https://github.com/godotengine/godot/pull/84491)). -- Fix bug where maximized->fullscreen->windowed mode stays maximized ([GH-84504](https://github.com/godotengine/godot/pull/84504)). -- X11: Add fallback from desktop GL to GLES, suppress PRIME detector error spam ([GH-84513](https://github.com/godotengine/godot/pull/84513)). -- macOS: Fix fullscreen <-> exclusive fullscreen transition ([GH-84649](https://github.com/godotengine/godot/pull/84649)). -- macOS: Fix transparent and borderless flags interaction with full-screen mode ([GH-84683](https://github.com/godotengine/godot/pull/84683)). -- macOS: Process events before changing title style to update window frame ([GH-84927](https://github.com/godotengine/godot/pull/84927)). -- Fix issue causing Godot Android apps / games to freeze on close ([GH-85454](https://github.com/godotengine/godot/pull/85454)). -- Fix an issue causing the running project window to loop-restart when closed ([GH-85457](https://github.com/godotengine/godot/pull/85457)). +- Windows: Enable crash reporter on MinGW builds ([GH-61006](https://github.com/godotengine/godot/pull/61006)). +- Windows: Improve warning for path casing ([GH-71975](https://github.com/godotengine/godot/pull/71975)). +- Implement support for application status indicators (tray icons) ([GH-80211](https://github.com/godotengine/godot/pull/80211)). +- macOS: Add support for native help menu search callbacks, integrate editor help ([GH-83819](https://github.com/godotengine/godot/pull/83819)). +- macOS: Add default Window and Help menus, allow special menu customization ([GH-83987](https://github.com/godotengine/godot/pull/83987)). +- Use platform-specific methods for FileAccess reading and writing ([GH-84107](https://github.com/godotengine/godot/pull/84107)). +- Windows: Use CCD API to get fractional screen refresh rates ([GH-84246](https://github.com/godotengine/godot/pull/84246)). +- Robustify handling of activation & focus on Windows ([GH-84363](https://github.com/godotengine/godot/pull/84363)). +- Fix NetBSD executable path ([GH-84469](https://github.com/godotengine/godot/pull/84469)). +- Make `screen_get_refresh_rate()` respect iOS Low Power Mode ([GH-85026](https://github.com/godotengine/godot/pull/85026)). +- Enhance mobile suspend MainLoop notifications ([GH-85100](https://github.com/godotengine/godot/pull/85100)). +- Windows: Fix NVIDIA app profile creation ([GH-85188](https://github.com/godotengine/godot/pull/85188)). +- Do not consume mouse messages in windows with `no_focus` on Windows OS ([GH-85484](https://github.com/godotengine/godot/pull/85484)). +- Add `THREADS_ENABLED` macro in order to compile Godot to run on the main thread ([GH-85939](https://github.com/godotengine/godot/pull/85939)). +- Android: Ensure cleanup of all subobjects in the OpenSL audio driver ([GH-85955](https://github.com/godotengine/godot/pull/85955)). +- X11: Partial fix for Editor and Project Manager stealing focus on some window managers ([GH-86101](https://github.com/godotengine/godot/pull/86101)). +- Fix key mapping for `XK_KP_Delete` key ([GH-86160](https://github.com/godotengine/godot/pull/86160)). +- Add Wayland support ([GH-86180](https://github.com/godotengine/godot/pull/86180)). +- Android: Update the logic used to start / stop the render thread ([GH-86379](https://github.com/godotengine/godot/pull/86379)). +- X11: Fix Godot stealing focus on alternative window managers ([GH-86441](https://github.com/godotengine/godot/pull/86441)). +- Fix `OS.get_system_font_path` and `OS.get_system_font_path_for_text` to return correct slashes ([GH-86552](https://github.com/godotengine/godot/pull/86552)). +- Fix virtual keyboard for decimal values on Android ([GH-86619](https://github.com/godotengine/godot/pull/86619)). +- X11: Don't re-set input focus if the given window already has it (fixes Godot stealing input focus on i3) ([GH-86671](https://github.com/godotengine/godot/pull/86671)). +- iOS: Set provisioning style for both `iPhone Developer` and `iPhone Distribution` to automatic ([GH-86748](https://github.com/godotengine/godot/pull/86748)). +- Fix `get_window_safe_area` on Android ([GH-86761](https://github.com/godotengine/godot/pull/86761)). +- Attempt parsing environment variables as UTF-8 ([GH-86936](https://github.com/godotengine/godot/pull/86936)). +- iOS: Improve logger ([GH-87077](https://github.com/godotengine/godot/pull/87077)). +- Android: Disable automatic permissions request ([GH-87080](https://github.com/godotengine/godot/pull/87080)). +- Fix DX12 build on older MSVC versions, fix missing PIX include ([GH-87206](https://github.com/godotengine/godot/pull/87206)). +- Use `os_unfair_lock` on Apple platforms ([GH-87393](https://github.com/godotengine/godot/pull/87393)). +- macOS: Update window visible state on deminiaturize ([GH-87465](https://github.com/godotengine/godot/pull/87465)). +- Make dark mode Title Bar work on Windows 10 1909 (build:18363) and above ([GH-87549](https://github.com/godotengine/godot/pull/87549)). +- Wayland: Suspend window after frame timeout or suspend state ([GH-87750](https://github.com/godotengine/godot/pull/87750)). +- Wayland: Implement `window_get_native_handle` ([GH-87764](https://github.com/godotengine/godot/pull/87764)). +- Wayland: Add support for native file dialogs ([GH-87776](https://github.com/godotengine/godot/pull/87776)). +- macOS: Use autorelease pools ([GH-87836](https://github.com/godotengine/godot/pull/87836)). +- macOS: Add SIGTRAP to the crash handler ([GH-87842](https://github.com/godotengine/godot/pull/87842)). +- Add workaround for emscripten >= 3.1.47 LTO build ([GH-87956](https://github.com/godotengine/godot/pull/87956)). +- wayland: Update to 1.22.0 ([GH-87977](https://github.com/godotengine/godot/pull/87977)). +- [macOS / iOS] Switch Vulkan init to `VK_EXT_metal_surface` extension ([GH-87999](https://github.com/godotengine/godot/pull/87999)). +- macOS: Enabled secure restorable state ([GH-88050](https://github.com/godotengine/godot/pull/88050)). +- Handle display driver preferences consistently between editor and projects ([GH-88065](https://github.com/godotengine/godot/pull/88065)). +- macOS: Allow `open_shell` to handle filenames without `file://` ([GH-88126](https://github.com/godotengine/godot/pull/88126)). +- Windows: Fix windows `is_path_invalid`, and apply it to directory creation ([GH-88129](https://github.com/godotengine/godot/pull/88129)). +- Fix invalid file path handling in Windows when there is dot in the file name ([GH-88144](https://github.com/godotengine/godot/pull/88144)). +- FileSystem dock: Fix opening a Linux terminal ([GH-88173](https://github.com/godotengine/godot/pull/88173)). +- Fix the fetching of images in `CF_DIB` format in `DisplayServerWindows::clipboard_get_image` ([GH-88220](https://github.com/godotengine/godot/pull/88220)). +- macOS: Fix color picker on HDR screens ([GH-88274](https://github.com/godotengine/godot/pull/88274)). +- Windows: Add support for enabling Alt+Space menu and fix borderless maximize ([GH-88329](https://github.com/godotengine/godot/pull/88329)). +- [Android 14] Fix GodotEditText white box showing during editor load ([GH-88351](https://github.com/godotengine/godot/pull/88351)). +- libdecor: Update to 0.2.2 ([GH-88374](https://github.com/godotengine/godot/pull/88374)). +- Windows: Fix reading non-BGRA8 DIBs from clipboard ([GH-88405](https://github.com/godotengine/godot/pull/88405)). +- macOS: Add null checks for `NSString stringWithUTF8String` ([GH-88694](https://github.com/godotengine/godot/pull/88694)). +- [macOS/Windows] Fix application indicator destruction ([GH-88932](https://github.com/godotengine/godot/pull/88932)). +- Windows: Implement `dialog_show` and `dialog_input_text` for `DisplayServer` ([GH-88957](https://github.com/godotengine/godot/pull/88957)). +- DisplayServer: Add error messages and descriptions to callbacks ([GH-89033](https://github.com/godotengine/godot/pull/89033)). +- Fix FileAccessUnix on OpenBSD where `UF_HIDDEN` isn't supported ([GH-89064](https://github.com/godotengine/godot/pull/89064)). +- Wayland: Fix tilt handling ([GH-89112](https://github.com/godotengine/godot/pull/89112)). +- Wayland: Properly report all used features ([GH-89178](https://github.com/godotengine/godot/pull/89178)). +- Check if DisplayServer supports icons before attempting setting it ([GH-89181](https://github.com/godotengine/godot/pull/89181)). +- Windows: Fix `FreeLibrary` not always being called in `DisplayServerWindows::dialog_show` ([GH-89192](https://github.com/godotengine/godot/pull/89192)). +- Implement pipe API for executed processes IO redirection ([GH-89206](https://github.com/godotengine/godot/pull/89206)). +- Add `PermissionsUtil#requestPermissions(...)` to provide the ability to request multiple permissions at a time ([GH-89260](https://github.com/godotengine/godot/pull/89260)). +- Wayland: Stop possible Null pointer dereferences ([GH-89307](https://github.com/godotengine/godot/pull/89307)). +- Wayland: Setup next cursor frame callback only if animated ([GH-89328](https://github.com/godotengine/godot/pull/89328)). +- Windows: Disable fallback to ANGLE logic when compiled w/o ANGLE support ([GH-89351](https://github.com/godotengine/godot/pull/89351)). +- Wayland: Workaround API limitation in screen/UI scale logic ([GH-89574](https://github.com/godotengine/godot/pull/89574)). +- iOS: Fix AirPods routing when Play and Record category is used ([GH-89594](https://github.com/godotengine/godot/pull/89594)). +- Fix platform name in the message about unsupported CPU architecture ([GH-89598](https://github.com/godotengine/godot/pull/89598)). +- Android: Fix UnsupportedOperationException remove from non-ArrayList ([GH-89703](https://github.com/godotengine/godot/pull/89703)). +- Wayland: Fix typo in input code ([GH-89707](https://github.com/godotengine/godot/pull/89707)). +- X11: Add more details to large icon size warning ([GH-89716](https://github.com/godotengine/godot/pull/89716)). +- Fix `EXIT_SUCCESS` on MacOS ([GH-89855](https://github.com/godotengine/godot/pull/89855)). +- Fix `EXIT_SUCCESS` on Android ([GH-89887](https://github.com/godotengine/godot/pull/89887)). +- DisplayServer: Add separate feature flags for different native dialog types ([GH-89907](https://github.com/godotengine/godot/pull/89907)). +- [Linux/Portal] Fix incorrect DBus connection usage ([GH-89935](https://github.com/godotengine/godot/pull/89935)). +- macOS: Fix non-global native menu shortcuts ([GH-89953](https://github.com/godotengine/godot/pull/89953)). +- Android: Prevent potential NPEs and improve nullability handling ([GH-89999](https://github.com/godotengine/godot/pull/89999)). +- Android: Improve performance of sensor readings ([GH-90000](https://github.com/godotengine/godot/pull/90000)). +- Fix issue with moving maximized window in macOS ([GH-90101](https://github.com/godotengine/godot/pull/90101)). +- Fix macOS menu bar & dock stop appearing after closing sub-window ([GH-90131](https://github.com/godotengine/godot/pull/90131)). +- Android: Extract parsing command line file to a separate class + add unit tests ([GH-90146](https://github.com/godotengine/godot/pull/90146)). +- Make sysctl calls on FreeBSD ([GH-90295](https://github.com/godotengine/godot/pull/90295)). +- Add `OS.get_process_exit_code()` method ([GH-90358](https://github.com/godotengine/godot/pull/90358)). +- FileAccess: Implement `resize` method ([GH-90403](https://github.com/godotengine/godot/pull/90403)). +- Fix the initialization order for the iOS driver ([GH-90538](https://github.com/godotengine/godot/pull/90538)). +- [Unix / DirAccess] Fix removing directory symlinks with `remove`, ensure `erase_contents_recursive` is not following directory symlinks ([GH-90562](https://github.com/godotengine/godot/pull/90562)). +- Fix leakage of JNI object references ([GH-90710](https://github.com/godotengine/godot/pull/90710)). +- macOS: Fix native file dialog with empty filter list ([GH-90783](https://github.com/godotengine/godot/pull/90783)). +- Cleanup Android file errors ([GH-91017](https://github.com/godotengine/godot/pull/91017)). +- iOS: Change default iPad landscape orientation from "left" to "right" ([GH-91052](https://github.com/godotengine/godot/pull/91052)). +- DBus: Process file dialog callback in the main event loop instead of using deferred call ([GH-91071](https://github.com/godotengine/godot/pull/91071)). +- Add symlink API support for Windows, expose symlink methods ([GH-91100](https://github.com/godotengine/godot/pull/91100)). +- Windows: Improve console IO redirection ([GH-91147](https://github.com/godotengine/godot/pull/91147)). +- Wayland: Improve compositor compatibility by allowing older globals ([GH-91196](https://github.com/godotengine/godot/pull/91196)). +- Wayland: Add support for OpenGL ES driver ([GH-91466](https://github.com/godotengine/godot/pull/91466)). +- DisplayServer: Add method to check if window transparency is supported and enabled ([GH-91505](https://github.com/godotengine/godot/pull/91505)). +- Switch to the WindowInsetsAnimationCompat api ([GH-91895](https://github.com/godotengine/godot/pull/91895)). +- X11: Fallback to root window size, when Xinerama extension is available, but return zero screens ([GH-91933](https://github.com/godotengine/godot/pull/91933)). +- Windows: Use CRLF in the terminal prints ([GH-92158](https://github.com/godotengine/godot/pull/92158)). +- Use `OS::delay_usec()` to avoid using deprecated `usleep()` on Linux ([GH-92208](https://github.com/godotengine/godot/pull/92208)). +- Properly set window class in Wayland ([GH-92252](https://github.com/godotengine/godot/pull/92252)). +- Wayland: Implement `is_window_transparency_available` ([GH-92353](https://github.com/godotengine/godot/pull/92353)). +- [macOS, X11] Fix duplicate window close requests ([GH-92458](https://github.com/godotengine/godot/pull/92458)). +- Fix -empty string- console log in web export (cosmetic) ([GH-92468](https://github.com/godotengine/godot/pull/92468)). +- Make displayed Web errors more meaningful ([GH-92553](https://github.com/godotengine/godot/pull/92553)). +- Android: Remove the limit on the number of the SignalInfo creation function parameters ([GH-92580](https://github.com/godotengine/godot/pull/92580)). +- EGL: Use `EGL_EXT_platform_base` whenever possible ([GH-92663](https://github.com/godotengine/godot/pull/92663)). +- Consolidate the ProjectManager and Editor windows into a single Android Activity class ([GH-92704](https://github.com/godotengine/godot/pull/92704)). +- Android: Fix invalid return value when multiple permission requests are dispatched ([GH-92709](https://github.com/godotengine/godot/pull/92709)). +- Improve native menu and status indicator icons conversion and checks ([GH-92826](https://github.com/godotengine/godot/pull/92826)). +- Update the Android splash screen logic ([GH-92965](https://github.com/godotengine/godot/pull/92965)). +- X11: Detect XWayland and disable screen capture support ([GH-93072](https://github.com/godotengine/godot/pull/93072)). +- Windows: Add Windows version and Wine checks for Windows 10+ dark mode API ([GH-93126](https://github.com/godotengine/godot/pull/93126)). +- Tweak warning messages related to V-Sync on OpenGL ([GH-93239](https://github.com/godotengine/godot/pull/93239)). +- Web: Fix checking for OpenGL extensions with Emscripten 3.1.51 and later ([GH-93560](https://github.com/godotengine/godot/pull/93560)). +- Prevent folder names with trailing periods from being used automatically ([GH-93564](https://github.com/godotengine/godot/pull/93564)). +- Fix text editor stealing focus from "Find in Files" dialog on X11 ([GH-93682](https://github.com/godotengine/godot/pull/93682)). +- Wayland: Minimize surface commits and limit them to the main thread ([GH-93684](https://github.com/godotengine/godot/pull/93684)). +- Windows: Restore to windowed mode using `SW_NORMAL` ([GH-93733](https://github.com/godotengine/godot/pull/93733)). +- Add `bigint` support on JS value conversion ([GH-93750](https://github.com/godotengine/godot/pull/93750)). +- Fix assignations to non-existing keys and clean-up Web audio library ([GH-93754](https://github.com/godotengine/godot/pull/93754)). +- Remove duplicate styling from editor ([GH-93902](https://github.com/godotengine/godot/pull/93902)). +- Fix preloading a zip in the web editor ([GH-93906](https://github.com/godotengine/godot/pull/93906)). +- Android: Fix crashes and ANRs reported by the Google Play Console ([GH-93933](https://github.com/godotengine/godot/pull/93933)). +- Fix caret can disappear from script editor on Windows ([GH-93976](https://github.com/godotengine/godot/pull/93976)). +- Windows: Fix build error due to missing definition of Texture2D ([GH-94067](https://github.com/godotengine/godot/pull/94067)). +- Windows: Fix reading keyboard layout names ([GH-94120](https://github.com/godotengine/godot/pull/94120)). +- Remove unused `is_wow64` method in `OS_Windows` ([GH-94187](https://github.com/godotengine/godot/pull/94187)). +- macOS: Fix drag-and-drop feedback ([GH-94232](https://github.com/godotengine/godot/pull/94232)). +- Windows: Fix wrong initial size passed to rendering driver ([GH-94398](https://github.com/godotengine/godot/pull/94398)). +- Wayland: Commit surface on window creation ([GH-94402](https://github.com/godotengine/godot/pull/94402)). +- Wayland: Check for suspended flag when unsuspending ([GH-94411](https://github.com/godotengine/godot/pull/94411)). +- Windows: Update ANGLE surface size when window is resized ([GH-94428](https://github.com/godotengine/godot/pull/94428)). +- [Android Editor] Resolve issues with the editor touchscreen settings ([GH-94468](https://github.com/godotengine/godot/pull/94468)). +- Linux/X11: Fix memory leak from created screen images ([GH-94473](https://github.com/godotengine/godot/pull/94473)). +- Wayland: Fix error spam when interacting with decorations ([GH-94557](https://github.com/godotengine/godot/pull/94557)). +- Disable FP contraction ([GH-94655](https://github.com/godotengine/godot/pull/94655)). +- Fix the cleanup logic for the Android render thread ([GH-94661](https://github.com/godotengine/godot/pull/94661)). +- Pass window exclusive and transient properties for subwindow creation ([GH-94706](https://github.com/godotengine/godot/pull/94706)). +- Fix crash that occurs on termination of the Godot engine on Android ([GH-94923](https://github.com/godotengine/godot/pull/94923)). +- Windows: Improve OpenGL/ANGLE switching on ARM64 ([GH-94943](https://github.com/godotengine/godot/pull/94943)). +- Add missing null check before disconnecting source ([GH-94958](https://github.com/godotengine/godot/pull/94958)). +- macOS: Fix `is_process_running` and `kill` for bundled apps ([GH-94978](https://github.com/godotengine/godot/pull/94978)). +- macOS: Attempt to terminate process normally before using `forceTerminate` ([GH-95191](https://github.com/godotengine/godot/pull/95191)). +- macOS: Load `OpenGL.framework` by path to avoid issues with non-Latin executable names ([GH-95235](https://github.com/godotengine/godot/pull/95235)). +- macOS: Remove kill override ([GH-95295](https://github.com/godotengine/godot/pull/95295)). +- Wayland: Avoid recreating input objects on capability change ([GH-95331](https://github.com/godotengine/godot/pull/95331)). +- macOS: Fix wrong object type in joypad queue ([GH-95425](https://github.com/godotengine/godot/pull/95425)). +- DisplayServerWindows: Fix logic when creating with transient parent ([GH-95526](https://github.com/godotengine/godot/pull/95526)). #### Rendering -- Fix directional LightmapGI being too dark with static lights ([GH-61910](https://github.com/godotengine/godot/pull/61910)). -- [macOS/Windows] Add optional ANGLE backed OpenGL renderer support (runtime backend selection) ([GH-72831](https://github.com/godotengine/godot/pull/72831)). -- Abort on startup with a visible alert if required Vulkan features are missing ([GH-73999](https://github.com/godotengine/godot/pull/73999)). -- Add content scale stretch modes, implement integer scaling ([GH-75784](https://github.com/godotengine/godot/pull/75784)). -- Draw frustum splices on top of direction shadow atlas for debug purposes ([GH-77085](https://github.com/godotengine/godot/pull/77085)). -- Split raster barrier into vertex and fragment barrier ([GH-77420](https://github.com/godotengine/godot/pull/77420)). -- Implement 3D shadows in the GL Compatibility renderer ([GH-77496](https://github.com/godotengine/godot/pull/77496)). -- Replace sampler arrays with constant sampler elements, simplify and reuse code for all shaders ([GH-77740](https://github.com/godotengine/godot/pull/77740)). -- Add support for GLSL source-level debugging with RenderDoc ([GH-77975](https://github.com/godotengine/godot/pull/77975)). -- Use Gaussian approximation for backbuffer mipmaps in GL Compatibility renderer ([GH-78168](https://github.com/godotengine/godot/pull/78168)). -- Clear specular buffer if sky mode is canvas and screen space effects are used ([GH-78624](https://github.com/godotengine/godot/pull/78624)). -- Fix threading bug in Vulkan rendering device ([GH-78794](https://github.com/godotengine/godot/pull/78794)). -- Fix sanitizers reports about octahedral tangents in RenderingServer ([GH-78902](https://github.com/godotengine/godot/pull/78902)). -- Take eye offset into account for depth in StandardMaterial3D ([GH-79049](https://github.com/godotengine/godot/pull/79049)). -- Expose RenderSceneBuffers(RD) through ClassDB ([GH-79142](https://github.com/godotengine/godot/pull/79142)). -- Clear the previously set state when configuring for a new scene root node ([GH-79201](https://github.com/godotengine/godot/pull/79201)). -- Add custom texture create function ([GH-79288](https://github.com/godotengine/godot/pull/79288)). -- Fix missing `_THREAD_SAFE_METHOD_` missing from `RenderingDeviceVulkan` `submit` and `sync` ([GH-79526](https://github.com/godotengine/godot/pull/79526)). -- Fix crash when calling `get_video_adapter_*` in a thread ([GH-79528](https://github.com/godotengine/godot/pull/79528)). -- GLES3: Reset anisotropic filtering when changing texture filtering mode ([GH-79568](https://github.com/godotengine/godot/pull/79568)). -- Fix bad LOD selection when Camera in Mesh AABB ([GH-79590](https://github.com/godotengine/godot/pull/79590)). -- Fix instance uniform data buffer update delay ([GH-79603](https://github.com/godotengine/godot/pull/79603)). -- ShaderRD compilation groups ([GH-79606](https://github.com/godotengine/godot/pull/79606)). -- Revert the change of the limit for interpolation of F0 for dielectrics and metals for Screen Space Reflections ([GH-79624](https://github.com/godotengine/godot/pull/79624)). -- Fix GLES3 multimesh rendering when using colors or custom data ([GH-79660](https://github.com/godotengine/godot/pull/79660)). -- GLES3: Don't call `glTexParameter*` for invalid filter and repeat modes ([GH-79685](https://github.com/godotengine/godot/pull/79685)). -- Add ability to call code on rendering thread ([GH-79696](https://github.com/godotengine/godot/pull/79696)). -- Unbind the framebuffer when updating meshes ([GH-79772](https://github.com/godotengine/godot/pull/79772)). -- Mobile: Uncomment code required for fog rendering on clear color ([GH-79776](https://github.com/godotengine/godot/pull/79776)). -- Use defaults to initialize sky data in case of no sky ([GH-79812](https://github.com/godotengine/godot/pull/79812)). -- Fix Vulkan multithreaded compute list and GPU particle processing ([GH-79849](https://github.com/godotengine/godot/pull/79849)). -- Fix use of discard in shaders ([GH-79865](https://github.com/godotengine/godot/pull/79865)). -- Lazily allocate RIDs for PlaceholderTextures to avoid allocating GPU resources unless used ([GH-79874](https://github.com/godotengine/godot/pull/79874)). -- Fix transparent viewport backgrounds with custom clear color ([GH-79876](https://github.com/godotengine/godot/pull/79876)). -- Check if shader cache directory is available before using cache ([GH-79883](https://github.com/godotengine/godot/pull/79883)). -- Vulkan: Fix dangling pointers in `_clean_up_swap_chain` ([GH-79884](https://github.com/godotengine/godot/pull/79884)). -- Add exceptions for breakage introduced in RD barriers ([GH-79911](https://github.com/godotengine/godot/pull/79911)). -- Make Fresnel darken SSR instead of blending with specular ([GH-79921](https://github.com/godotengine/godot/pull/79921)). -- Initialize MSDF parameters in BaseMaterial3D with default ([GH-79983](https://github.com/godotengine/godot/pull/79983)). -- Fix uninitialized variable ending up sent to Vulkan ([GH-80034](https://github.com/godotengine/godot/pull/80034)). -- Enable depth writes during shadow pass and depth pass. Disable during color pass ([GH-80070](https://github.com/godotengine/godot/pull/80070)). -- Fix validation layer warnings ([GH-80071](https://github.com/godotengine/godot/pull/80071)). -- Fix GLES3 changing 2D shadow atlas size is broken ([GH-80151](https://github.com/godotengine/godot/pull/80151)). -- Add option to enable HDR rendering in 2D ([GH-80215](https://github.com/godotengine/godot/pull/80215)). -- Initialize shader placeholders up front ([GH-80222](https://github.com/godotengine/godot/pull/80222)). -- Fix motion vectors being corrupted when using `precision=double` ([GH-80257](https://github.com/godotengine/godot/pull/80257)). -- Vulkan: Fix sanitizers error with empty shader name ([GH-80288](https://github.com/godotengine/godot/pull/80288)). -- Enhance Vulkan PSO caching ([GH-80296](https://github.com/godotengine/godot/pull/80296)). -- Use fullscreen tri instead of quad ([GH-80311](https://github.com/godotengine/godot/pull/80311)). -- Fix validation error when enabling SSIL alone ([GH-80315](https://github.com/godotengine/godot/pull/80315)). -- Ensure `POINT_SIZE` takes effect in the canvas item shader ([GH-80323](https://github.com/godotengine/godot/pull/80323)). -- Fix integer underflow when rounding up in VoxelGI ([GH-80356](https://github.com/godotengine/godot/pull/80356)). -- Fix issue with four subpasses always been requested in mobile renderer ([GH-80368](https://github.com/godotengine/godot/pull/80368)). -- Remove GPU readback from `NoiseTexture3D.get_format()` ([GH-80407](https://github.com/godotengine/godot/pull/80407)). -- Improve handling of motion vectors for multimesh instances ([GH-80414](https://github.com/godotengine/godot/pull/80414)). -- Add `buffer_copy` method to RenderingDevice ([GH-80424](https://github.com/godotengine/godot/pull/80424)). -- Clamp Volumetric Fog Length property to prevent rendering issues ([GH-80485](https://github.com/godotengine/godot/pull/80485)). -- Fix tonemapper, incorrect vertex count was specified ([GH-80502](https://github.com/godotengine/godot/pull/80502)). -- Fix critical regressions introduced in PR #80414 ([GH-80552](https://github.com/godotengine/godot/pull/80552)). -- Fix validation error when resizing window ([GH-80571](https://github.com/godotengine/godot/pull/80571)). -- Add motion vector support for animated surfaces ([GH-80618](https://github.com/godotengine/godot/pull/80618)). -- Fallback to linear color texture when using 2D HDR and MSDF font ([GH-80651](https://github.com/godotengine/godot/pull/80651)). -- Fix global shader uniform texture loading ([GH-80654](https://github.com/godotengine/godot/pull/80654)). -- Improve visual feedback when using the motion vectors debug view option ([GH-80723](https://github.com/godotengine/godot/pull/80723)). -- Fix Vulkan texture update ([GH-80781](https://github.com/godotengine/godot/pull/80781)). -- Fix memory access error for `MultiMesh` with GLES3 ([GH-80788](https://github.com/godotengine/godot/pull/80788)). -- Fix Vulkan crash with many Omni/SpotLights, Decals or ReflectionProbes ([GH-80845](https://github.com/godotengine/godot/pull/80845)). -- Implement OpenXR Foveated rendering support ([GH-80881](https://github.com/godotengine/godot/pull/80881)). -- Clear SDFGI textures when created ([GH-80889](https://github.com/godotengine/godot/pull/80889)). -- Fix integer value for `GL_MAX_UNIFORM_BLOCK_SIZE` overflowing ([GH-80909](https://github.com/godotengine/godot/pull/80909)). -- Fix missing decal mask in mobile renderer ([GH-80911](https://github.com/godotengine/godot/pull/80911)). -- Fix clear color on mobile renderer ([GH-80933](https://github.com/godotengine/godot/pull/80933)). -- Fix volumetric fog NaN values in textures from starting at a zero Vector2 ([GH-80992](https://github.com/godotengine/godot/pull/80992)). -- GLES3: Fix `glMapBufferRange` return null when `r_index + last_item_index > max_instance` ([GH-81036](https://github.com/godotengine/godot/pull/81036)). -- Fix missing `EARLY_FRAGMENT_TESTS_BIT` barrier flags ([GH-81059](https://github.com/godotengine/godot/pull/81059)). -- Fix VoxelGI CameraAttributes exposure normalization handling ([GH-81067](https://github.com/godotengine/godot/pull/81067)). -- Flip convention of motion vectors ([GH-81074](https://github.com/godotengine/godot/pull/81074)). -- Fixup special case of cluster render ([GH-81081](https://github.com/godotengine/godot/pull/81081)). -- Fix VoxelGI static light pairing ([GH-81124](https://github.com/godotengine/godot/pull/81124)). -- Vertex and attribute compression ([GH-81138](https://github.com/godotengine/godot/pull/81138)). -- Add render mode to use world coordinates in canvas item shader ([GH-81160](https://github.com/godotengine/godot/pull/81160)). -- Reset SDFGI when changing editor scene tabs ([GH-81167](https://github.com/godotengine/godot/pull/81167)). -- Add FidelityFX Super Resolution 2.2 (FSR 2.2.1) support ([GH-81197](https://github.com/godotengine/godot/pull/81197)). -- Add placeholder RID to GradientTexture1D ([GH-81198](https://github.com/godotengine/godot/pull/81198)). -- vulkan: Update all components to Vulkan SDK 1.3.261.1 ([GH-81219](https://github.com/godotengine/godot/pull/81219)). -- Windows: Fix not applying NVIDIA profile to new executables ([GH-81251](https://github.com/godotengine/godot/pull/81251)). -- Implement render mode `fog_disabled` and BaseMaterial3D setting Disable Fog ([GH-81286](https://github.com/godotengine/godot/pull/81286)). -- Use 16-bit index buffers instead of 32 when unnecessary ([GH-81288](https://github.com/godotengine/godot/pull/81288)). -- Fix `RDPipelineColorBlendState.attachments` setter ([GH-81333](https://github.com/godotengine/godot/pull/81333)). -- Fix mipmap bias behavior by refactoring how samplers are created by Material Storage ([GH-81350](https://github.com/godotengine/godot/pull/81350)). -- Fix clear color's alpha value will affects 2D editor in Compatibility mode ([GH-81395](https://github.com/godotengine/godot/pull/81395)). -- Propagate error correctly when max texture size for lightmaps is too small ([GH-81543](https://github.com/godotengine/godot/pull/81543)). -- Fix LightmapGI baking with GridMap ([GH-81545](https://github.com/godotengine/godot/pull/81545)). -- Fix GLES3 instanced rendering color and custom data defaults ([GH-81575](https://github.com/godotengine/godot/pull/81575)). -- Fix VoxelGI MultiMesh and CSG mesh baking ([GH-81616](https://github.com/godotengine/godot/pull/81616)). -- Improve GLES3 scene renderer compatibility with older devices ([GH-81650](https://github.com/godotengine/godot/pull/81650)). -- Replace OIDN denoiser in Lightmapper with a JNLM denoiser compute shader ([GH-81659](https://github.com/godotengine/godot/pull/81659)). -- Fix validation error when using pipeline cache control ([GH-81771](https://github.com/godotengine/godot/pull/81771)). -- Fix massive validation errors when enabling TAA + MSAA ([GH-81775](https://github.com/godotengine/godot/pull/81775)). -- Opt-in to Vulkan features we actually use ([GH-81827](https://github.com/godotengine/godot/pull/81827)). -- Add half-pixel offset to lightmapper rasterization ([GH-81872](https://github.com/godotengine/godot/pull/81872)). -- Polish a few things in Vulkan RD ([GH-81912](https://github.com/godotengine/godot/pull/81912)). -- Fix LightmapGI shading sometimes being unlit or black ([GH-81951](https://github.com/godotengine/godot/pull/81951)). -- Rewrite the GPU Lightmapper's indirect logic to match Godot 3.5's CPU Lightmapper ([GH-82068](https://github.com/godotengine/godot/pull/82068)). -- Fix ShaderGlobalsOverride property handling ([GH-82100](https://github.com/godotengine/godot/pull/82100)). -- Linux/OpenGL: Don't force vsync in the editor ([GH-82221](https://github.com/godotengine/godot/pull/82221)). -- Fix RaycastOcclusionCull World3D scenario memory leak ([GH-82291](https://github.com/godotengine/godot/pull/82291)). -- Optimizing glow behavior ([GH-82353](https://github.com/godotengine/godot/pull/82353)). -- Add device info to GLES3 shader cache key hash ([GH-82359](https://github.com/godotengine/godot/pull/82359)). -- ANGLE: Add fallback control options and defaults ([GH-82364](https://github.com/godotengine/godot/pull/82364)). -- Clamp ReflectionProbe Max Distance to 262,144 to fix rendering issues ([GH-82415](https://github.com/godotengine/godot/pull/82415)). -- Fix Decal clamping to positive values not being applied to RenderingServer ([GH-82416](https://github.com/godotengine/godot/pull/82416)). -- GLES3: Avoid freeing proxy textures clearing owner's data ([GH-82430](https://github.com/godotengine/godot/pull/82430)). -- Avoid trying to free null RIDs in FSR2 teardown ([GH-82445](https://github.com/godotengine/godot/pull/82445)). -- Fix mismatch between surface vertex array generation inside the function and the caller ([GH-82451](https://github.com/godotengine/godot/pull/82451)). -- Disable `lightmapper_rd` module in non-editor builds (and in Android editor) ([GH-82521](https://github.com/godotengine/godot/pull/82521)). -- Make the lightmapper not dilate before denoising ([GH-82533](https://github.com/godotengine/godot/pull/82533)). -- Use internal texture at internal resolution for calculating luminance (FSR2) ([GH-82534](https://github.com/godotengine/godot/pull/82534)). -- Fix cluster artifacts and negative light ([GH-82546](https://github.com/godotengine/godot/pull/82546)). -- Workaround crash due to null shader when running XR project with `--xr-mode` off ([GH-82679](https://github.com/godotengine/godot/pull/82679)). -- OpenXR: Properly skip frame render when the XR runtime is not yet ready ([GH-82752](https://github.com/godotengine/godot/pull/82752)). -- Forgot to add debanding to config object ([GH-82766](https://github.com/godotengine/godot/pull/82766)). -- Re-add optional OIDN denoise as an external executable ([GH-82832](https://github.com/godotengine/godot/pull/82832)). -- Fog shader: Fix undeclared identifier `global_variables` ([GH-82877](https://github.com/godotengine/godot/pull/82877)). -- Avoid default fallback material when using `world_vertex_coords` ([GH-82886](https://github.com/godotengine/godot/pull/82886)). -- Only perform modelview transform on tangent and binormal when vertex shader is in local space ([GH-82892](https://github.com/godotengine/godot/pull/82892)). -- Directional 2 Split Shadow stabilization fix ([GH-82974](https://github.com/godotengine/godot/pull/82974)). -- Fix VoxelGI bake memory leak ([GH-83035](https://github.com/godotengine/godot/pull/83035)). -- Fix `trace_ray()` function in the lightmapper missing hits with large triangles ([GH-83040](https://github.com/godotengine/godot/pull/83040)). -- Fix incorrect check in `_dict_to_surf` ([GH-83056](https://github.com/godotengine/godot/pull/83056)). -- Fix incorrect vertex data size calculation in `ImmediateMesh` ([GH-83100](https://github.com/godotengine/godot/pull/83100)). -- Fix compatibility shadow size not being initialized ([GH-83141](https://github.com/godotengine/godot/pull/83141)). -- Disable update spinner when debug redraw is active ([GH-83143](https://github.com/godotengine/godot/pull/83143)). -- Fix BaseMaterial3D update with certain material settings ([GH-83145](https://github.com/godotengine/godot/pull/83145)). -- Fix a few cases where surface format is still 32 bits ([GH-83169](https://github.com/godotengine/godot/pull/83169)). -- Sanitize tangents when creating mesh surfaces to avoid triggering the compressed mesh path in the shader ([GH-83179](https://github.com/godotengine/godot/pull/83179)). -- Add an extra backbuffer color texture that can be used when an upscaler is in use ([GH-83192](https://github.com/godotengine/godot/pull/83192)). -- Fix `TextureStorage` not assigning default scale ([GH-83199](https://github.com/godotengine/godot/pull/83199)). -- Cleanup instances of using uint32_t for mesh formats ([GH-83211](https://github.com/godotengine/godot/pull/83211)). -- Fix OpenGL directional shadow last split fading ([GH-83252](https://github.com/godotengine/godot/pull/83252)). -- Optimize lightmapper using triangle clusters on the acceleration structure ([GH-83284](https://github.com/godotengine/godot/pull/83284)). -- Fix disabling depth prepass break opaque materials ([GH-83371](https://github.com/godotengine/godot/pull/83371)). -- Fix Mobile renderer shader instance uniform access ([GH-83400](https://github.com/godotengine/godot/pull/83400)). -- Pass viewport size to shadow pass instead of using Vector2i(1,1) ([GH-83491](https://github.com/godotengine/godot/pull/83491)). -- Ensure that only visible paired lights are used ([GH-83493](https://github.com/godotengine/godot/pull/83493)). -- Bump version of Vulkan RD binary shader format ([GH-83563](https://github.com/godotengine/godot/pull/83563)). -- Fix shadow map debug visualization camera frustum index buffer size ([GH-83639](https://github.com/godotengine/godot/pull/83639)). -- Fixing incorrect normal map when using triplanar world mapping and mesh rotation ([GH-83658](https://github.com/godotengine/godot/pull/83658)). -- Some more fixes for compressed meshes ([GH-83704](https://github.com/godotengine/godot/pull/83704)). -- macOS: Fallback to native OpenGL renderer if ANGLE initialization failed ([GH-83753](https://github.com/godotengine/godot/pull/83753)). -- Fix `GPUParticles3D` on the Meta Quest 2 with OpenGL renderer ([GH-83756](https://github.com/godotengine/godot/pull/83756)). -- Add property hint for 2D shadow size project setting ([GH-83760](https://github.com/godotengine/godot/pull/83760)). -- Ensure `r_aabb` is always used when creating surfaces through the RenderingServer ([GH-83840](https://github.com/godotengine/godot/pull/83840)). -- Fix LightmapGI taking editor-only and sky-only lights into account ([GH-83861](https://github.com/godotengine/godot/pull/83861)). -- Add padding to normal attribute in Compatibility renderer to match the RD renderers ([GH-83906](https://github.com/godotengine/godot/pull/83906)). -- Fix reading shadow filter quality from project settings in compatibility ([GH-83998](https://github.com/godotengine/godot/pull/83998)). -- Fix crash when upgrading meshes from 3.x format ([GH-84047](https://github.com/godotengine/godot/pull/84047)). -- Fix multiple issues with UV compression ([GH-84159](https://github.com/godotengine/godot/pull/84159)). -- Parse OpenGL and Vulkan strings as UTF-8 ([GH-84197](https://github.com/godotengine/godot/pull/84197)). -- Overhaul the SurfaceUpgradeTool ([GH-84200](https://github.com/godotengine/godot/pull/84200)). -- Fix bug with alpha to coverage by enabling depth discard when using alpha to coverage ([GH-84211](https://github.com/godotengine/godot/pull/84211)). -- Fix cubemap downsampler logic ([GH-84223](https://github.com/godotengine/godot/pull/84223)). -- Fix WebXR on desktop emulator by resetting active texture unit ([GH-84267](https://github.com/godotengine/godot/pull/84267)). -- macOS: Improve ANGLE support detection ([GH-84288](https://github.com/godotengine/godot/pull/84288)). -- Use default samplers in base uniform set when rendering to reflection probes ([GH-84317](https://github.com/godotengine/godot/pull/84317)). -- Windows: Add some AMD GPUs to the OpenGL blocklist ([GH-84568](https://github.com/godotengine/godot/pull/84568)). -- Create tangent array if mesh created without tangents ([GH-84576](https://github.com/godotengine/godot/pull/84576)). -- Fix FogMaterial memory leak ([GH-84702](https://github.com/godotengine/godot/pull/84702)). -- GLES3: Protect against bogus `glGetShaderInfoLog` return values ([GH-84741](https://github.com/godotengine/godot/pull/84741)). -- GLES3: Ensure all ShaderData is properly initialized in `set_code` ([GH-84752](https://github.com/godotengine/godot/pull/84752)). -- Ensure optional CopyEffects variants are loaded last ([GH-84883](https://github.com/godotengine/godot/pull/84883)). -- Renderer Viewport correct `sizeof` usage ([GH-84952](https://github.com/godotengine/godot/pull/84952)). -- GLES3: Fix iOS Simulator by removing incorrect `system_fbo` overwrite ([GH-84955](https://github.com/godotengine/godot/pull/84955)). -- Ensure 2D MSAA resolve is performed when 3D content but no 2D content in scene ([GH-84957](https://github.com/godotengine/godot/pull/84957)). -- Prevent crash in `_nvapi_disable_threaded_optimization` when attached to renderdoc ([GH-85121](https://github.com/godotengine/godot/pull/85121)). -- Avoid division by zero in the fix surface compatibility routine ([GH-85138](https://github.com/godotengine/godot/pull/85138)). -- Fix potential double-close of draw command label ([GH-85147](https://github.com/godotengine/godot/pull/85147)). -- Enable non-multiview advanced shader group whenever advanced shaders are requested ([GH-85194](https://github.com/godotengine/godot/pull/85194)). +- Add `texel_scale` property to LightmapGI ([GH-64908](https://github.com/godotengine/godot/pull/64908)). +- Add Direct3D 12 rendering driver (Mesa NIR approach) ([GH-70315](https://github.com/godotengine/godot/pull/70315)). +- Make the rendering method dropdown also affect mobile if compatible ([GH-72461](https://github.com/godotengine/godot/pull/72461)). +- Fix shadows for billboarded Sprite3D's ([GH-72638](https://github.com/godotengine/godot/pull/72638)). +- Add option to bake a mesh from blend shape mix ([GH-76725](https://github.com/godotengine/godot/pull/76725)). +- Update Y-sort position of the first item in the sorted subtree ([GH-79452](https://github.com/godotengine/godot/pull/79452)). +- Implement hooks into renderer ([GH-80214](https://github.com/godotengine/godot/pull/80214)). +- Improve warning messages related to Vulkan pipeline cache ([GH-80232](https://github.com/godotengine/godot/pull/80232)). +- OpenGL: Implement 3D Texture support ([GH-80363](https://github.com/godotengine/godot/pull/80363)). +- Fix potential integer underflow in rounded up divisions ([GH-80390](https://github.com/godotengine/godot/pull/80390)). +- Improve split blending logic for Vulkan ([GH-82668](https://github.com/godotengine/godot/pull/82668)). +- Add thread guard for `force_draw` and update related documentation ([GH-82953](https://github.com/godotengine/godot/pull/82953)). +- Split `RenderingDevice` into API-agnostic and `RenderingDeviceDriver` parts ([GH-83452](https://github.com/godotengine/godot/pull/83452)). +- Fix buffer updates going to the wrong cmd buffer if barriers were 0 ([GH-83736](https://github.com/godotengine/godot/pull/83736)). +- Expose `energy_multiplier` to remaining SkyMaterials ([GH-83938](https://github.com/godotengine/godot/pull/83938)). +- Add 3D MSAA and scaling support to GLES3 ([GH-83976](https://github.com/godotengine/godot/pull/83976)). +- Merge passes in Vulkan mobile renderer ([GH-84169](https://github.com/godotengine/godot/pull/84169)). +- Fix bad parameter for `rendering_method` crashes Godot ([GH-84241](https://github.com/godotengine/godot/pull/84241)). +- Skip swapchain logic if there is nothing to present (Android OpenXR) ([GH-84244](https://github.com/godotengine/godot/pull/84244)). +- Add `shadows_disabled` macro in Compatibility renderer ([GH-84416](https://github.com/godotengine/godot/pull/84416)). +- Transform mesh's AABB to skeleton's space when calculating mesh's bounds ([GH-84451](https://github.com/godotengine/godot/pull/84451)). +- Fix Camera2D frame delay (port from 3.x) ([GH-84465](https://github.com/godotengine/godot/pull/84465)). +- Extend `CanvasItem::draw_circle()`, making it also draw unfilled circle ([GH-84472](https://github.com/godotengine/godot/pull/84472)). +- CanvasItem draw implement antialiasing for `circle`, `rect`, `multiline`, and `dashedline` ([GH-84523](https://github.com/godotengine/godot/pull/84523)). +- Use render pass uniform set to store viewport samplers ([GH-84637](https://github.com/godotengine/godot/pull/84637)). +- Add MSAA support for WebXR ([GH-84686](https://github.com/godotengine/godot/pull/84686)). +- Only copy the relevant portion of the screen when copying to backbuffer in Compatibility backend ([GH-84733](https://github.com/godotengine/godot/pull/84733)). +- Shadow volume culling and tighter shadow caster culling ([GH-84745](https://github.com/godotengine/godot/pull/84745)). +- Add optional depth fog to Environment ([GH-84792](https://github.com/godotengine/godot/pull/84792)). +- Vulkan: Fix incorrect access to the buffers on Android ([GH-84852](https://github.com/godotengine/godot/pull/84852)). +- Store ArrayMesh path in RenderingServer for use in error messages ([GH-84894](https://github.com/godotengine/godot/pull/84894)). +- Acyclic Command Graph for Rendering Device ([GH-84976](https://github.com/godotengine/godot/pull/84976)). +- Use vertex input mask for creating vertex arrays ([GH-85092](https://github.com/godotengine/godot/pull/85092)). +- OpenGL: Implement rendering of lightmaps ([GH-85120](https://github.com/godotengine/godot/pull/85120)). +- Remove GI methods in parentheses from light baking options ([GH-85219](https://github.com/godotengine/godot/pull/85219)). +- Fix typo in BaseMaterial3D conversion from 3.x SpatialMaterial ([GH-85269](https://github.com/godotengine/godot/pull/85269)). +- Force ANGLE on all pre GCN 4th gen. AMD/ATI GPUs ([GH-85273](https://github.com/godotengine/godot/pull/85273)). +- Add property change guards to Sprite2D, Sprite3D and AnimatedSprite2D ([GH-85311](https://github.com/godotengine/godot/pull/85311)). +- Fix invalid `frame` index when Sprite2D's `hframes` or `vframes` change ([GH-85317](https://github.com/godotengine/godot/pull/85317)). +- Use render method from OS instead of project settings in compositor RD ([GH-85387](https://github.com/godotengine/godot/pull/85387)). +- Avoid crashes when engine leaks canvas items and friends ([GH-85520](https://github.com/godotengine/godot/pull/85520)). +- Apply some low-hanging fruit optimizations to Vulkan RD ([GH-85532](https://github.com/godotengine/godot/pull/85532)). +- Add premult alpha blending to 3D (spatial) shaders ([GH-85609](https://github.com/godotengine/godot/pull/85609)). +- Add wireframe for compatibility mode ([GH-85621](https://github.com/godotengine/godot/pull/85621)). +- Set ReflectionProbe frame before mapping id in mobile renderer ([GH-85635](https://github.com/godotengine/godot/pull/85635)). +- Add a descriptive error message when creating a mesh surface from the wrong array type ([GH-85646](https://github.com/godotengine/godot/pull/85646)). +- GLES3: Skip batches with zero instance count while rendering canvas ([GH-85778](https://github.com/godotengine/godot/pull/85778)). +- macOS: Switch ANGLE backend to ANGLE over OpenGL, switch default compatibility renderer back to native ([GH-85785](https://github.com/godotengine/godot/pull/85785)). +- Expose `copy_effects` compute shader in Mobile backend ([GH-85793](https://github.com/godotengine/godot/pull/85793)). +- Implement render info counters for the 2D renderer ([GH-85811](https://github.com/godotengine/godot/pull/85811)). +- Fix CanvasOcclusionShaderRD format error with double precision build ([GH-85822](https://github.com/godotengine/godot/pull/85822)). +- Ensure that 2D meshes use a proper input mask ([GH-85972](https://github.com/godotengine/godot/pull/85972)). +- Windows: Always use ANGLE in ARM builds ([GH-86001](https://github.com/godotengine/godot/pull/86001)). +- Fix radiance for sky in GLES stereo rendering ([GH-86018](https://github.com/godotengine/godot/pull/86018)). +- Fix Volumetric Fog VoxelGI updates ([GH-86023](https://github.com/godotengine/godot/pull/86023)). +- Remove dead code from `DisplayServerWindows::window_set_size` ([GH-86029](https://github.com/godotengine/godot/pull/86029)). +- Add a reflection mask to the reflection probes ([GH-86073](https://github.com/godotengine/godot/pull/86073)). +- Jitter raster occlusion camera to reduce false positives ([GH-86121](https://github.com/godotengine/godot/pull/86121)). +- Reduce the number of samplers used by the scene shaders ([GH-86219](https://github.com/godotengine/godot/pull/86219)). +- Use best fit normals for storing screen space normals ([GH-86316](https://github.com/godotengine/godot/pull/86316)). +- Fix wrong error message when graphics pipeline creation fails ([GH-86405](https://github.com/godotengine/godot/pull/86405)). +- Add `RD_ENABLED` when `VULKAN_ENABLED` or `D3D12_ENABLED` is added ([GH-86435](https://github.com/godotengine/godot/pull/86435)). +- Fix MSVC 14.1 complaining about "attempting to reference a deleted function" in RenderPassClearValue ([GH-86507](https://github.com/godotengine/godot/pull/86507)). +- Fix incorrect `CAMERA_DIRECTION_WORLD` calculation ([GH-86516](https://github.com/godotengine/godot/pull/86516)). +- RenderingDevice: Fix uniform sets wrongly assumed to be bound ([GH-86522](https://github.com/godotengine/godot/pull/86522)). +- D3D12: Dynamically load Agility SDK ([GH-86551](https://github.com/godotengine/godot/pull/86551)). +- Fix LightmapperRD division warning in MSVC ([GH-86555](https://github.com/godotengine/godot/pull/86555)). +- Fix Polygon2D to Skeleton2D transform calculation ([GH-86557](https://github.com/godotengine/godot/pull/86557)). +- Support CUSTOM shader attributes in 2D ([GH-86564](https://github.com/godotengine/godot/pull/86564)). +- Tiny fix for lightmapper DDA ([GH-86583](https://github.com/godotengine/godot/pull/86583)). +- Implement overdraw, lighting, and unshaded debug draw modes for OpenGL ([GH-86677](https://github.com/godotengine/godot/pull/86677)). +- Add autocompletion for RenderingServer's global shader methods & `has_os_feature` ([GH-86798](https://github.com/godotengine/godot/pull/86798)). +- Fix global transform being wrong on entering tree ([GH-86841](https://github.com/godotengine/godot/pull/86841)). +- Avoid several null-dereferences of ApiContextRD ([GH-86843](https://github.com/godotengine/godot/pull/86843)). +- Fix usage of index offsets in RenderingDevice ([GH-86852](https://github.com/godotengine/godot/pull/86852)). +- Fix determination of copyable layout for compressed textures in Vulkan ([GH-86855](https://github.com/godotengine/godot/pull/86855)). +- Fix build warning with memset value being too large ([GH-86920](https://github.com/godotengine/godot/pull/86920)). +- Fix SSR not working properly in stereo ([GH-86996](https://github.com/godotengine/godot/pull/86996)). +- Windows: Add support for hex vendor/device IDs in the Angle blocklist. Add Intel Gen5/Gen6/Gen7 GPUs to Angle blocklist ([GH-87013](https://github.com/godotengine/godot/pull/87013)). +- Fix incorrect mapping of initial action as clear region continue to clear ([GH-87022](https://github.com/godotengine/godot/pull/87022)). +- Deprecate RenderingServer's `has_feature` and Features enum ([GH-87035](https://github.com/godotengine/godot/pull/87035)). +- Default to 32-bit depth map on Forward+ renderer and 24-bit only on Mobile renderer ([GH-87057](https://github.com/godotengine/godot/pull/87057)). +- Fix UV issues in Compatibility renderer ([GH-87067](https://github.com/godotengine/godot/pull/87067)). +- Add `shader_cache_dir_valid` check to `_save_to_cache` ([GH-87096](https://github.com/godotengine/godot/pull/87096)). +- Fix build warning with memset value being too large ([GH-87155](https://github.com/godotengine/godot/pull/87155)). +- Fix 2D normals for transposed texture ([GH-87225](https://github.com/godotengine/godot/pull/87225)). +- Stabilize snapping 2D transforms to pixel ([GH-87297](https://github.com/godotengine/godot/pull/87297)). +- D3D12 RDD: Fix wrong argument when resolving timestamp queries ([GH-87298](https://github.com/godotengine/godot/pull/87298)). +- Finish splitting functionality of the `RenderingDevice` backends into `RenderingDeviceDriver` ([GH-87340](https://github.com/godotengine/godot/pull/87340)). +- Fix memory leak from not clearing the buffer barrier vector properly on the render graph ([GH-87349](https://github.com/godotengine/godot/pull/87349)). +- Fix Compatibility Rendering (GLES3) on old and low budget devices ([GH-87352](https://github.com/godotengine/godot/pull/87352)). +- Implement glow/bloom on compatibility renderer ([GH-87360](https://github.com/godotengine/godot/pull/87360)). +- Add GLES3 infrastructure for lightmap baking in the compatibility backend ([GH-87386](https://github.com/godotengine/godot/pull/87386)). +- Add `ivec` variants to `multiview_uv` for stereo rendering ([GH-87460](https://github.com/godotengine/godot/pull/87460)). +- OpenXR: Cleanup swapchain logic (was Fix render target multiplier) ([GH-87466](https://github.com/godotengine/godot/pull/87466)). +- Direct3D 12: Let NIR runtime data and push constants use the same register scheme as bindings ([GH-87482](https://github.com/godotengine/godot/pull/87482)). +- Disable scissor test after rendering batches in compatibility renderer ([GH-87489](https://github.com/godotengine/godot/pull/87489)). +- Clean up outdated `USE_LIGHT_SHADER_CODE` usage ([GH-87495](https://github.com/godotengine/godot/pull/87495)). +- Fix framebuffer created for reflection probe in mobile renderer ([GH-87505](https://github.com/godotengine/godot/pull/87505)). +- Fix validation errors by improving stage and slice tracking behavior of RenderingDeviceGraph ([GH-87512](https://github.com/godotengine/godot/pull/87512)). +- Avoid saving the `texture_rd_rid` property of TextureRD resources ([GH-87541](https://github.com/godotengine/godot/pull/87541)). +- Significantly improve the speed of shader compilation in compatibility backend ([GH-87553](https://github.com/godotengine/godot/pull/87553)). +- Direct3D 12: Make format feature check more defensive ([GH-87570](https://github.com/godotengine/godot/pull/87570)). +- Direct3D 12: Fix and enable custom debug printing ([GH-87572](https://github.com/godotengine/godot/pull/87572)). +- Direct3D 12: Include in CODEOWNERS ([GH-87574](https://github.com/godotengine/godot/pull/87574)). +- Do not use a linear sampler on lightmapper when retrieving grid data ([GH-87618](https://github.com/godotengine/godot/pull/87618)). +- Direct3D 12: Query support for 16-bit operations ([GH-87670](https://github.com/godotengine/godot/pull/87670)). +- Add check in `CompressedTextureLayered::get_layer_data` to prevent crash ([GH-87694](https://github.com/godotengine/godot/pull/87694)). +- Free dummy renderer objects ([GH-87710](https://github.com/godotengine/godot/pull/87710)). +- Enforce calling RenderingDevice code from rendering thread in TextureRD classes ([GH-87721](https://github.com/godotengine/godot/pull/87721)). +- Do not reflect the origin lines in a mirror ([GH-87757](https://github.com/godotengine/godot/pull/87757)). +- Direct3D 12: Avoid terrible leak related to command allocators ([GH-87795](https://github.com/godotengine/godot/pull/87795)). +- Namespace shader cache files by graphics API ([GH-87796](https://github.com/godotengine/godot/pull/87796)). +- Direct3D 12: Enhance management of texture data life cycle ([GH-87872](https://github.com/godotengine/godot/pull/87872)). +- Direct 3D 12: Implement proper fallback for format casting ([GH-88027](https://github.com/godotengine/godot/pull/88027)). +- Add reflection probe support to compatibility renderer ([GH-88056](https://github.com/godotengine/godot/pull/88056)). +- Fix missing instance type in dummy renderer ([GH-88097](https://github.com/godotengine/godot/pull/88097)). +- Make `RID_Owner` threadsafe in `TextureStorage` for GLES3 ([GH-88205](https://github.com/godotengine/godot/pull/88205)). +- Direct3D 12: Fix cubemap slicing ([GH-88252](https://github.com/godotengine/godot/pull/88252)). +- D3D12: Improve shader validation handling ([GH-88254](https://github.com/godotengine/godot/pull/88254)). +- Fix swap chain errors when application starts minimized ([GH-88289](https://github.com/godotengine/godot/pull/88289)). +- Disable ReShade in the editor and project manager (if run via Vulkan) ([GH-88316](https://github.com/godotengine/godot/pull/88316)). +- Use Reverse Z for the depth buffer ([GH-88328](https://github.com/godotengine/godot/pull/88328)). +- Add validation to render graph for draw and compute lists ([GH-88331](https://github.com/godotengine/godot/pull/88331)). +- Handle `VK_SUBOPTIMAL_KHR` as a valid error code to fix Android performance ([GH-88361](https://github.com/godotengine/godot/pull/88361)). +- Fix unshaded debug draw mode for LightmapGI ([GH-88384](https://github.com/godotengine/godot/pull/88384)). +- Allow VisibleOnScreenNotifier2D/3D to have empty `enable_node_path` ([GH-88403](https://github.com/godotengine/godot/pull/88403)). +- Make dummy rendering server appear as a high end platform to fix vulkan shader compile error when exporting ([GH-88409](https://github.com/godotengine/godot/pull/88409)). +- Fix reversed custom `AABB` check when recalculating multimesh `AABB`s ([GH-88506](https://github.com/godotengine/godot/pull/88506)). +- D3D12: Define GUIDs directly ([GH-88540](https://github.com/godotengine/godot/pull/88540)). +- Merge execute and present commands for RenderingDeviceDriver ([GH-88560](https://github.com/godotengine/godot/pull/88560)). +- Fix shader cache with transform feedback on some Android devices ([GH-88573](https://github.com/godotengine/godot/pull/88573)). +- Fail early if shader mode is invalid in dummy renderer ([GH-88581](https://github.com/godotengine/godot/pull/88581)). +- Remove unnecessary AABB initialization for CPUParticles ([GH-88602](https://github.com/godotengine/godot/pull/88602)). +- Change glow calculation back to `max(r,g,b)` ([GH-88612](https://github.com/godotengine/godot/pull/88612)). +- Remove tracking logic for input attachments as it's not necessary ([GH-88631](https://github.com/godotengine/godot/pull/88631)). +- Fix OpenGL on Android after adding optional depth fog ([GH-88633](https://github.com/godotengine/godot/pull/88633)). +- Use barriers between all blur passes with SSAO and SSIL ([GH-88649](https://github.com/godotengine/godot/pull/88649)). +- Implement VisibilityNotifier3D in the compatibility backend ([GH-88684](https://github.com/godotengine/godot/pull/88684)). +- Consistently use `system_fbo` instead of binding 0 as it is needed for iOS devices ([GH-88745](https://github.com/godotengine/godot/pull/88745)). +- Fix rendering issue with depth in WebXR ([GH-88787](https://github.com/godotengine/godot/pull/88787)). +- Add fix for TAA passes rendering black meshes on XR ([GH-88830](https://github.com/godotengine/godot/pull/88830)). +- Add `compositor_free` branch in Compatibility scene renderer free function ([GH-88873](https://github.com/godotengine/godot/pull/88873)). +- Ensure proper vertex input masks are used in 2D compatibility renderer ([GH-88938](https://github.com/godotengine/godot/pull/88938)). +- Direct3D 12: Fix shader model support check for devices not aware of the highest ones ([GH-89038](https://github.com/godotengine/godot/pull/89038)). +- Fix never ending loop with overlapping probes ([GH-89134](https://github.com/godotengine/godot/pull/89134)). +- Vulkan: Don't warn about invalid pipelines cache if missing ([GH-89180](https://github.com/godotengine/godot/pull/89180)). +- Make shader binary alignment handling simpler and more robust ([GH-89209](https://github.com/godotengine/godot/pull/89209)). +- Make Overdraw, Lighting and Shadow Splits debug draw modes ignore decals ([GH-89253](https://github.com/godotengine/godot/pull/89253)). +- Make `ShaderDescription` and related types public ([GH-89277](https://github.com/godotengine/godot/pull/89277)). +- Fix lightmap captures not applied in one octant ([GH-89281](https://github.com/godotengine/godot/pull/89281)). +- Increase coverage of timestamps for visual profiler ([GH-89398](https://github.com/godotengine/godot/pull/89398)). +- Ensure specialization constants come sorted from reflection ([GH-89420](https://github.com/godotengine/godot/pull/89420)). +- Set a minimum of 0.01 for proximity fade to avoid undefined behavior in shader ([GH-89432](https://github.com/godotengine/godot/pull/89432)). +- Fix missed light clusters when inside clipped lights ([GH-89450](https://github.com/godotengine/godot/pull/89450)). +- Fix shader compilation error when enabling texture MSDF and UV1 Triplanar at the same time ([GH-89470](https://github.com/godotengine/godot/pull/89470)). +- Expose bindings to compute dispatch indirect of rendering device ([GH-89491](https://github.com/godotengine/godot/pull/89491)). +- Allow BaseMaterial3D height/dither fade to work with Compatibility rendering ([GH-89528](https://github.com/godotengine/godot/pull/89528)). +- Fix mobile renderer RID leaks ([GH-89531](https://github.com/godotengine/godot/pull/89531)). +- Tighter shadow culling - fix light colinear to frustum edge ([GH-89714](https://github.com/godotengine/godot/pull/89714)). +- Shadow fade for omni lights actually stops the shadow from updating while faded out to improve performance ([GH-89729](https://github.com/godotengine/godot/pull/89729)). +- OpenXR: Change timing of xrWaitFrame and fix XR multithreading issues ([GH-89734](https://github.com/godotengine/godot/pull/89734)). +- Add missing `RenderInfoType` enum to `Viewport` ([GH-89805](https://github.com/godotengine/godot/pull/89805)). +- Fix decal modulate being passed as srgb instead of as linear color ([GH-89849](https://github.com/godotengine/godot/pull/89849)). +- Add support for OpenXR composition layers ([GH-89880](https://github.com/godotengine/godot/pull/89880)). +- Improvements to VRS/Foveated rendering ([GH-89894](https://github.com/godotengine/godot/pull/89894)). +- TileMap: Fix forcing cleanup on exiting tree/canvas ([GH-89975](https://github.com/godotengine/godot/pull/89975)). +- Fix `RenderingDevice::get_driver_resource` crash or incorrect result with certain resources ([GH-90011](https://github.com/godotengine/godot/pull/90011)). +- Add early return when setting `transparent_bg` ([GH-90055](https://github.com/godotengine/godot/pull/90055)). +- Expose `MeshInstance3D.get_skin_reference` and add docs ([GH-90056](https://github.com/godotengine/godot/pull/90056)). +- Don't use subpasses when we're using Canvas background mode in Mobile ([GH-90191](https://github.com/godotengine/godot/pull/90191)). +- Allow Decal Emission Energy values above 128 in the inspector ([GH-90217](https://github.com/godotengine/godot/pull/90217)). +- Fix OpenGL `_shadow_atlas_find_shadow` error when light instance is freed ([GH-90233](https://github.com/godotengine/godot/pull/90233)). +- Fix per-node physics interpolation setting ([GH-90246](https://github.com/godotengine/godot/pull/90246)). +- Add toggle for enabling or disabling RenderingDevice's pipeline cache ([GH-90271](https://github.com/godotengine/godot/pull/90271)). +- Fix sharing World2D between SubViewports causes 2D lights of one SubViewport to go missing ([GH-90282](https://github.com/godotengine/godot/pull/90282)). +- Avoid compiler error with RenderingContextDriverVulkanWindows ([GH-90326](https://github.com/godotengine/godot/pull/90326)). +- OpenXR: Apply fix for reverse Z ([GH-90416](https://github.com/godotengine/godot/pull/90416)). +- Fix GeometryInstance3D Custom AABB assignment in the editor not working ([GH-90440](https://github.com/godotengine/godot/pull/90440)). +- Clear RIDs of weight buffers when freeing to avoid double free ([GH-90458](https://github.com/godotengine/godot/pull/90458)). +- Fix incorrect bounds check in RenderingDevice push constant ([GH-90620](https://github.com/godotengine/godot/pull/90620)). +- Delaunay3D/LightmapGI: Improve triangulation ([GH-90701](https://github.com/godotengine/godot/pull/90701)). +- LightmapGI: Reduce warnings and increase probe accuracy ([GH-90702](https://github.com/godotengine/godot/pull/90702)). +- Fix `Line2D` joints with `joint_mode` set to Round rendered "flipped" for a 180 degree angle ([GH-90786](https://github.com/godotengine/godot/pull/90786)). +- Use a src rect for copying from screen with CanvasGroup in the mobile backend ([GH-90821](https://github.com/godotengine/godot/pull/90821)). +- Revert change to default depth clear value in `draw_list_begin()` ([GH-90828](https://github.com/godotengine/godot/pull/90828)). +- LightmapGI: Fix seam blending with directional lightmaps ([GH-90848](https://github.com/godotengine/godot/pull/90848)). +- Fix LightOccluder2D SDF Collision Enable/Disable ([GH-90883](https://github.com/godotengine/godot/pull/90883)). +- Ensure minimum block size is respected when doing GPU to CPU copies of compressed textures ([GH-90911](https://github.com/godotengine/godot/pull/90911)). +- Avoid writing out of range data over valid data in CVTT decompress methods when decompressing small mip levels ([GH-90912](https://github.com/godotengine/godot/pull/90912)). +- Apply additional fixes to servers' threading ([GH-90913](https://github.com/godotengine/godot/pull/90913)). +- Exit light calculation early when pixel outside of light bounding rectangle ([GH-90920](https://github.com/godotengine/godot/pull/90920)). +- Handle compressed images in `TileSetAtlasSource::_create_padded_image_texture` ([GH-90994](https://github.com/godotengine/godot/pull/90994)). +- Fix issue with copy shader not working in multiview ([GH-91059](https://github.com/godotengine/godot/pull/91059)). +- Fix issue in shadow to opacity ([GH-91096](https://github.com/godotengine/godot/pull/91096)). +- Add `LIGHT_VERTEX` to fragment shader ([GH-91136](https://github.com/godotengine/godot/pull/91136)). +- Fix crash on compatibility fallback when vkCreateRenderPass2KHR is unavailable ([GH-91169](https://github.com/godotengine/godot/pull/91169)). +- Tweak appearance of 3D editor gizmo icons ([GH-91174](https://github.com/godotengine/godot/pull/91174)). +- Add adjustments and color correction to Compatibility renderer ([GH-91176](https://github.com/godotengine/godot/pull/91176)). +- Properly calculate penumbra for soft shadows with reverse z ([GH-91191](https://github.com/godotengine/godot/pull/91191)). +- Fix incorrect memory read when capacity changes in RD Graph ([GH-91312](https://github.com/godotengine/godot/pull/91312)). +- Ensure that environment is available before checking for BCS ([GH-91322](https://github.com/godotengine/godot/pull/91322)). +- Fix SDFGI being used in unshaded debug draw ([GH-91344](https://github.com/godotengine/godot/pull/91344)). +- Ensure global shader sampler parameters are initialized when loading ([GH-91414](https://github.com/godotengine/godot/pull/91414)). +- Fix typo in shader breaking gles3 ([GH-91426](https://github.com/godotengine/godot/pull/91426)). +- Use a full screen triangle for mipmap calculations in mobile renderer ([GH-91480](https://github.com/godotengine/godot/pull/91480)). +- Add optional driver workaround to RenderingDevice for Adreno 6XX ([GH-91514](https://github.com/godotengine/godot/pull/91514)). +- Add draw and dispatch count to timestamp validation ([GH-91530](https://github.com/godotengine/godot/pull/91530)). +- Properly set size of shadow atlas quadrant when subdivision is 8 or higher ([GH-91545](https://github.com/godotengine/godot/pull/91545)). +- Add a project setting to configure the maximum number of timestamps ([GH-91551](https://github.com/godotengine/godot/pull/91551)). +- LightmapGI: Fix lightleaks caused by insufficient padding and add denoiser range property for LightmapGI ([GH-91601](https://github.com/godotengine/godot/pull/91601)). +- Skip rendering sky if viewport is set to transparent background ([GH-91642](https://github.com/godotengine/godot/pull/91642)). +- Add support for enhanced barriers in D3D12 ([GH-91769](https://github.com/godotengine/godot/pull/91769)). +- Tighter light culling - fix directional lights colinear case ([GH-91790](https://github.com/godotengine/godot/pull/91790)). +- Rewrite reprojection for FSR2 to work correctly with Reverse-Z ([GH-91799](https://github.com/godotengine/godot/pull/91799)). +- Do not use MSAA versions of textures on debug views ([GH-91808](https://github.com/godotengine/godot/pull/91808)). +- Fix MultiMesh buffer cache in transforms-only case ([GH-91846](https://github.com/godotengine/godot/pull/91846)). +- Fix compatibility renderer load of compressed layered `GL_TEXTURE_2D_ARRAY` ([GH-91853](https://github.com/godotengine/godot/pull/91853)). +- Fix lightmapper seam blending ([GH-91985](https://github.com/godotengine/godot/pull/91985)). +- Optimize usage of "prepare for use" in draw and dispatch commands ([GH-91989](https://github.com/godotengine/godot/pull/91989)). +- Increase coverage of VRAM debugger and add support to RD backends ([GH-92000](https://github.com/godotengine/godot/pull/92000)). +- vulkan: Update all components to Vulkan SDK 1.3.283.0 ([GH-92010](https://github.com/godotengine/godot/pull/92010)). +- Add context getter to RenderingDevice ([GH-92045](https://github.com/godotengine/godot/pull/92045)). +- Tight shadow culling - increase epsilon to prevent flickering ([GH-92078](https://github.com/godotengine/godot/pull/92078)). +- Stereo rendering: Fix omni lights ([GH-92186](https://github.com/godotengine/godot/pull/92186)). +- Only apply LOD when camera is outside the AABB of mesh in mobile renderer ([GH-92232](https://github.com/godotengine/godot/pull/92232)). +- Reduce allocations each time a render pass begins in RenderingDevice ([GH-92258](https://github.com/godotengine/godot/pull/92258)). +- Fix LOD selection in compatibility backend and clean up LOD code ([GH-92287](https://github.com/godotengine/godot/pull/92287)). +- Fix albedo value wraparound in Compatibility render mode ([GH-92388](https://github.com/godotengine/godot/pull/92388)). +- Separate linear and sRGB uniform buffers in RD rendering backends ([GH-92444](https://github.com/godotengine/godot/pull/92444)). +- Disable `camera_effects` when debug draw is active ([GH-92524](https://github.com/godotengine/godot/pull/92524)). +- Add more validation to UBO size and alignment in Compatibility renderer ([GH-92568](https://github.com/godotengine/godot/pull/92568)). +- RenderingDevice: Reject creation of textures with no usage ([GH-92587](https://github.com/godotengine/godot/pull/92587)). +- Fix Adreno 3xx compatibility for devices with newer driver versions ([GH-92741](https://github.com/godotengine/godot/pull/92741)). +- Fix glsl shader for Android Mali-GXXx GPUs and Vulkan API 1.3.xxx ([GH-92817](https://github.com/godotengine/godot/pull/92817)). +- Make query for `GL_MAX_VIEWPORT_DIMS` compatible with web exports ([GH-92851](https://github.com/godotengine/godot/pull/92851)). +- Fix depth clear value for uv2 baking in compatibility renderer ([GH-92887](https://github.com/godotengine/godot/pull/92887)). +- Ensure Motion Vectors are enabled by particles and skeletons when using the Motion Vector debug draw option ([GH-93055](https://github.com/godotengine/godot/pull/93055)). +- Ensure post processing happens when adjustments are enabled in the Compatibility renderer ([GH-93060](https://github.com/godotengine/godot/pull/93060)). +- Track compositor effects that use motion vectors ([GH-93068](https://github.com/godotengine/godot/pull/93068)). +- Ensure sky reflection is updated when ambient mode is set to background ([GH-93107](https://github.com/godotengine/godot/pull/93107)). +- Add Parallax2D repeats in ysort child collection ([GH-93182](https://github.com/godotengine/godot/pull/93182)). +- Fix `TileMapLayer` not respecting physics interpolation mode ([GH-93279](https://github.com/godotengine/godot/pull/93279)). +- AnimatedTexture: Fix crash when loaded from a thread ([GH-93340](https://github.com/godotengine/godot/pull/93340)). +- Fix ubo tag placement in canvas.glsl fragment shader ([GH-93343](https://github.com/godotengine/godot/pull/93343)). +- Physics interpolation: Fix 2D skinning ([GH-93368](https://github.com/godotengine/godot/pull/93368)). +- Remove unused flag and code from canvas renderer ([GH-93376](https://github.com/godotengine/godot/pull/93376)). +- Fix incorrect enabling of post process in OpenGL ([GH-93530](https://github.com/godotengine/godot/pull/93530)). +- Add safety check when setting several rendering effect quality ([GH-93617](https://github.com/godotengine/godot/pull/93617)). +- Make RenderSceneData take projection correction into account ([GH-93630](https://github.com/godotengine/godot/pull/93630)). +- Use `PackedVector4Array` instead of float array for vec4 array uniform ([GH-93635](https://github.com/godotengine/godot/pull/93635)). +- Remove warning when project setting requests a larger global shader uniform buffer than the hardware supports ([GH-93645](https://github.com/godotengine/godot/pull/93645)). +- Remove useless instantiation in `RDShaderFile::parse_versions_from_text` ([GH-93649](https://github.com/godotengine/godot/pull/93649)). +- Improve handling of rendering startup errors ([GH-93706](https://github.com/godotengine/godot/pull/93706)). +- D3D12: Use the right state for resources in certain heap types ([GH-93707](https://github.com/godotengine/godot/pull/93707)). +- Windows: Disable G-SYNC in windowed mode ([GH-93737](https://github.com/godotengine/godot/pull/93737)). +- Replace pixel rounding with `floor(x + 0.5)` ([GH-93740](https://github.com/godotengine/godot/pull/93740)). +- Fix inconsistent CanvasModulate color in 2D HDR ([GH-93802](https://github.com/godotengine/godot/pull/93802)). +- Physics Interpolation - Fix `interpolated_transform_2d` ([GH-93852](https://github.com/godotengine/godot/pull/93852)). +- Android: Fix the issue causing the logo to not show when using the `compatibility` renderer ([GH-93891](https://github.com/godotengine/godot/pull/93891)). +- Fix AABB computation for position compression to not depend on vertex order ([GH-93916](https://github.com/godotengine/godot/pull/93916)). +- Fix compatibility renderer `depth_prepass_alpha` ([GH-93931](https://github.com/godotengine/godot/pull/93931)). +- MoltenVK: Fix downscaled hiDPI window pixelation ([GH-93950](https://github.com/godotengine/godot/pull/93950)). +- Pre transparent compositor effects needs to run later ([GH-93960](https://github.com/godotengine/godot/pull/93960)). +- Physics Interpolation: Fix behavior on pause ([GH-94036](https://github.com/godotengine/godot/pull/94036)). +- RenderingDevice: Leave handling of compressed block granularity to the driver ([GH-94069](https://github.com/godotengine/godot/pull/94069)). +- Use `GL_COLOR_ATTACHMENT` in depth prepass when using Multiview ([GH-94095](https://github.com/godotengine/godot/pull/94095)). +- Remove our `ERR_ON_RENDER_THREAD` guard, it is not reliable ([GH-94121](https://github.com/godotengine/godot/pull/94121)). +- Silence Vulkan "Unable to acquire framebuffer." swapchain error ([GH-94135](https://github.com/godotengine/godot/pull/94135)). +- Properly linearize depth buffer for SSAO when using orthogonal camera ([GH-94153](https://github.com/godotengine/godot/pull/94153)). +- Fix SSR orientation issues when using orthogonal camera ([GH-94184](https://github.com/godotengine/godot/pull/94184)). +- D3D12: Get rid of `DXIL.dll`! ([GH-94203](https://github.com/godotengine/godot/pull/94203)). +- Fix black `get_texture()` on viewport in compatibility mode with HDR enabled ([GH-94233](https://github.com/godotengine/godot/pull/94233)). +- Lightmapper: Ensure the atlas is big enough to fit padded UV maps ([GH-94236](https://github.com/godotengine/godot/pull/94236)). +- Lightmapper: Prevent infinite loop while blitting lightmaps into an atlas ([GH-94237](https://github.com/godotengine/godot/pull/94237)). +- Fix Image CowData crash when baking large lightmaps ([GH-94243](https://github.com/godotengine/godot/pull/94243)). +- D3D12: Avoid enabling depth bounds test if unsupported ([GH-94267](https://github.com/godotengine/godot/pull/94267)). +- Use a spec constant to control whether the MultiMesh branch is used in the vertex shader ([GH-94289](https://github.com/godotengine/godot/pull/94289)). +- Fix empty region in AtlasTexture ([GH-94365](https://github.com/godotengine/godot/pull/94365)). +- Expose more state in RenderSceneBuffersRD ([GH-94388](https://github.com/godotengine/godot/pull/94388)). +- Restore default clear color after displaying boot splash ([GH-94404](https://github.com/godotengine/godot/pull/94404)). +- Always render when XR is enabled, even if no OS windows can draw ([GH-94412](https://github.com/godotengine/godot/pull/94412)). +- Add warning when use FSR1 on renderer other than forward plus ([GH-94492](https://github.com/godotengine/godot/pull/94492)). +- SDFGI: Fix crash if `update_data` is nullptr ([GH-94535](https://github.com/godotengine/godot/pull/94535)). +- GLES3: Fix directional shadow on Metal ANGLE ([GH-94556](https://github.com/godotengine/godot/pull/94556)). +- Fix FOG shader issue in Compatibility mode ([GH-94564](https://github.com/godotengine/godot/pull/94564)). +- Support 64-bit image sizes for VRAM compression ([GH-94598](https://github.com/godotengine/godot/pull/94598)). +- Fix crash when assigning more textures than expected to texture array ([GH-94628](https://github.com/godotengine/godot/pull/94628)). +- Fix position from vertex shader partially uninitialized ([GH-94629](https://github.com/godotengine/godot/pull/94629)). +- Fix newly baked lightmap can't override previously baked at same path ([GH-94645](https://github.com/godotengine/godot/pull/94645)). +- RenderingDevice: Fix getting cubemap layer data ([GH-94656](https://github.com/godotengine/godot/pull/94656)). +- Remove linearization of canvas modulate in GLES3 backend ([GH-94707](https://github.com/godotengine/godot/pull/94707)). +- RenderingDevice: Use correct layer count for Cubemaps during boundary checks ([GH-94708](https://github.com/godotengine/godot/pull/94708)). +- Windows: Use default aggregate initialization for NVAPI settings ([GH-94735](https://github.com/godotengine/godot/pull/94735)). +- Windows: Fall back to D3D12 if Vulkan is not supported and vice versa ([GH-94796](https://github.com/godotengine/godot/pull/94796)). +- Fix regression around OpenGL swapchain optimization for OpenXR ([GH-94894](https://github.com/godotengine/godot/pull/94894)). +- D3D12: Avoid cases of redundant render target clears ([GH-95064](https://github.com/godotengine/godot/pull/95064)). +- D3D12: Avoid crash on exit ([GH-95074](https://github.com/godotengine/godot/pull/95074)). +- Fix LightmapGI causes crash when using `--headless` ([GH-95103](https://github.com/godotengine/godot/pull/95103)). #### Shaders -- Improve shader editor templates to be more descriptive ([GH-51863](https://github.com/godotengine/godot/pull/51863)). -- Add more useful Visual Shader nodes ([GH-72664](https://github.com/godotengine/godot/pull/72664)). -- Add DEPTH to the visual shader output (for spatial mode) ([GH-73691](https://github.com/godotengine/godot/pull/73691)). -- Support shader preprocessor concatenation symbol ([GH-74737](https://github.com/godotengine/godot/pull/74737)). -- Make the dragging connections more user-friendly in visual shaders ([GH-78547](https://github.com/godotengine/godot/pull/78547)). -- Fix invalid shader compilation when using `hint_normal_roughness_texture` in mobile backend ([GH-78839](https://github.com/godotengine/godot/pull/78839)). -- Fix using uint suffix at the hex number declaration in shaders ([GH-78906](https://github.com/godotengine/godot/pull/78906)). -- Fix shader language float literal precision truncation ([GH-78972](https://github.com/godotengine/godot/pull/78972)). -- Fix "Create Shader Node" window position when visual shader editor is floating ([GH-78996](https://github.com/godotengine/godot/pull/78996)). -- Allow more hint types for uniform arrays ([GH-79100](https://github.com/godotengine/godot/pull/79100)). -- Make shader preprocessor keyword colors consistent ([GH-79112](https://github.com/godotengine/godot/pull/79112)). -- Fix comments and indentation in `.gdshaderinc` files ([GH-79158](https://github.com/godotengine/godot/pull/79158)). -- Fix shader type detection ([GH-79287](https://github.com/godotengine/godot/pull/79287)). -- Add autocomplete for filter/repeat hints on uniform arrays ([GH-79402](https://github.com/godotengine/godot/pull/79402)). -- Add error for undefined function in shader ([GH-79459](https://github.com/godotengine/godot/pull/79459)). -- Remove debugging print from shader cache ([GH-80125](https://github.com/godotengine/godot/pull/80125)). -- Fix Shader and ShaderInclude resource loading ([GH-80705](https://github.com/godotengine/godot/pull/80705)). -- Fix empty shader resource loading ([GH-81300](https://github.com/godotengine/godot/pull/81300)). -- Fix shader language preprocessor include marker handling ([GH-81381](https://github.com/godotengine/godot/pull/81381)). -- Fix shader text editor include file reloading ([GH-81410](https://github.com/godotengine/godot/pull/81410)). -- Fix int to uint implicit cast error when use mat3 uniform in compatibility renderer ([GH-81494](https://github.com/godotengine/godot/pull/81494)). -- Re-allows constants in global space to be initialized with function call ([GH-81619](https://github.com/godotengine/godot/pull/81619)). -- Implement drop-down list properties to the custom visual shader nodes ([GH-81688](https://github.com/godotengine/godot/pull/81688)). -- Visual Shaders: Make output-ports for vector types expandable by default ([GH-82088](https://github.com/godotengine/godot/pull/82088)). -- Add preprocessor pass on visual shader when showing generated code ([GH-82570](https://github.com/godotengine/godot/pull/82570)). -- Fix typo in `shader_language.cpp` ([GH-83004](https://github.com/godotengine/godot/pull/83004)). -- Close shader in Shader Editor tab when deleting shader file in FileSystem panel ([GH-83137](https://github.com/godotengine/godot/pull/83137)). -- Fix parameter shader node not declared when only connected to a VaryingSetter ([GH-83189](https://github.com/godotengine/godot/pull/83189)). -- Fix bool varying's generated code will be modified with flat ([GH-83194](https://github.com/godotengine/godot/pull/83194)). -- Fix visual shader crash when arranging ([GH-83678](https://github.com/godotengine/godot/pull/83678)). -- Prevent `_allocate_placeholders` crash if `p_version->variants` is null ([GH-83780](https://github.com/godotengine/godot/pull/83780)). -- Fix inability to uncomment code in text shader editor ([GH-83822](https://github.com/godotengine/godot/pull/83822)). -- Fix assign with swizzle in shader not doing varying validation check ([GH-83830](https://github.com/godotengine/godot/pull/83830)). -- Properly rename `INSTANCE_ID` and `VERTEX_ID` in canvas item shaders in the compatibility backend ([GH-84585](https://github.com/godotengine/godot/pull/84585)). -- Don't store shader edit path in metadata ([GH-84628](https://github.com/godotengine/godot/pull/84628)). -- Fix VisualShader Texture2DParameter node filter bug ([GH-84768](https://github.com/godotengine/godot/pull/84768)). -- Fix VisualShader connection use after free ([GH-84832](https://github.com/godotengine/godot/pull/84832)). -- Make `AMOUNT_RATIO` constant in the shader language specification ([GH-85086](https://github.com/godotengine/godot/pull/85086)). -- Set some dialogs in the VisualShader editor to be exclusive ([GH-85205](https://github.com/godotengine/godot/pull/85205)). +- Automatically ensure correct normals in Compatibility renderer ([GH-82804](https://github.com/godotengine/godot/pull/82804)). +- Add connection related functionality to VisualShader (deleting, dropping/inserting a node) ([GH-83510](https://github.com/godotengine/godot/pull/83510)). +- Add extra warning messages to `VisualShaderNodeTextureParameter` ([GH-83729](https://github.com/godotengine/godot/pull/83729)). +- Refactor the parsing of port names in visual shader's expressions ([GH-83956](https://github.com/godotengine/godot/pull/83956)). +- Fix visual shader's `screen_uv` input preview uses position of node rather than a sample area like uv ([GH-84348](https://github.com/godotengine/godot/pull/84348)). +- Comment the shader template light function by default ([GH-84594](https://github.com/godotengine/godot/pull/84594)). +- VisualShader: Refactor use of Connection ([GH-84969](https://github.com/godotengine/godot/pull/84969)). +- Fix uint's suffix is not highlighted in text shader editor ([GH-85014](https://github.com/godotengine/godot/pull/85014)). +- Redesign the graph editor for visual shaders ([GH-85017](https://github.com/godotengine/godot/pull/85017)). +- Add a specific error when creating a ViewportTexture in a Texture2D node ([GH-85723](https://github.com/godotengine/godot/pull/85723)). +- Sync visual shader's distance fade using circular fade ([GH-86596](https://github.com/godotengine/godot/pull/86596)). +- Handle built-in shaders when closing scene ([GH-86710](https://github.com/godotengine/godot/pull/86710)). +- Add missing check when insert function `normal_roughness_compatibility` ([GH-87207](https://github.com/godotengine/godot/pull/87207)). +- Check if the ref shader is valid in visual shader's `_update_option_menu` ([GH-87356](https://github.com/godotengine/godot/pull/87356)). +- Fix `ShaderMaterial::_property_get_revert` crash when given non-existing `p_name` ([GH-87603](https://github.com/godotengine/godot/pull/87603)). +- Fully initialize all members of structs `IdentifierActions`, `GeneratedCode` and `DefaultIdentifierActions` ([GH-88021](https://github.com/godotengine/godot/pull/88021)). +- Make editing properties more intuitive in VisualShader ([GH-88951](https://github.com/godotengine/godot/pull/88951)). +- Add percent (`%`) sign to Remainder node name in visual shaders ([GH-88980](https://github.com/godotengine/godot/pull/88980)). +- Change shader compiler default setting to avoid doctool error ([GH-88996](https://github.com/godotengine/godot/pull/88996)). +- Fix some missing categories in visual shader nodes ([GH-89190](https://github.com/godotengine/godot/pull/89190)). +- Use raw string literals for BaseMaterial3D shader code generation ([GH-89267](https://github.com/godotengine/godot/pull/89267)). +- Rendering: Add hints to some uniform `PropertyInfo`s ([GH-89488](https://github.com/godotengine/godot/pull/89488)). +- Improve the editor native shader source visualizer ([GH-89690](https://github.com/godotengine/godot/pull/89690)). +- Fix false positive errors in gdshaderinc files ([GH-89752](https://github.com/godotengine/godot/pull/89752)). +- VisualShader: Remove invalid graph connections when ports are removed ([GH-89810](https://github.com/godotengine/godot/pull/89810)). +- Implement documentation comments and tooltips for shader uniform in the inspector ([GH-90161](https://github.com/godotengine/godot/pull/90161)). +- VisualShader: Add reroute node and improve port drawing ([GH-90534](https://github.com/godotengine/godot/pull/90534)). +- Warn users when assigning `VERTEX` directly to `POSITION` due to compatibility breakage from Reverse Z changes ([GH-90587](https://github.com/godotengine/godot/pull/90587)). +- Fix incorrect behavior at expanding an output port in visual shader node ([GH-90787](https://github.com/godotengine/godot/pull/90787)). +- Fix editor crash when shader has incorrect global array declaration ([GH-90792](https://github.com/godotengine/godot/pull/90792)). +- Fix shader crash on zero vector and negative x vector in particles processing ([GH-90810](https://github.com/godotengine/godot/pull/90810)). +- Handle Vector4 default input values in visual shaders ([GH-90850](https://github.com/godotengine/godot/pull/90850)). +- Prevent expanding output port in visual shader expression ([GH-90892](https://github.com/godotengine/godot/pull/90892)). +- Allow compressed texture array and cubemap types in shader globals editor ([GH-91164](https://github.com/godotengine/godot/pull/91164)). +- Don't run Shader doc comments logic outside the editor ([GH-91307](https://github.com/godotengine/godot/pull/91307)). +- Fix shader highlighting the interruption in `color_region` caused by `disabled_branch_regions` ([GH-91497](https://github.com/godotengine/godot/pull/91497)). +- Resolve conflict between shader uniform tooltips `/**` and general annotation `/**/` ([GH-91549](https://github.com/godotengine/godot/pull/91549)). +- Fix shader error on mobile when using `LIGHT_VERTEX` ([GH-91566](https://github.com/godotengine/godot/pull/91566)). +- Make native shader source visualizer highlight uint suffix ([GH-91647](https://github.com/godotengine/godot/pull/91647)). +- Fix code style for generated shader code from ParticleProcessMaterial ([GH-91946](https://github.com/godotengine/godot/pull/91946)). +- Prevent add shader uniform doc when DocTool is not inited ([GH-92145](https://github.com/godotengine/godot/pull/92145)). +- Fix error when duplicating visual shader node inside a Frame ([GH-92151](https://github.com/godotengine/godot/pull/92151)). +- Fix completion of functions with struct param/return type in shaders ([GH-92464](https://github.com/godotengine/godot/pull/92464)). +- Prevent using built-ins for func names in shaders ([GH-92564](https://github.com/godotengine/godot/pull/92564)). +- Fix `VisualShaderNodeVaryingGetter` expanded ports adding ".x" to shader ([GH-92847](https://github.com/godotengine/godot/pull/92847)). +- Fix incorrect preview port in visual shader ([GH-93153](https://github.com/godotengine/godot/pull/93153)). +- Fix bugs in visual shader varyings ([GH-93219](https://github.com/godotengine/godot/pull/93219)). +- Prevent changing some built-ins in spatial shaders ([GH-93269](https://github.com/godotengine/godot/pull/93269)). +- Add few new outputs to the visual shaders ([GH-93338](https://github.com/godotengine/godot/pull/93338)). +- Forbid calling of derivative functions in incorrect functions ([GH-93358](https://github.com/godotengine/godot/pull/93358)). +- Fix visual shader not being updated when switching tabs ([GH-93385](https://github.com/godotengine/godot/pull/93385)). +- Fix crash on shader constant initialization on MinGW compiler ([GH-93469](https://github.com/godotengine/godot/pull/93469)). +- Prevent shader crash when doing invalid operation on boolean vector ([GH-93793](https://github.com/godotengine/godot/pull/93793)). +- Fix orphan StringName's in ShaderLanguage ([GH-93849](https://github.com/godotengine/godot/pull/93849)). +- Improve code for setup of `global_func_set` in `ShaderLanguage` ([GH-93866](https://github.com/godotengine/godot/pull/93866)). +- Add `SwitchVector4D` shortcut to visual shader members ([GH-94272](https://github.com/godotengine/godot/pull/94272)). +- Make ShaderLanguage's parser recognize sampler passed in from array ([GH-94462](https://github.com/godotengine/godot/pull/94462)). +- Few fixes for `VisualShaderNodeRotationByAxis` ([GH-94497](https://github.com/godotengine/godot/pull/94497)). +- Fix internal connection count decreased if visual shader node removed ([GH-94498](https://github.com/godotengine/godot/pull/94498)). +- Fix warning printing for `VisualShaderNodeTextureParameter` ([GH-94611](https://github.com/godotengine/godot/pull/94611)). +- Fix shader crash when using a varying in separate func before it defined ([GH-94671](https://github.com/godotengine/godot/pull/94671)). +- Fix incorrect passing of parameter to visual shader preview ([GH-94729](https://github.com/godotengine/godot/pull/94729)). +- Update shader list after saving `gdshaderinc` file ([GH-94787](https://github.com/godotengine/godot/pull/94787)). +- Emit `normal_roughness` compatibility code in custom functions ([GH-94812](https://github.com/godotengine/godot/pull/94812)). +- Fix expanded output ports disconnection on updating in visual shader ([GH-94875](https://github.com/godotengine/godot/pull/94875)). +- Restrict sampler hint validation to only screen texture hints ([GH-94902](https://github.com/godotengine/godot/pull/94902)). +- VisualShader: Reduce size changes of nodes when connecting/disconnecting ([GH-95061](https://github.com/godotengine/godot/pull/95061)). #### Tests -- Add unit tests for Variant for operator overloading ([GH-76244](https://github.com/godotengine/godot/pull/76244)). -- Add a test suite for TranslationServer ([GH-79331](https://github.com/godotengine/godot/pull/79331)). -- Add unit tests for PackedScene ([GH-79440](https://github.com/godotengine/godot/pull/79440)). -- Add a test suite to InputEvent ([GH-79444](https://github.com/godotengine/godot/pull/79444)). -- Remove use of `std::string` in test ([GH-80422](https://github.com/godotengine/godot/pull/80422)). -- Improve PackedScene unit test for complex scene ([GH-80423](https://github.com/godotengine/godot/pull/80423)). -- Fix errors when testing `Resource` ([GH-81456](https://github.com/godotengine/godot/pull/81456)). -- Adds additional tests for RegEx class ([GH-82225](https://github.com/godotengine/godot/pull/82225)). -- Simplify Geometry3D tests ([GH-82288](https://github.com/godotengine/godot/pull/82288)). -- Fix Variant assignment to Vec2 tests ([GH-83959](https://github.com/godotengine/godot/pull/83959)). +- Add `closest_points_between_segments()` basis path tests for Geometry2D ([GH-48652](https://github.com/godotengine/godot/pull/48652)). +- Fix PathFollow tests, Add PathFollow3D forward test ([GH-51372](https://github.com/godotengine/godot/pull/51372)). +- Add rotation unit tests for Transform3D ([GH-61013](https://github.com/godotengine/godot/pull/61013)). +- Improve PackedScene unit test by covering more methods ([GH-80819](https://github.com/godotengine/godot/pull/80819)). +- Add additional tests for RegEx ([GH-81742](https://github.com/godotengine/godot/pull/81742)). +- Add unit tests for Camera3D ([GH-84826](https://github.com/godotengine/godot/pull/84826)). +- Add more C++ unit tests for String to number conversions ([GH-85666](https://github.com/godotengine/godot/pull/85666)). +- Test global transform when adding detached tree ([GH-87270](https://github.com/godotengine/godot/pull/87270)). +- Add `ImageTexture` unit tests ([GH-88044](https://github.com/godotengine/godot/pull/88044)). +- Fix test regression without editor ([GH-88449](https://github.com/godotengine/godot/pull/88449)). +- Add unit tests for Camera2D ([GH-88614](https://github.com/godotengine/godot/pull/88614)). +- Add unit tests for CryptoKey ([GH-89021](https://github.com/godotengine/godot/pull/89021)). +- Add unit tests for JSONRPC ([GH-89124](https://github.com/godotengine/godot/pull/89124)). +- Add unit test for Vector2 `plane_project` ([GH-89617](https://github.com/godotengine/godot/pull/89617)). +- Add unit tests for `OAHashMap` ([GH-90313](https://github.com/godotengine/godot/pull/90313)). +- Add more unit tests for Transform2D ([GH-90506](https://github.com/godotengine/godot/pull/90506)). +- Exit with an error if using `--test` on binary without unit tests compiled ([GH-90507](https://github.com/godotengine/godot/pull/90507)). +- Remove NavigationRegion3D race condition that fails on CI ([GH-90613](https://github.com/godotengine/godot/pull/90613)). +- Disable NavigationServer3D async bake test with race condition ([GH-90804](https://github.com/godotengine/godot/pull/90804)). +- Suppress expected errors in resource unit tests ([GH-91028](https://github.com/godotengine/godot/pull/91028)). +- Add unit test cases for ImageTexture3D ([GH-91233](https://github.com/godotengine/godot/pull/91233)). +- Add Timer unit tests ([GH-91395](https://github.com/godotengine/godot/pull/91395)). +- Expand tests for `Curve2D/3D` ([GH-91880](https://github.com/godotengine/godot/pull/91880)). +- Use subfolder for temporary test files ([GH-92810](https://github.com/godotengine/godot/pull/92810)). +- Fix some invalid error messages ([GH-93135](https://github.com/godotengine/godot/pull/93135)). +- Fix unit tests in template builds ([GH-93745](https://github.com/godotengine/godot/pull/93745)). +- CI: Run unit tests on desktop release templates ([GH-93780](https://github.com/godotengine/godot/pull/93780)). +- Fix compilation failure in `test_graph_node.h` with `disable_exceptions=false` ([GH-94834](https://github.com/godotengine/godot/pull/94834)). +- Fix Vector4, Vector4i, and Projection missing from ClassDB tests ([GH-95517](https://github.com/godotengine/godot/pull/95517)). #### Thirdparty -- brotli: Sync with upstream 1.1.0 ([GH-82580](https://github.com/godotengine/godot/pull/82580)). -- freetype: Update to version 2.13.2 ([GH-81110](https://github.com/godotengine/godot/pull/81110)). -- harfbuzz: Update to version 8.2.2 ([GH-84080](https://github.com/godotengine/godot/pull/84080)). -- libpng: Update to upstream 1.6.40 ([GH-80262](https://github.com/godotengine/godot/pull/80262)). -- libwebp: Sync with upstream 1.3.2 ([GH-81663](https://github.com/godotengine/godot/pull/81663)). -- mbedtls: Fix MSVC ARM build after 2.28.3 enabled AES-NI intrinsics ([GH-81405](https://github.com/godotengine/godot/pull/81405)). -- mbedtls: Update to version 2.28.5 ([GH-83721](https://github.com/godotengine/godot/pull/83721)). -- mbedtls: Backport Windows fix to use bcrypt for entropy ([GH-84042](https://github.com/godotengine/godot/pull/84042)). -- miniupnpc: Update to version 2.2.5 ([GH-80382](https://github.com/godotengine/godot/pull/80382)). -- minizip: Fix `ZIPReader` failing to open empty zip files ([GH-73310](https://github.com/godotengine/godot/pull/73310)). -- minizip: Backport patch to fix CVE-2023-45853 ([GH-85509](https://github.com/godotengine/godot/pull/85509)). -- openxr: Sync with upstream 1.0.31, don't build obsolete dispatch table ([GH-83984](https://github.com/godotengine/godot/pull/83984)). -- r128: Update to include latest fix for intrinsics being incorrect included ([GH-84537](https://github.com/godotengine/godot/pull/84537)). -- thorvg: Update to 0.11.2 ([GH-83656](https://github.com/godotengine/godot/pull/83656)). -- tinyexr: Sync with upstream 1.0.7 ([GH-80384](https://github.com/godotengine/godot/pull/80384)). -- zlib/minizip: Update to version 1.3 ([GH-81111](https://github.com/godotengine/godot/pull/81111)). +- astcenc: Update to 4.7.0 ([GH-80375](https://github.com/godotengine/godot/pull/80375)). +- ICU4C: Update to version 74.1 ([GH-84289](https://github.com/godotengine/godot/pull/84289)). +- meshoptimizer: Update to v0.20 (with a reduced patch) ([GH-84384](https://github.com/godotengine/godot/pull/84384)). +- Fix README from `linuxbsd_headers` ([GH-86607](https://github.com/godotengine/godot/pull/86607)). +- ThorVG: Update from v0.11.2 to v0.11.6 ([GH-86623](https://github.com/godotengine/godot/pull/86623)). +- ThorVG: Update from v0.11.6 to v0.12.0 ([GH-86846](https://github.com/godotengine/godot/pull/86846)). +- OpenXR: Update to version 1.0.33 ([GH-86980](https://github.com/godotengine/godot/pull/86980)). +- vulkan: Update components to Vulkan SDK 1.3.268.0 ([GH-87091](https://github.com/godotengine/godot/pull/87091)). +- ThorVG: update from v0.12.0 to v0.12.1 ([GH-87105](https://github.com/godotengine/godot/pull/87105)). +- zlib/minizip: Update to version 1.3.1 ([GH-87527](https://github.com/godotengine/godot/pull/87527)). +- certs: Sync with Mozilla bundle as of Dec 13, 2023 ([GH-87581](https://github.com/godotengine/godot/pull/87581)). +- ThorVG: update from v0.12.1 to v0.12.3 ([GH-87612](https://github.com/godotengine/godot/pull/87612)). +- mbedtls: Update to upstream version 2.28.7 ([GH-87738](https://github.com/godotengine/godot/pull/87738)). +- Sync controller mappings DB with SDL2 community repo ([GH-87741](https://github.com/godotengine/godot/pull/87741)). +- ThorVG: update from v0.12.3 to v0.12.4 ([GH-87869](https://github.com/godotengine/godot/pull/87869)). +- wayland-protocols: Update to 1.33 ([GH-87982](https://github.com/godotengine/godot/pull/87982)). +- etcpak: Sync with upstream ([GH-87984](https://github.com/godotengine/godot/pull/87984)). +- vulkan: Update all components to Vulkan SDK 1.3.275.0 ([GH-88011](https://github.com/godotengine/godot/pull/88011)). +- thorvg: Re-enable thread support, made opt-in upstream ([GH-88053](https://github.com/godotengine/godot/pull/88053)). +- libktx: Update to 4.3.1 ([GH-88075](https://github.com/godotengine/godot/pull/88075)). +- ThorVG: update from v0.12.4 to v0.12.5 ([GH-88094](https://github.com/godotengine/godot/pull/88094)). +- miniupnpc: Update to version 2.2.6 ([GH-88285](https://github.com/godotengine/godot/pull/88285)). +- basis_universal: Unbundle jpgd to fix symbol conflict, use our newer copy with SSE2 support ([GH-88508](https://github.com/godotengine/godot/pull/88508)). +- FastNoiseLite: Sync with 1.1.0, clean up SCsub ([GH-88526](https://github.com/godotengine/godot/pull/88526)). +- tinyexr: Update to 1.0.8 ([GH-88702](https://github.com/godotengine/godot/pull/88702)). +- embree: Update to 4.3.1 ([GH-88783](https://github.com/godotengine/godot/pull/88783)). +- clipper2: Update to 1.3.0 ([GH-89025](https://github.com/godotengine/godot/pull/89025)). +- harfbuzz: Update to 8.3.0 ([GH-89304](https://github.com/godotengine/godot/pull/89304)). +- libpng: Update to 1.6.43 ([GH-89314](https://github.com/godotengine/godot/pull/89314)). +- thorvg: Update to 0.12.7 ([GH-89337](https://github.com/godotengine/godot/pull/89337)). +- pcre2: Update to 10.43 ([GH-89371](https://github.com/godotengine/godot/pull/89371)). +- Update ICU and msdfgen ([GH-89414](https://github.com/godotengine/godot/pull/89414)). +- pcre2: Remove unused sjlit files after last update ([GH-89495](https://github.com/godotengine/godot/pull/89495)). +- iOS: Disable PCRE2 JIT ([GH-89507](https://github.com/godotengine/godot/pull/89507)). +- meshoptimizer: State used version explicitly ([GH-89544](https://github.com/godotengine/godot/pull/89544)). +- thorvg: Update to 0.12.9 ([GH-89591](https://github.com/godotengine/godot/pull/89591)). +- mbedtls: Update to upstream version 2.28.8 ([GH-90209](https://github.com/godotengine/godot/pull/90209)). +- certs: Sync with Mozilla bundle as of Mar 11, 2024 ([GH-90211](https://github.com/godotengine/godot/pull/90211)). +- thorvg: Update to 0.12.10 ([GH-90243](https://github.com/godotengine/godot/pull/90243)). +- enet: Sync with upstream commit c44b7d0 ([GH-90244](https://github.com/godotengine/godot/pull/90244)). +- harfbuzz: Update to 8.4.0 ([GH-90247](https://github.com/godotengine/godot/pull/90247)). +- libktx: Update to 4.3.2 ([GH-90248](https://github.com/godotengine/godot/pull/90248)). +- miniupnpc: Update to 2.2.7 ([GH-90250](https://github.com/godotengine/godot/pull/90250)). +- squish: Clean up patches, add LICENSE.txt ([GH-90251](https://github.com/godotengine/godot/pull/90251)). +- zstd: Update to upstream version 1.5.6 ([GH-90253](https://github.com/godotengine/godot/pull/90253)). +- Sync controller mappings DB with SDL2 community repo ([GH-90406](https://github.com/godotengine/godot/pull/90406)). +- Sync controller mappings DB with SDL 2 community repo ([GH-91108](https://github.com/godotengine/godot/pull/91108)). +- FBX: Update ufbx to v0.14.0 ([GH-91528](https://github.com/godotengine/godot/pull/91528)). +- thorvg: Update to 0.13.3, add webp loader ([GH-91788](https://github.com/godotengine/godot/pull/91788)). +- Update ICU to 75.1 ([GH-91937](https://github.com/godotengine/godot/pull/91937)). +- astcenc: Update to 4.8.0 ([GH-91941](https://github.com/godotengine/godot/pull/91941)). +- enet: Update to 1.3.18 ([GH-91942](https://github.com/godotengine/godot/pull/91942)). +- libwebp: Update to 1.4.0 ([GH-91943](https://github.com/godotengine/godot/pull/91943)). +- Update HarfBuzz to 8.5.0 ([GH-91959](https://github.com/godotengine/godot/pull/91959)). +- thorvg: Update to 0.13.5 + hotfix for GCC x86_32 build ([GH-92567](https://github.com/godotengine/godot/pull/92567)). +- qoa: Apply upstream patches ([GH-92905](https://github.com/godotengine/godot/pull/92905)). +- ThorVG: Update to 0.13.7 ([GH-92915](https://github.com/godotengine/godot/pull/92915)). +- thorvg: Update to 0.13.8 ([GH-93378](https://github.com/godotengine/godot/pull/93378)). +- ThorVG: Update to 0.14.0 ([GH-93655](https://github.com/godotengine/godot/pull/93655)). +- thorvg: Update to 0.14.1 ([GH-94103](https://github.com/godotengine/godot/pull/94103)). +- embree: Fix include order causing unwanted dllexport symbols ([GH-94256](https://github.com/godotengine/godot/pull/94256)). +- ThorVG: Update to 0.14.2 ([GH-94258](https://github.com/godotengine/godot/pull/94258)). +- Windows: Add `libSynchronization` to link flags ([GH-94466](https://github.com/godotengine/godot/pull/94466)). +- Remove unused Bitstream Vera license ([GH-94823](https://github.com/godotengine/godot/pull/94823)). +- Windows: Remove libSynchronization ([GH-94836](https://github.com/godotengine/godot/pull/94836)). #### XR -- Expose OpenXR raw hand tracking data ([GH-78032](https://github.com/godotengine/godot/pull/78032)). -- Fix issue with accessing hand tracking without timing info ([GH-78817](https://github.com/godotengine/godot/pull/78817)). -- Change to new PICO interaction profiles ([GH-79570](https://github.com/godotengine/godot/pull/79570)). -- Compile OpenXR into MacOS build ([GH-79614](https://github.com/godotengine/godot/pull/79614)). -- Optimized the XRTracker by reusing XRPose objects to minimize garbage collection overhead in C# ([GH-80198](https://github.com/godotengine/godot/pull/80198)). -- Fix casts of XR handles in OpenXRExtensionWrapperExtension ([GH-80656](https://github.com/godotengine/godot/pull/80656)). -- Remove error print from `XRServer.find_interface` ([GH-80730](https://github.com/godotengine/godot/pull/80730)). -- Ensure OpenXR classes are declared properly ([GH-81037](https://github.com/godotengine/godot/pull/81037)). -- Add XR tracking state-change signals ([GH-81239](https://github.com/godotengine/godot/pull/81239)). -- OpenXR: Fix missing add profile for Huawei ([GH-81534](https://github.com/godotengine/godot/pull/81534)). -- OpenXR: Fix error spam if session hasn't started yet ([GH-81536](https://github.com/godotengine/godot/pull/81536)). -- Fix issue with OpenXR environment blend mode not being applied properly ([GH-81561](https://github.com/godotengine/godot/pull/81561)). -- Add support for the OpenXR Eye gaze interaction extension ([GH-82614](https://github.com/godotengine/godot/pull/82614)). -- OpenXR - add access to hand joint validity flags ([GH-82715](https://github.com/godotengine/godot/pull/82715)). -- OpenXR: Fix small hand tracking issues ([GH-82722](https://github.com/godotengine/godot/pull/82722)). -- Skip 2D rendering if stereo enabled and fix couple of MSAA issues ([GH-83649](https://github.com/godotengine/godot/pull/83649)). -- Revert to `proxy_to_pthread=no` as default ([GH-83837](https://github.com/godotengine/godot/pull/83837)). -- Fix OpenXR sample count ([GH-84099](https://github.com/godotengine/godot/pull/84099)). +- Remove unused grip touch action from default OpenXR action map ([GH-85048](https://github.com/godotengine/godot/pull/85048)). +- OpenXR: Add runtime selection dropdown ([GH-85117](https://github.com/godotengine/godot/pull/85117)). +- OpenXR: Add support for retrieving play area ([GH-85163](https://github.com/godotengine/godot/pull/85163)). +- OpenXR: Add support for hand tracking source extension ([GH-85204](https://github.com/godotengine/godot/pull/85204)). +- Cleanup of OpenXR module SCons config ([GH-86537](https://github.com/godotengine/godot/pull/86537)). +- Add ability to drive full-body avatars using OpenXRHand ([GH-86906](https://github.com/godotengine/godot/pull/86906)). +- OpenXR: Add Meta touch plus interaction profile ([GH-86982](https://github.com/godotengine/godot/pull/86982)). +- Add support for OpenXR local floor extension ([GH-87235](https://github.com/godotengine/godot/pull/87235)). +- Add bone update option to OpenXRHand to allow preserving original hand scale ([GH-87240](https://github.com/godotengine/godot/pull/87240)). +- OpenXR: Make it possible to implement vendor extensions to hand tracking from GDExtension ([GH-87546](https://github.com/godotengine/godot/pull/87546)). +- OpenXR: Allow moving vendor passthrough extensions to GDExtension ([GH-87630](https://github.com/godotengine/godot/pull/87630)). +- OpenXR: Allow changing play area mode during active session ([GH-87745](https://github.com/godotengine/godot/pull/87745)). +- Enable getting suggested tracker names from OpenXR extensions ([GH-88311](https://github.com/godotengine/godot/pull/88311)). +- Add XR Face Tracking support ([GH-88312](https://github.com/godotengine/godot/pull/88312)). +- WebXR: Add support for hand tracking ([GH-88411](https://github.com/godotengine/godot/pull/88411)). +- OpenXR: Update to version 1.0.34 ([GH-88574](https://github.com/godotengine/godot/pull/88574)). +- Provide generic interface for XR hand tracking ([GH-88639](https://github.com/godotengine/godot/pull/88639)). +- Fix crash when using OpenXR extension wrappers from GDExtension ([GH-88689](https://github.com/godotengine/godot/pull/88689)). +- Fix building on MinGW ([GH-88724](https://github.com/godotengine/godot/pull/88724)). +- Fix lint errors in WebXR module ([GH-88740](https://github.com/godotengine/godot/pull/88740)). +- OpenXR: Register eye gaze even when disabled ([GH-88754](https://github.com/godotengine/godot/pull/88754)). +- Add body tracking support ([GH-88798](https://github.com/godotengine/godot/pull/88798)). +- Fix XR Body crouching and climbing ([GH-89103](https://github.com/godotengine/godot/pull/89103)). +- Fix XRHandModifier3D scaling ([GH-89130](https://github.com/godotengine/godot/pull/89130)). +- Expose `profile_changed` signal to XRController3D ([GH-89219](https://github.com/godotengine/godot/pull/89219)). +- Consistently use `USE_MULTIVIEW` as the define in shaders ([GH-89376](https://github.com/godotengine/godot/pull/89376)). +- Improve warning when XR shaders are not enabled ([GH-89397](https://github.com/godotengine/godot/pull/89397)). +- Disable XR server when compiling without 3D ([GH-89411](https://github.com/godotengine/godot/pull/89411)). +- Fix XRBodyModifier3D hip driving for avatars no Root bone ([GH-89727](https://github.com/godotengine/godot/pull/89727)). +- Tweak OpenXR alert to mention WMR only on Windows ([GH-89968](https://github.com/godotengine/godot/pull/89968)). +- Allow OpenXR extensions to add properties to the OpenXRCompositionLayer node ([GH-90237](https://github.com/godotengine/godot/pull/90237)). +- Add `intersects_ray()` method to `OpenXRCompositionLayer` ([GH-90286](https://github.com/godotengine/godot/pull/90286)). +- OpenXR: Add refresh rate signal support ([GH-90374](https://github.com/godotengine/godot/pull/90374)). +- Rework XR Trackers to have a common ancestor ([GH-90645](https://github.com/godotengine/godot/pull/90645)). +- Revert `OpenXRHand` to its pre-`SkeletonModifier3D` state ([GH-90759](https://github.com/godotengine/godot/pull/90759)). +- Mark `OpenXRCompositionLayer` and its children as experimental ([GH-90761](https://github.com/godotengine/godot/pull/90761)). +- Remove the Hand enum from XRHandTracker ([GH-91130](https://github.com/godotengine/godot/pull/91130)). +- Add a new property named `offset_rect` to `MobileVRInterface` ([GH-91140](https://github.com/godotengine/godot/pull/91140)). +- MobileVR: Orientation is progressive and needs to be initialized ([GH-91305](https://github.com/godotengine/godot/pull/91305)). +- Store previous relative transforms in `XRHandModifier3D` ([GH-91335](https://github.com/godotengine/godot/pull/91335)). +- OpenXR: Allow composition layers to enable hole punching ([GH-91485](https://github.com/godotengine/godot/pull/91485)). +- OpenXR: Fix composition layers not having correct play space ([GH-91686](https://github.com/godotengine/godot/pull/91686)). +- Fix `layer_viewport` getting cleared on `OpenXRCompositionLayer` in editor ([GH-91775](https://github.com/godotengine/godot/pull/91775)). +- Fix sample count on OpenXR composition layers ([GH-91952](https://github.com/godotengine/godot/pull/91952)). +- OpenXR: Fix updating swapchain for foveation ([GH-92137](https://github.com/godotengine/godot/pull/92137)). +- Allow `OpenXRCompositionLayer` property `layer_viewport` to always be assigned `nullptr` ([GH-92200](https://github.com/godotengine/godot/pull/92200)). +- Apply reference frame transform to `OpenXRCompositionLayer` nodes ([GH-92339](https://github.com/godotengine/godot/pull/92339)). +- Set `XRHandTracker` property `has_tracking_data` to true only when palm joint is tracked ([GH-92801](https://github.com/godotengine/godot/pull/92801)). +- OpenXR: Add HTC/MSFT hand interaction profiles ([GH-93075](https://github.com/godotengine/godot/pull/93075)). +- Check for bad input in `make_vrs_texture` ([GH-93536](https://github.com/godotengine/godot/pull/93536)). +- WebXR: Fix closure compiler mangling `XRSession.enabledFeatures` ([GH-93593](https://github.com/godotengine/godot/pull/93593)). +- Fix WebXR palm joint calculation to include rotation ([GH-93614](https://github.com/godotengine/godot/pull/93614)). +- Improve WebXR API docs related to hand tracking support ([GH-93633](https://github.com/godotengine/godot/pull/93633)). +- Fix support for environment blend modes on `WebXRInterface` ([GH-93646](https://github.com/godotengine/godot/pull/93646)). +- OpenXR: Fix `LOCAL_FLOOR` emulation on HTC Vive XR Elite ([GH-93678](https://github.com/godotengine/godot/pull/93678)). +- OpenXR: Couple of small fixes on the action map ([GH-94158](https://github.com/godotengine/godot/pull/94158)). +- Fix creating default action map ([GH-94457](https://github.com/godotengine/godot/pull/94457)). +- OpenXR: Fix enabling passthrough via environment blend mode in project settings ([GH-94550](https://github.com/godotengine/godot/pull/94550)). ## Past releases +- [4.2](https://github.com/godotengine/godot/blob/4.2-stable/CHANGELOG.md) - [4.1](https://github.com/godotengine/godot/blob/4.1-stable/CHANGELOG.md) - [4.0](https://github.com/godotengine/godot/blob/4.0-stable/CHANGELOG.md) - [3.5](https://github.com/godotengine/godot/blob/3.5-stable/CHANGELOG.md) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 1e32c87c0167..5b6dcbb567bd 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -70,7 +70,8 @@ Copyright: 2020, Manuel Prandini 2007-2014, Juan Linietsky, Ariel Manzur License: Expat -Files: ./platform/android/java/lib/aidl/com/android/* +Files: ./platform/android/java/editor/src/main/java/com/android/* + ./platform/android/java/lib/aidl/com/android/* ./platform/android/java/lib/res/layout/status_bar_ongoing_event_progress_bar.xml ./platform/android/java/lib/src/com/google/android/* ./platform/android/java/lib/src/org/godotengine/godot/input/InputManagerCompat.java @@ -475,6 +476,11 @@ Comment: RVO2 Copyright: 2016, University of North Carolina at Chapel Hill License: Apache-2.0 +Files: ./thirdparty/spirv-cross/ +Comment: SPIRV-Cross +Copyright: 2015-2021, Arm Limited +License: Apache-2.0 or Expat + Files: ./thirdparty/spirv-reflect/ Comment: SPIRV-Reflect Copyright: 2017-2022, Google Inc. diff --git a/DONORS.md b/DONORS.md index b62957867556..314a0f649637 100644 --- a/DONORS.md +++ b/DONORS.md @@ -12,13 +12,12 @@ generous deed immortalized in the next stable release of Godot Engine. ## Patrons + Khronos® Group OSS Capital - Re-Logic ## Platinum sponsors - Google Play - Heroic Labs + Google Play Ramatak V-Sekai W4 Games @@ -26,46 +25,47 @@ generous deed immortalized in the next stable release of Godot Engine. ## Gold sponsors Mega Crit - Pirate Software - Prehensile Tales + Pirate Software + Prehensile Tales Robot Gentleman ## Silver sponsors - Broken Rules - Chasing Carrots + Broken Rules + Chasing Carrots + Copia Wealth Studios Indoor Astronaut + LoadComplete Null Orbital Knight Playful Studios + Re-Logic ## Diamond members - Sealow - Sylv - And 4 anonymous donors + Bippinbits + Sylv + And 3 anonymous donors ## Titanium members - Adriaan de Jongh + Adriaan de Jongh + Anitya Space Basically Games - FDG Entertainment - Game Dev Artisan + FDG Entertainment + Game Dev Artisan Garry Newman - Isaiah Smith Kenney - Libretrend + Libretrend Life Art Studios Lucid Silence Games Matthew Campbell - Maxim Karsten PolyMars - RPG in a Box Razenpok - Smirk Software - Sterling Long - Sunshower - TrampolineTales + RPG in a Box + Smirk Software + Studio Sunshower + TrampolineTales 粟二华 (Su Erhua) And 4 anonymous donors @@ -73,28 +73,24 @@ generous deed immortalized in the next stable release of Godot Engine. Andy Touch BlockImperiumGames (BIG) - Christian Baune - Christoph Woinke Christopher Shifflett + Christoph Woinke + Cody Bentley Darrin Massena - Druvsaft Edward Flick - getIntoGameDev + GetIntoGameDev HP van Braam iCommitGames Jonah Stich - Justin McGettigan Justo Delgado Baudí katnamag - Marek Belski Matthew Ekenstedt Memories in 8Bit Mike King - Nassor Paulino da Silva Neal Gompa (Conan Kudo) + Radivarig Ronnie Cheng Ryan Heath - Samantha Scott Pezza ShikadiGum Silver Creek Entertainment @@ -102,35 +98,39 @@ generous deed immortalized in the next stable release of Godot Engine. Stephan Kessler Stephan Lanfermann TigerJ - Tim Yuen Violin Iliev Vladimír Chvátil - And 15 anonymous donors + And 13 anonymous donors ## Gold members - @reilaos + 80px + afreytes + alMoo Games alMoo Games Alva Majo - Amadan Interactive (Cillian Clifford) Antti Vesanen - Artur Ilkaev Asher Glick - Ben Burbank - Ben Rog-Wilhelm + Axthelm + Bellbird Studio Benito Benjamin Sarsgard + Ben Rog-Wilhelm Bernd Barsuhn - Blake Farnsworth + BetaTester704 Brian Levinsen Brut + Bryce Dixon + c64cosmin Carlo del Mundo - Chickensoft + Carl van der Geest + Chocolate Software + Cindy Trieu ClarkThyLord - Cosmin Munteanu - cowoder - Coy Humphrey + Codex404 + cora Daniel Eichler + Daniel Krafft David Chen Zhen David Coles David Hubber @@ -138,129 +138,156 @@ generous deed immortalized in the next stable release of Godot Engine. Deakcor Delton Ding dfseifert - Don't You Know Who I Am? Inc. + dgehrig + dhanielk + Distorted Realities + Donkung Dono + Don't You Know Who I Am? Inc. Dustuu + Dylan P. Edelweiss - ElektroFox - endaye Ends - Eren Öğrül + Eren Ogrul + Eric Brand Eric Phy Faisal Al-Kubaisi (QatariGameDev) + Felix Adam FeralBytes - Garrus Vakarian + Festzeltgaming.de + Frozen Fractal + Gaudipern GlassBrick Grau Guangzhou Lingchan - Here's my 20 cents + Hayden Oliver hiulit Illyan + Immaculate Lift Studio + Ivan Tabashki Jacob (HACKhalo2 Studios) Jam Jason Cawood Javier Roman - Joel Martinez + Jeff Hungerford + Jeronimo Schreyer + Johannes Wuensch John Gabriel - Jon Woodward + Jonas Yamazaki + Jonathan José Canepa - Justin Sasso + Joshua Stelly + Kalydi Balázs KAR Games - Karasu Studio + Kiri "ExpiredPopsicle" Artemis + KOGA Mitsuhiro (@shiena) korinVR Kristian Kriehl + Lars Thießen + Lisandro Lorea (Red Mage Games) Logan Apple Luca Junge - Luca Vazzano LyaaaaaGames - MHDante - Malcolm Nixon + m1n1ster Manuel Requena Mara Huldra + Marek Belski Martin Šenkeřík - Megabit Interactive + MHDante Michael Gooch Modus Ponens + Moshe Harris + Moth + Mr. Byte + Nassor Paulino da Silva nezticle Niklas Wahrman + Nitzan Bueno + Niwl Games NotNet - Obelisk Island Studios + Oathbringer + Officine Pixel ohanaya3 + Okatima AB Oleksii Nosov - Pav Soor - RAWRLAB Games - RadenTheFolf + Osirisa + Patrick Traynor + Petr Malac + pirey Rafa Laguna + @reilaos Request re:thinc - Robin Ward - Saltlight Studio + Richard Ivánek + Rudi P + Sam Leathers Samuel Judd ScoreSpace + Shiny Shinken Silverclad Studios Sofox Space Kraken Studios + spacesloth Spoony Panda TANAKA Yu - TaraSophieDev + TaraSophieDev (pls fix #43093) + Thad Guidry ThatGamer - ThePolyglotProgrammer + The Polyglot Programmer + TheRiverNyx + Thomas Lobig Tim Nedvyga Tom Langwaldt Trevor Slocum tukon + Tyler C Vagastella Vincent Foulon + Vojtech Lacina + Watchinofoye Weasel Games + Wilson Birney + Wolfram WuotanStudios.com - Yury K. - Zee Weasel Zhu Li zikes + 嗯大爷 + 潘彦圣 Alex Khayrullin Algebrute Andriy Antanas Paskauskas - anti666 Ari Arisaka Mayuki Arthur S. Muszynski - Bread Cameron Connolly Charlie Whitfield Craig Ostrin Craig Swain CzechBlueBear - Daniel Eichler Dennis Belfrage Emily A. Bellows - Eric Brand Felix Winterhalter Fransiska Harry Tumber - Harvey Fong James Couzens Jared White Jesús Chicharro Joel Fivat Johnathan Kupferer Josef Stumpfegger - Josh Nygaard Joshua Lesperance Kelteseth - Khora kickmaniac Liam Smyth LoparPanda Martin Gulliksson - Martin Soucek Michael Dürwald Michael Policastro n00sh Nicolás Monner Sans Nikita Rotskov - Nikola Whallon Oliver Dick Patrick Wuttke Pete Goodwin @@ -281,24 +308,15 @@ generous deed immortalized in the next stable release of Godot Engine. toto bibi Valryia VoidPointer - wpbirney420 Yifan Lai - zkip lan - Aaron Mayfield Adam Carr Adam Smeltzer Adisibio - Adrien de Pierres - Agustinus Arya Aidan Marwick Aidan O'Flannagain - aiekick - Aiguo Wang AJWolbers - Aki Mimoto Alan Beauchamp - Alejandro Saucedo Alexander Erlemann Alex Clavelle alex raeside @@ -313,20 +331,14 @@ generous deed immortalized in the next stable release of Godot Engine. Aubrey Falconer Austin Miller AzulCrescent - Balázs Batári Beau Seymour Benedikt - Ben Visness - Bill Thibault Bread Brian Ford Caleb Makela Cameron Meyer Carl van der Geest - Cerno_b - ChainZ Checkpoint Charlie - chendrak Chris Cavalluzzi Chris Jagusch Chris Lee @@ -334,12 +346,10 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Ringshofer Christoph Czurda Christophe Gagnier - Ciyvius Cody Parker Conall O Corchari Corey W - cynwav Dakota Watkins Daniele Tolomelli Daniel Ramos @@ -354,29 +364,22 @@ generous deed immortalized in the next stable release of Godot Engine. Devin R Dimitri Roche Donovan Hutcheon - dragoon Ducky Duodecimal - Edward Swartz Egon Elbre Elijah Anderson Eric Persson Eric Stokes Eric Williams Erkki Seppälä - Ewan Holmes - Felix Adam Frank Frying☆Pan Game Endeavor gamerminstrel - Garrett Steffen + Garrett S Gary Thomas gebba - Green Fox Greyson Richey - Grominet - Guldoman Guo Hongci Haplo Helge Maus @@ -392,10 +395,6 @@ generous deed immortalized in the next stable release of Godot Engine. Jamie Massey JARKKO PARVIAINEN Jason Evans - Jeff Hungerford - Jeffrey Berube - Jennifer Graves - Joakim Askenbäck Jonas Jonas Arndt Jonas Yamazaki @@ -403,17 +402,11 @@ generous deed immortalized in the next stable release of Godot Engine. Jon Sully Joseph Catrambone Josh Taylor - Joshua Heidrich Juanfran - Juan Maggi Julian le Roux Justin Spedding - Kalydi Balázs - Keegan Scott Keith Bradner - Kent Jofur kindzadza - Kodera Software KsyTek Games Kyle Burnett Kyle Haltermann @@ -437,8 +430,6 @@ generous deed immortalized in the next stable release of Godot Engine. Martin Holas Martin Liška Martin Trbola - Matěj Drábek - Mateo Navarrete Mathieu Matt Edwards Maverick @@ -447,14 +438,9 @@ generous deed immortalized in the next stable release of Godot Engine. Melissa Mears Metal Demon 2000 Michael Morrison - Michal Skwarek - Mikael Nordenberg - Mikayla Mike Copley Molly Jameson - MoltenGears Moritz Weissenberger - MrAZIE Mrjemandem naonya3 Nathaniel @@ -463,38 +449,28 @@ generous deed immortalized in the next stable release of Godot Engine. Neofytos Chimonas Nerdforge Nerdyninja - Nick Eldrenkamp - Nicolas Rosset Nik Rudenko Noel Billig - Oscar Domingo ozrk - Parth Patel Patrick Horn Patrickm Patrick Nafarrete Paul Black Paul Gieske - Paul Mozet Pete - Philip Ludington (MrPhil) Phoenix Jauregui Pierre Caye Pixel Archipel Point08 - Portponky PsycHead Quincy Quincy Quinn Morrison Raghava Kovvali - RagingRoosevelt Ragnar Pettersson Rammeow - Rebecca H Richard Hayes Riley RobotCritter - Roka Roland Rząsa Russ Ryan Groom @@ -502,22 +478,16 @@ generous deed immortalized in the next stable release of Godot Engine. Satnam Singh Sebastian Michailidis SeongWan Kim - Sessamekesh Shane Lillie Shane Spoor Shaun Kohanowski - simdee Simon Jonas Larsen Simon Schoenenberger Sina Yeganeh - sirn Skalli slavfox - smbe19 smo1704 SpicyCactuar - SquidgySapphic - Squirrel Stephen Rice Stephen Schlie Sven Walter @@ -527,20 +497,14 @@ generous deed immortalized in the next stable release of Godot Engine. TheVoiceInMyHead Thibaut DECROMBECQUE thomas - Thomas Bechtold Thomas Pickett Tim Drumheller Tim Klein - Timothy B. MacDonald - Tim Raveling - Tim Riley Tom Webster Trent Skinner - Tyler Stafos Tyler Stepke Uther Vaughan Ling - vgmoose vlnx Wapiti . Wiley Thompson @@ -549,7 +513,7 @@ generous deed immortalized in the next stable release of Godot Engine. ケルベロス 貴宏 小松 - And 201 anonymous donors + And 176 anonymous donors ## Silver and bronze donors diff --git a/SConstruct b/SConstruct index a1f28b1fc607..0245531b45e2 100644 --- a/SConstruct +++ b/SConstruct @@ -218,10 +218,11 @@ opts.Add(BoolVariable("deprecated", "Enable compatibility code for deprecated an opts.Add(EnumVariable("precision", "Set the floating-point precision level", "single", ("single", "double"))) opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True)) opts.Add(BoolVariable("brotli", "Enable Brotli for decompresson and WOFF2 fonts support", True)) -opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False)) +opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver on supported platforms", False)) opts.Add(BoolVariable("vulkan", "Enable the vulkan rendering driver", True)) opts.Add(BoolVariable("opengl3", "Enable the OpenGL/GLES3 rendering driver", True)) -opts.Add(BoolVariable("d3d12", "Enable the Direct3D 12 rendering driver", False)) +opts.Add(BoolVariable("d3d12", "Enable the Direct3D 12 rendering driver on supported platforms", False)) +opts.Add(BoolVariable("metal", "Enable the Metal rendering driver on supported platforms (Apple arm64 only)", False)) opts.Add(BoolVariable("openxr", "Enable the OpenXR driver", True)) opts.Add(BoolVariable("use_volk", "Use the volk library to load the Vulkan loader dynamically", True)) opts.Add(BoolVariable("disable_exceptions", "Force disabling exception handling code", True)) @@ -229,11 +230,22 @@ opts.Add("custom_modules", "A list of comma-separated directory paths containing opts.Add(BoolVariable("custom_modules_recursive", "Detect custom modules recursively for each specified path.", True)) # Advanced options -opts.Add(BoolVariable("dev_mode", "Alias for dev options: verbose=yes warnings=extra werror=yes tests=yes", False)) +opts.Add( + BoolVariable( + "dev_mode", "Alias for dev options: verbose=yes warnings=extra werror=yes tests=yes strict_checks=yes", False + ) +) opts.Add(BoolVariable("tests", "Build the unit tests", False)) opts.Add(BoolVariable("fast_unsafe", "Enable unsafe options for faster rebuilds", False)) opts.Add(BoolVariable("ninja", "Use the ninja backend for faster rebuilds", False)) +opts.Add(BoolVariable("ninja_auto_run", "Run ninja automatically after generating the ninja file", True)) +opts.Add("ninja_file", "Path to the generated ninja file", "build.ninja") opts.Add(BoolVariable("compiledb", "Generate compilation DB (`compile_commands.json`) for external tools", False)) +opts.Add( + "num_jobs", + "Use up to N jobs when compiling (equivalent to `-j N`). Defaults to max jobs - 1. Ignored if -j is used.", + "", +) opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False)) opts.Add(BoolVariable("progress", "Show a progress indicator during compilation", True)) opts.Add(EnumVariable("warnings", "Level of compilation warnings", "all", ("extra", "all", "moderate", "no"))) @@ -254,6 +266,7 @@ opts.Add( "", ) opts.Add(BoolVariable("use_precise_math_checks", "Math checks use very precise epsilon (debug option)", False)) +opts.Add(BoolVariable("strict_checks", "Enforce stricter checks (debug option)", False)) opts.Add(BoolVariable("scu_build", "Use single compilation unit build", False)) opts.Add("scu_limit", "Max includes per SCU file when using scu_build (determines RAM use)", "0") opts.Add(BoolVariable("engine_update_check", "Enable engine update checks in the Project Manager", True)) @@ -537,16 +550,22 @@ initial_num_jobs = env.GetOption("num_jobs") altered_num_jobs = initial_num_jobs + 1 env.SetOption("num_jobs", altered_num_jobs) if env.GetOption("num_jobs") == altered_num_jobs: - cpu_count = os.cpu_count() - if cpu_count is None: - print_warning("Couldn't auto-detect CPU count to configure build parallelism. Specify it with the -j argument.") + num_jobs = env.get("num_jobs", "") + if str(num_jobs).isdigit() and int(num_jobs) > 0: + env.SetOption("num_jobs", num_jobs) else: - safer_cpu_count = cpu_count if cpu_count <= 4 else cpu_count - 1 - print( - "Auto-detected %d CPU cores available for build parallelism. Using %d cores by default. You can override it with the -j argument." - % (cpu_count, safer_cpu_count) - ) - env.SetOption("num_jobs", safer_cpu_count) + cpu_count = os.cpu_count() + if cpu_count is None: + print_warning( + "Couldn't auto-detect CPU count to configure build parallelism. Specify it with the `-j` or `num_jobs` arguments." + ) + else: + safer_cpu_count = cpu_count if cpu_count <= 4 else cpu_count - 1 + print( + "Auto-detected %d CPU cores available for build parallelism. Using %d cores by default. You can override it with the `-j` or `num_jobs` arguments." + % (cpu_count, safer_cpu_count) + ) + env.SetOption("num_jobs", safer_cpu_count) env.extra_suffix = "" @@ -588,12 +607,16 @@ if env["dev_mode"]: env["warnings"] = ARGUMENTS.get("warnings", "extra") env["werror"] = methods.get_cmdline_bool("werror", True) env["tests"] = methods.get_cmdline_bool("tests", True) + env["strict_checks"] = methods.get_cmdline_bool("strict_checks", True) if env["production"]: env["use_static_cpp"] = methods.get_cmdline_bool("use_static_cpp", True) env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False) # LTO "auto" means we handle the preferred option in each platform detect.py. env["lto"] = ARGUMENTS.get("lto", "auto") +if env["strict_checks"]: + env.Append(CPPDEFINES=["STRICT_CHECKS"]) + # Run SCU file generation script if in a SCU build. if env["scu_build"]: max_includes_per_scu = 8 @@ -773,6 +796,12 @@ else: # MSVC doesn't have clear C standard support, /std only covers C++. # We apply it to CCFLAGS (both C and C++ code) in case it impacts C features. env.Prepend(CCFLAGS=["/std:c++17"]) + # MSVC is non-conforming with the C++ standard by default, so we enable more conformance. + # Note that this is still not complete conformance, as certain Windows-related headers + # don't compile under complete conformance. + env.Prepend(CCFLAGS=["/permissive-"]) + # Allow use of `__cplusplus` macro to determine C++ standard universally. + env.Prepend(CXXFLAGS=["/Zc:__cplusplus"]) # Disable exception handling. Godot doesn't use exceptions anywhere, and this # saves around 20% of binary size and very significant build time (GH-80513). @@ -785,7 +814,7 @@ elif env.msvc: env.Append(CXXFLAGS=["/EHsc"]) # Configure compiler warnings -if env.msvc: # MSVC +if env.msvc and not methods.using_clang(env): # MSVC if env["warnings"] == "no": env.Append(CCFLAGS=["/w"]) else: @@ -835,8 +864,11 @@ else: # GCC, Clang # for putting them in `Set` or `Map`. We don't mind about unreliable ordering. common_warnings += ["-Wno-ordered-compare-function-pointers"] + # clang-cl will interpret `-Wall` as `-Weverything`, workaround with compatibility cast + W_ALL = "-Wall" if not env.msvc else "-W3" + if env["warnings"] == "extra": - env.Append(CCFLAGS=["-Wall", "-Wextra", "-Wwrite-strings", "-Wno-unused-parameter"] + common_warnings) + env.Append(CCFLAGS=[W_ALL, "-Wextra", "-Wwrite-strings", "-Wno-unused-parameter"] + common_warnings) env.Append(CXXFLAGS=["-Wctor-dtor-privacy", "-Wnon-virtual-dtor"]) if methods.using_gcc(env): env.Append( @@ -858,9 +890,9 @@ else: # GCC, Clang elif methods.using_clang(env) or methods.using_emcc(env): env.Append(CCFLAGS=["-Wimplicit-fallthrough"]) elif env["warnings"] == "all": - env.Append(CCFLAGS=["-Wall"] + common_warnings) + env.Append(CCFLAGS=[W_ALL] + common_warnings) elif env["warnings"] == "moderate": - env.Append(CCFLAGS=["-Wall", "-Wno-unused"] + common_warnings) + env.Append(CCFLAGS=[W_ALL, "-Wno-unused"] + common_warnings) else: # 'no' env.Append(CCFLAGS=["-w"]) @@ -1011,11 +1043,14 @@ if env["vsproj"]: env.vs_incs = [] env.vs_srcs = [] -if env["compiledb"] and env.scons_version < (4, 0, 0): - # Generating the compilation DB (`compile_commands.json`) requires SCons 4.0.0 or later. - print_error("The `compiledb=yes` option requires SCons 4.0 or later, but your version is %s." % scons_raw_version) - Exit(255) -if env.scons_version >= (4, 0, 0): +if env["compiledb"]: + if env.scons_version < (4, 0, 0): + # Generating the compilation DB (`compile_commands.json`) requires SCons 4.0.0 or later. + print_error( + "The `compiledb=yes` option requires SCons 4.0 or later, but your version is %s." % scons_raw_version + ) + Exit(255) + env.Tool("compilation_db") env.Alias("compiledb", env.CompilationDatabase()) @@ -1025,12 +1060,9 @@ if env["ninja"]: Exit(255) SetOption("experimental", "ninja") - env.Tool("ninja") - - # By setting this we allow the user to run ninja by themselves with all - # the flags they need, as apparently automatically running from scons - # is way slower. - SetOption("disable_execute_ninja", True) + env["NINJA_FILE_NAME"] = env["ninja_file"] + env["NINJA_DISABLE_AUTO_RUN"] = not env["ninja_auto_run"] + env.Tool("ninja", "build.ninja") # Threads if env["threads"]: @@ -1069,7 +1101,6 @@ if "check_c_headers" in env: env.AppendUnique(CPPDEFINES=[headers[header]]) -# FIXME: This method mixes both cosmetic progress stuff and cache handling... methods.show_progress(env) # TODO: replace this with `env.Dump(format="json")` # once we start requiring SCons 4.0 as min version. @@ -1093,7 +1124,7 @@ atexit.register(print_elapsed_time) def purge_flaky_files(): - paths_to_keep = ["ninja.build"] + paths_to_keep = ["build.ninja"] for build_failure in GetBuildFailures(): path = build_failure.node.path if os.path.isfile(path) and path not in paths_to_keep: @@ -1101,3 +1132,5 @@ def purge_flaky_files(): atexit.register(purge_flaky_files) + +methods.clean_cache(env) diff --git a/core/SCsub b/core/SCsub index 1bd4eae16c4c..c8267ae96002 100644 --- a/core/SCsub +++ b/core/SCsub @@ -140,7 +140,7 @@ if env["builtin_zstd"]: "decompress/zstd_decompress_block.c", "decompress/zstd_decompress.c", ] - if env["platform"] in ["android", "ios", "linuxbsd", "macos"]: + if env["platform"] in ["android", "ios", "linuxbsd", "macos"] and env["arch"] == "x86_64": # Match platforms with ZSTD_ASM_SUPPORTED in common/portability_macros.h thirdparty_zstd_sources.append("decompress/huf_decompress_amd64.S") thirdparty_zstd_sources = [thirdparty_zstd_dir + file for file in thirdparty_zstd_sources] diff --git a/core/config/engine.cpp b/core/config/engine.cpp index 3574430cf752..9cdc21fe8e2d 100644 --- a/core/config/engine.cpp +++ b/core/config/engine.cpp @@ -263,6 +263,10 @@ bool Engine::is_generate_spirv_debug_info_enabled() const { return generate_spirv_debug_info; } +bool Engine::is_extra_gpu_memory_tracking_enabled() const { + return extra_gpu_memory_tracking; +} + void Engine::set_print_error_messages(bool p_enabled) { CoreGlobals::print_error_enabled = p_enabled; } diff --git a/core/config/engine.h b/core/config/engine.h index 7e617d8773a0..f858eba32838 100644 --- a/core/config/engine.h +++ b/core/config/engine.h @@ -72,6 +72,7 @@ class Engine { bool abort_on_gpu_errors = false; bool use_validation_layers = false; bool generate_spirv_debug_info = false; + bool extra_gpu_memory_tracking = false; int32_t gpu_idx = -1; uint64_t _process_frames = 0; @@ -181,6 +182,7 @@ class Engine { bool is_abort_on_gpu_errors_enabled() const; bool is_validation_layers_enabled() const; bool is_generate_spirv_debug_info_enabled() const; + bool is_extra_gpu_memory_tracking_enabled() const; int32_t get_gpu_index() const; void increment_frames_drawn(); diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 37a2608c102c..7951ee9eddb6 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1016,7 +1016,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust } } // Check for the existence of a csproj file. - if (_csproj_exists(p_path.get_base_dir())) { + if (_csproj_exists(get_resource_path())) { // If there is a csproj file, add the C# feature if it doesn't already exist. if (!project_features.has("C#")) { project_features.append("C#"); @@ -1472,10 +1472,6 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF(PropertyInfo(Variant::INT, "display/window/size/window_height_override", PROPERTY_HINT_RANGE, "0,4320,1,or_greater"), 0); // 8K resolution GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true); -#ifdef TOOLS_ENABLED - GLOBAL_DEF("display/window/energy_saving/keep_screen_on.editor_hint", false); -#endif - GLOBAL_DEF("animation/warnings/check_invalid_track_paths", true); GLOBAL_DEF("animation/warnings/check_angle_interpolation_type_conflicting", true); @@ -1489,15 +1485,6 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF(PropertyInfo(Variant::INT, "audio/general/ios/session_category", PROPERTY_HINT_ENUM, "Ambient,Multi Route,Play and Record,Playback,Record,Solo Ambient"), 0); GLOBAL_DEF("audio/general/ios/mix_with_others", false); - PackedStringArray extensions; - extensions.push_back("gd"); - if (ClassDB::class_exists("CSharpScript")) { - extensions.push_back("cs"); - } - extensions.push_back("gdshader"); - - GLOBAL_DEF(PropertyInfo(Variant::PACKED_STRING_ARRAY, "editor/script/search_in_file_extensions"), extensions); - _add_builtin_input_map(); // Keep the enum values in sync with the `DisplayServer::ScreenOrientation` enum. @@ -1570,6 +1557,11 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF("collada/use_ambient", false); + // Input settings + GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_long_press_as_right_click", false); + GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", false); + GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "input_devices/pointing/android/rotary_input_scroll_axis", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1); + // These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix(). GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray()); GLOBAL_DEF_INTERNAL("internationalization/locale/translation_remaps", PackedStringArray()); @@ -1582,6 +1574,7 @@ ProjectSettings::ProjectSettings() { ProjectSettings::ProjectSettings(const String &p_path) { if (load_custom(p_path) == OK) { + resource_path = p_path.get_base_dir(); project_loaded = true; } } diff --git a/core/core_bind.compat.inc b/core/core_bind.compat.inc new file mode 100644 index 000000000000..3e8ac3c5de6a --- /dev/null +++ b/core/core_bind.compat.inc @@ -0,0 +1,57 @@ +/**************************************************************************/ +/* core_bind.compat.inc */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef DISABLE_DEPRECATED + +namespace core_bind { + +// Semaphore + +void Semaphore::_post_bind_compat_93605() { + post(1); +} + +void Semaphore::_bind_compatibility_methods() { + ClassDB::bind_compatibility_method(D_METHOD("post"), &Semaphore::_post_bind_compat_93605); +} + +// OS + +Dictionary OS::_execute_with_pipe_bind_compat_94434(const String &p_path, const Vector &p_arguments) { + return execute_with_pipe(p_path, p_arguments, true); +} + +void OS::_bind_compatibility_methods() { + ClassDB::bind_compatibility_method(D_METHOD("execute_with_pipe", "path", "arguments"), &OS::_execute_with_pipe_bind_compat_94434); +} + +} // namespace core_bind + +#endif // DISABLE_DEPRECATED diff --git a/core/core_bind.cpp b/core/core_bind.cpp index a1b7b81111df..bbfbb6e3cd7d 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -29,6 +29,7 @@ /**************************************************************************/ #include "core_bind.h" +#include "core_bind.compat.inc" #include "core/config/project_settings.h" #include "core/crypto/crypto_core.h" @@ -56,8 +57,11 @@ Error ResourceLoader::load_threaded_request(const String &p_path, const String & ResourceLoader::ThreadLoadStatus ResourceLoader::load_threaded_get_status(const String &p_path, Array r_progress) { float progress = 0; ::ResourceLoader::ThreadLoadStatus tls = ::ResourceLoader::load_threaded_get_status(p_path, &progress); - r_progress.resize(1); - r_progress[0] = progress; + // Default array should never be modified, it causes the hash of the method to change. + if (!ClassDB::is_default_array_arg(r_progress)) { + r_progress.resize(1); + r_progress[0] = progress; + } return (ThreadLoadStatus)tls; } @@ -115,6 +119,11 @@ bool ResourceLoader::has_cached(const String &p_path) { return ResourceCache::has(local_path); } +Ref ResourceLoader::get_cached_ref(const String &p_path) { + String local_path = ProjectSettings::get_singleton()->localize_path(p_path); + return ResourceCache::get_ref(local_path); +} + bool ResourceLoader::exists(const String &p_path, const String &p_type_hint) { return ::ResourceLoader::exists(p_path, p_type_hint); } @@ -125,7 +134,7 @@ ResourceUID::ID ResourceLoader::get_resource_uid(const String &p_path) { void ResourceLoader::_bind_methods() { ClassDB::bind_method(D_METHOD("load_threaded_request", "path", "type_hint", "use_sub_threads", "cache_mode"), &ResourceLoader::load_threaded_request, DEFVAL(""), DEFVAL(false), DEFVAL(CACHE_MODE_REUSE)); - ClassDB::bind_method(D_METHOD("load_threaded_get_status", "path", "progress"), &ResourceLoader::load_threaded_get_status, DEFVAL(Array())); + ClassDB::bind_method(D_METHOD("load_threaded_get_status", "path", "progress"), &ResourceLoader::load_threaded_get_status, DEFVAL_ARRAY); ClassDB::bind_method(D_METHOD("load_threaded_get", "path"), &ResourceLoader::load_threaded_get); ClassDB::bind_method(D_METHOD("load", "path", "type_hint", "cache_mode"), &ResourceLoader::load, DEFVAL(""), DEFVAL(CACHE_MODE_REUSE)); @@ -135,6 +144,7 @@ void ResourceLoader::_bind_methods() { ClassDB::bind_method(D_METHOD("set_abort_on_missing_resources", "abort"), &ResourceLoader::set_abort_on_missing_resources); ClassDB::bind_method(D_METHOD("get_dependencies", "path"), &ResourceLoader::get_dependencies); ClassDB::bind_method(D_METHOD("has_cached", "path"), &ResourceLoader::has_cached); + ClassDB::bind_method(D_METHOD("get_cached_ref", "path"), &ResourceLoader::get_cached_ref); ClassDB::bind_method(D_METHOD("exists", "path", "type_hint"), &ResourceLoader::exists, DEFVAL("")); ClassDB::bind_method(D_METHOD("get_resource_uid", "path"), &ResourceLoader::get_resource_uid); @@ -300,19 +310,22 @@ int OS::execute(const String &p_path, const Vector &p_arguments, Array r String pipe; int exitcode = 0; Error err = ::OS::get_singleton()->execute(p_path, args, &pipe, &exitcode, p_read_stderr, nullptr, p_open_console); - r_output.push_back(pipe); + // Default array should never be modified, it causes the hash of the method to change. + if (!ClassDB::is_default_array_arg(r_output)) { + r_output.push_back(pipe); + } if (err != OK) { return -1; } return exitcode; } -Dictionary OS::execute_with_pipe(const String &p_path, const Vector &p_arguments) { +Dictionary OS::execute_with_pipe(const String &p_path, const Vector &p_arguments, bool p_blocking) { List args; for (const String &arg : p_arguments) { args.push_back(arg); } - return ::OS::get_singleton()->execute_with_pipe(p_path, args); + return ::OS::get_singleton()->execute_with_pipe(p_path, args, p_blocking); } int OS::create_instance(const Vector &p_arguments) { @@ -611,8 +624,8 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("get_system_font_path_for_text", "font_name", "text", "locale", "script", "weight", "stretch", "italic"), &OS::get_system_font_path_for_text, DEFVAL(String()), DEFVAL(String()), DEFVAL(400), DEFVAL(100), DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_executable_path"), &OS::get_executable_path); ClassDB::bind_method(D_METHOD("read_string_from_stdin"), &OS::read_string_from_stdin); - ClassDB::bind_method(D_METHOD("execute", "path", "arguments", "output", "read_stderr", "open_console"), &OS::execute, DEFVAL(Array()), DEFVAL(false), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("execute_with_pipe", "path", "arguments"), &OS::execute_with_pipe); + ClassDB::bind_method(D_METHOD("execute", "path", "arguments", "output", "read_stderr", "open_console"), &OS::execute, DEFVAL_ARRAY, DEFVAL(false), DEFVAL(false)); + ClassDB::bind_method(D_METHOD("execute_with_pipe", "path", "arguments", "blocking"), &OS::execute_with_pipe, DEFVAL(true)); ClassDB::bind_method(D_METHOD("create_process", "path", "arguments", "open_console"), &OS::create_process, DEFVAL(false)); ClassDB::bind_method(D_METHOD("create_instance", "arguments"), &OS::create_instance); ClassDB::bind_method(D_METHOD("kill", "pid"), &OS::kill); @@ -692,6 +705,7 @@ void OS::_bind_methods() { BIND_ENUM_CONSTANT(RENDERING_DRIVER_VULKAN); BIND_ENUM_CONSTANT(RENDERING_DRIVER_OPENGL3); BIND_ENUM_CONSTANT(RENDERING_DRIVER_D3D12); + BIND_ENUM_CONSTANT(RENDERING_DRIVER_METAL); BIND_ENUM_CONSTANT(SYSTEM_DIR_DESKTOP); BIND_ENUM_CONSTANT(SYSTEM_DIR_DCIM); @@ -1209,14 +1223,15 @@ bool Semaphore::try_wait() { return semaphore.try_wait(); } -void Semaphore::post() { - semaphore.post(); +void Semaphore::post(int p_count) { + ERR_FAIL_COND(p_count <= 0); + semaphore.post(p_count); } void Semaphore::_bind_methods() { ClassDB::bind_method(D_METHOD("wait"), &Semaphore::wait); ClassDB::bind_method(D_METHOD("try_wait"), &Semaphore::try_wait); - ClassDB::bind_method(D_METHOD("post"), &Semaphore::post); + ClassDB::bind_method(D_METHOD("post", "count"), &Semaphore::post, DEFVAL(1)); } ////// Mutex ////// @@ -1404,6 +1419,11 @@ Variant ClassDB::instantiate(const StringName &p_class) const { } } +ClassDB::APIType ClassDB::class_get_api_type(const StringName &p_class) const { + ::ClassDB::APIType api_type = ::ClassDB::get_api_type(p_class); + return (APIType)api_type; +} + bool ClassDB::class_has_signal(const StringName &p_class, const StringName &p_signal) const { return ::ClassDB::has_signal(p_class, p_signal); } @@ -1440,6 +1460,14 @@ TypedArray ClassDB::class_get_property_list(const StringName &p_clas return ret; } +StringName ClassDB::class_get_property_getter(const StringName &p_class, const StringName &p_property) { + return ::ClassDB::get_property_getter(p_class, p_property); +} + +StringName ClassDB::class_get_property_setter(const StringName &p_class, const StringName &p_property) { + return ::ClassDB::get_property_setter(p_class, p_property); +} + Variant ClassDB::class_get_property(Object *p_object, const StringName &p_property) const { Variant ret; ::ClassDB::get_property(p_object, p_property, ret); @@ -1492,6 +1520,23 @@ TypedArray ClassDB::class_get_method_list(const StringName &p_class, return ret; } +Variant ClassDB::class_call_static_method(const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error) { + if (p_argcount < 2) { + r_call_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + return Variant::NIL; + } + if (!p_arguments[0]->is_string() || !p_arguments[1]->is_string()) { + r_call_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; + return Variant::NIL; + } + StringName class_ = *p_arguments[0]; + StringName method = *p_arguments[1]; + const MethodBind *bind = ::ClassDB::get_method(class_, method); + ERR_FAIL_NULL_V_MSG(bind, Variant::NIL, "Cannot find static method."); + ERR_FAIL_COND_V_MSG(!bind->is_static(), Variant::NIL, "Method is not static."); + return bind->call(nullptr, p_arguments + 2, p_argcount - 2, r_call_error); +} + PackedStringArray ClassDB::class_get_integer_constant_list(const StringName &p_class, bool p_no_inheritance) const { List constants; ::ClassDB::get_integer_constant_list(p_class, &constants, p_no_inheritance); @@ -1575,7 +1620,7 @@ void ClassDB::get_argument_options(const StringName &p_function, int p_idx, List pf == "class_has_method" || pf == "class_get_method_list" || pf == "class_get_integer_constant_list" || pf == "class_has_integer_constant" || pf == "class_get_integer_constant" || pf == "class_has_enum" || pf == "class_get_enum_list" || pf == "class_get_enum_constants" || pf == "class_get_integer_constant_enum" || - pf == "is_class_enabled" || pf == "is_class_enum_bitfield"); + pf == "is_class_enabled" || pf == "is_class_enum_bitfield" || pf == "class_get_api_type"); } if (first_argument_is_class || pf == "is_parent_class") { for (const String &E : get_class_list()) { @@ -1596,11 +1641,15 @@ void ClassDB::_bind_methods() { ::ClassDB::bind_method(D_METHOD("can_instantiate", "class"), &ClassDB::can_instantiate); ::ClassDB::bind_method(D_METHOD("instantiate", "class"), &ClassDB::instantiate); + ::ClassDB::bind_method(D_METHOD("class_get_api_type", "class"), &ClassDB::class_get_api_type); + ::ClassDB::bind_method(D_METHOD("class_has_signal", "class", "signal"), &ClassDB::class_has_signal); ::ClassDB::bind_method(D_METHOD("class_get_signal", "class", "signal"), &ClassDB::class_get_signal); ::ClassDB::bind_method(D_METHOD("class_get_signal_list", "class", "no_inheritance"), &ClassDB::class_get_signal_list, DEFVAL(false)); ::ClassDB::bind_method(D_METHOD("class_get_property_list", "class", "no_inheritance"), &ClassDB::class_get_property_list, DEFVAL(false)); + ::ClassDB::bind_method(D_METHOD("class_get_property_getter", "class", "property"), &ClassDB::class_get_property_getter); + ::ClassDB::bind_method(D_METHOD("class_get_property_setter", "class", "property"), &ClassDB::class_get_property_setter); ::ClassDB::bind_method(D_METHOD("class_get_property", "object", "property"), &ClassDB::class_get_property); ::ClassDB::bind_method(D_METHOD("class_set_property", "object", "property", "value"), &ClassDB::class_set_property); @@ -1612,6 +1661,8 @@ void ClassDB::_bind_methods() { ::ClassDB::bind_method(D_METHOD("class_get_method_list", "class", "no_inheritance"), &ClassDB::class_get_method_list, DEFVAL(false)); + ::ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "class_call_static_method", &ClassDB::class_call_static_method, MethodInfo("class_call_static_method", PropertyInfo(Variant::STRING_NAME, "class"), PropertyInfo(Variant::STRING_NAME, "method"))); + ::ClassDB::bind_method(D_METHOD("class_get_integer_constant_list", "class", "no_inheritance"), &ClassDB::class_get_integer_constant_list, DEFVAL(false)); ::ClassDB::bind_method(D_METHOD("class_has_integer_constant", "class", "name"), &ClassDB::class_has_integer_constant); @@ -1625,6 +1676,12 @@ void ClassDB::_bind_methods() { ::ClassDB::bind_method(D_METHOD("is_class_enum_bitfield", "class", "enum", "no_inheritance"), &ClassDB::is_class_enum_bitfield, DEFVAL(false)); ::ClassDB::bind_method(D_METHOD("is_class_enabled", "class"), &ClassDB::is_class_enabled); + + BIND_ENUM_CONSTANT(API_CORE); + BIND_ENUM_CONSTANT(API_EDITOR); + BIND_ENUM_CONSTANT(API_EXTENSION); + BIND_ENUM_CONSTANT(API_EDITOR_EXTENSION); + BIND_ENUM_CONSTANT(API_NONE); } } // namespace special @@ -1738,7 +1795,7 @@ Object *Engine::get_singleton_object(const StringName &p_name) const { void Engine::register_singleton(const StringName &p_name, Object *p_object) { ERR_FAIL_COND_MSG(has_singleton(p_name), "Singleton already registered: " + String(p_name)); - ERR_FAIL_COND_MSG(!String(p_name).is_valid_identifier(), "Singleton name is not a valid identifier: " + p_name); + ERR_FAIL_COND_MSG(!String(p_name).is_valid_ascii_identifier(), "Singleton name is not a valid identifier: " + p_name); ::Engine::Singleton s; s.class_name = p_name; s.name = p_name; diff --git a/core/core_bind.h b/core/core_bind.h index b142a2fbbd9c..2a31e644255f 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -73,7 +73,7 @@ class ResourceLoader : public Object { static ResourceLoader *get_singleton() { return singleton; } Error load_threaded_request(const String &p_path, const String &p_type_hint = "", bool p_use_sub_threads = false, CacheMode p_cache_mode = CACHE_MODE_REUSE); - ThreadLoadStatus load_threaded_get_status(const String &p_path, Array r_progress = Array()); + ThreadLoadStatus load_threaded_get_status(const String &p_path, Array r_progress = ClassDB::default_array_arg); Ref load_threaded_get(const String &p_path); Ref load(const String &p_path, const String &p_type_hint = "", CacheMode p_cache_mode = CACHE_MODE_REUSE); @@ -83,6 +83,7 @@ class ResourceLoader : public Object { void set_abort_on_missing_resources(bool p_abort); PackedStringArray get_dependencies(const String &p_path); bool has_cached(const String &p_path); + Ref get_cached_ref(const String &p_path); bool exists(const String &p_path, const String &p_type_hint = ""); ResourceUID::ID get_resource_uid(const String &p_path); @@ -127,11 +128,18 @@ class OS : public Object { static void _bind_methods(); static OS *singleton; +#ifndef DISABLE_DEPRECATED + Dictionary _execute_with_pipe_bind_compat_94434(const String &p_path, const Vector &p_arguments); + + static void _bind_compatibility_methods(); +#endif + public: enum RenderingDriver { RENDERING_DRIVER_VULKAN, RENDERING_DRIVER_OPENGL3, RENDERING_DRIVER_D3D12, + RENDERING_DRIVER_METAL, }; PackedByteArray get_entropy(int p_bytes); @@ -158,8 +166,8 @@ class OS : public Object { Vector get_system_font_path_for_text(const String &p_font_name, const String &p_text, const String &p_locale = String(), const String &p_script = String(), int p_weight = 400, int p_stretch = 100, bool p_italic = false) const; String get_executable_path() const; String read_string_from_stdin(); - int execute(const String &p_path, const Vector &p_arguments, Array r_output = Array(), bool p_read_stderr = false, bool p_open_console = false); - Dictionary execute_with_pipe(const String &p_path, const Vector &p_arguments); + int execute(const String &p_path, const Vector &p_arguments, Array r_output = ClassDB::default_array_arg, bool p_read_stderr = false, bool p_open_console = false); + Dictionary execute_with_pipe(const String &p_path, const Vector &p_arguments, bool p_blocking = true); int create_process(const String &p_path, const Vector &p_arguments, bool p_open_console = false); int create_instance(const Vector &p_arguments); Error kill(int p_pid); @@ -389,12 +397,17 @@ class Semaphore : public RefCounted { GDCLASS(Semaphore, RefCounted); ::Semaphore semaphore; +protected: static void _bind_methods(); +#ifndef DISABLE_DEPRECATED + void _post_bind_compat_93605(); + static void _bind_compatibility_methods(); +#endif // DISABLE_DEPRECATED public: void wait(); bool try_wait(); - void post(); + void post(int p_count = 1); }; class Thread : public RefCounted { @@ -434,6 +447,14 @@ class ClassDB : public Object { static void _bind_methods(); public: + enum APIType { + API_CORE, + API_EDITOR, + API_EXTENSION, + API_EDITOR_EXTENSION, + API_NONE, + }; + PackedStringArray get_class_list() const; PackedStringArray get_inheriters_from_class(const StringName &p_class) const; StringName get_parent_class(const StringName &p_class) const; @@ -442,11 +463,14 @@ class ClassDB : public Object { bool can_instantiate(const StringName &p_class) const; Variant instantiate(const StringName &p_class) const; + APIType class_get_api_type(const StringName &p_class) const; bool class_has_signal(const StringName &p_class, const StringName &p_signal) const; Dictionary class_get_signal(const StringName &p_class, const StringName &p_signal) const; TypedArray class_get_signal_list(const StringName &p_class, bool p_no_inheritance = false) const; TypedArray class_get_property_list(const StringName &p_class, bool p_no_inheritance = false) const; + StringName class_get_property_getter(const StringName &p_class, const StringName &p_property); + StringName class_get_property_setter(const StringName &p_class, const StringName &p_property); Variant class_get_property(Object *p_object, const StringName &p_property) const; Error class_set_property(Object *p_object, const StringName &p_property, const Variant &p_value) const; @@ -457,6 +481,7 @@ class ClassDB : public Object { int class_get_method_argument_count(const StringName &p_class, const StringName &p_method, bool p_no_inheritance = false) const; TypedArray class_get_method_list(const StringName &p_class, bool p_no_inheritance = false) const; + Variant class_call_static_method(const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error); PackedStringArray class_get_integer_constant_list(const StringName &p_class, bool p_no_inheritance = false) const; bool class_has_integer_constant(const StringName &p_class, const StringName &p_name) const; @@ -618,4 +643,6 @@ VARIANT_ENUM_CAST(core_bind::Geometry2D::PolyEndType); VARIANT_ENUM_CAST(core_bind::Thread::Priority); +VARIANT_ENUM_CAST(core_bind::special::ClassDB::APIType); + #endif // CORE_BIND_H diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 5322e39ec0de..68af5abf66a3 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -671,6 +671,7 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_INT_IS_OBJECTID); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_INT_IS_POINTER); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_ARRAY_TYPE); + BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_DICTIONARY_TYPE); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LOCALE_ID); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_LOCALIZABLE_STRING); BIND_CORE_ENUM_CONSTANT(PROPERTY_HINT_NODE_TYPE); diff --git a/core/crypto/crypto.cpp b/core/crypto/crypto.cpp index d3d007941057..62bacadf91aa 100644 --- a/core/crypto/crypto.cpp +++ b/core/crypto/crypto.cpp @@ -36,10 +36,10 @@ /// Resources -CryptoKey *(*CryptoKey::_create)() = nullptr; -CryptoKey *CryptoKey::create() { +CryptoKey *(*CryptoKey::_create)(bool p_notify_postinitialize) = nullptr; +CryptoKey *CryptoKey::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } @@ -52,10 +52,10 @@ void CryptoKey::_bind_methods() { ClassDB::bind_method(D_METHOD("load_from_string", "string_key", "public_only"), &CryptoKey::load_from_string, DEFVAL(false)); } -X509Certificate *(*X509Certificate::_create)() = nullptr; -X509Certificate *X509Certificate::create() { +X509Certificate *(*X509Certificate::_create)(bool p_notify_postinitialize) = nullptr; +X509Certificate *X509Certificate::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } @@ -116,10 +116,10 @@ void HMACContext::_bind_methods() { ClassDB::bind_method(D_METHOD("finish"), &HMACContext::finish); } -HMACContext *(*HMACContext::_create)() = nullptr; -HMACContext *HMACContext::create() { +HMACContext *(*HMACContext::_create)(bool p_notify_postinitialize) = nullptr; +HMACContext *HMACContext::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } ERR_FAIL_V_MSG(nullptr, "HMACContext is not available when the mbedtls module is disabled."); } @@ -127,10 +127,10 @@ HMACContext *HMACContext::create() { /// Crypto void (*Crypto::_load_default_certificates)(const String &p_path) = nullptr; -Crypto *(*Crypto::_create)() = nullptr; -Crypto *Crypto::create() { +Crypto *(*Crypto::_create)(bool p_notify_postinitialize) = nullptr; +Crypto *Crypto::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } ERR_FAIL_V_MSG(nullptr, "Crypto is not available when the mbedtls module is disabled."); } diff --git a/core/crypto/crypto.h b/core/crypto/crypto.h index 16649422cffb..c19e6b6773bb 100644 --- a/core/crypto/crypto.h +++ b/core/crypto/crypto.h @@ -42,10 +42,10 @@ class CryptoKey : public Resource { protected: static void _bind_methods(); - static CryptoKey *(*_create)(); + static CryptoKey *(*_create)(bool p_notify_postinitialize); public: - static CryptoKey *create(); + static CryptoKey *create(bool p_notify_postinitialize = true); virtual Error load(const String &p_path, bool p_public_only = false) = 0; virtual Error save(const String &p_path, bool p_public_only = false) = 0; virtual String save_to_string(bool p_public_only = false) = 0; @@ -58,10 +58,10 @@ class X509Certificate : public Resource { protected: static void _bind_methods(); - static X509Certificate *(*_create)(); + static X509Certificate *(*_create)(bool p_notify_postinitialize); public: - static X509Certificate *create(); + static X509Certificate *create(bool p_notify_postinitialize = true); virtual Error load(const String &p_path) = 0; virtual Error load_from_memory(const uint8_t *p_buffer, int p_len) = 0; virtual Error save(const String &p_path) = 0; @@ -106,10 +106,10 @@ class HMACContext : public RefCounted { protected: static void _bind_methods(); - static HMACContext *(*_create)(); + static HMACContext *(*_create)(bool p_notify_postinitialize); public: - static HMACContext *create(); + static HMACContext *create(bool p_notify_postinitialize = true); virtual Error start(HashingContext::HashType p_hash_type, const PackedByteArray &p_key) = 0; virtual Error update(const PackedByteArray &p_data) = 0; @@ -124,11 +124,11 @@ class Crypto : public RefCounted { protected: static void _bind_methods(); - static Crypto *(*_create)(); + static Crypto *(*_create)(bool p_notify_postinitialize); static void (*_load_default_certificates)(const String &p_path); public: - static Crypto *create(); + static Crypto *create(bool p_notify_postinitialize = true); static void load_default_certificates(const String &p_path); virtual PackedByteArray generate_random_bytes(int p_bytes) = 0; diff --git a/core/debugger/remote_debugger_peer.cpp b/core/debugger/remote_debugger_peer.cpp index 21a9014626db..9dca47a0b4f2 100644 --- a/core/debugger/remote_debugger_peer.cpp +++ b/core/debugger/remote_debugger_peer.cpp @@ -144,9 +144,8 @@ void RemoteDebuggerPeerTCP::_read_in() { Error err = decode_variant(var, buf, in_pos, &read); ERR_CONTINUE(read != in_pos || err != OK); ERR_CONTINUE_MSG(var.get_type() != Variant::ARRAY, "Malformed packet received, not an Array."); - mutex.lock(); + MutexLock lock(mutex); in_queue.push_back(var); - mutex.unlock(); } } } diff --git a/core/doc_data.cpp b/core/doc_data.cpp index 672a36c35c19..f40e878d52b9 100644 --- a/core/doc_data.cpp +++ b/core/doc_data.cpp @@ -33,6 +33,8 @@ String DocData::get_default_value_string(const Variant &p_value) { if (p_value.get_type() == Variant::ARRAY) { return Variant(Array(p_value, 0, StringName(), Variant())).get_construct_string().replace("\n", " "); + } else if (p_value.get_type() == Variant::DICTIONARY) { + return Variant(Dictionary(p_value, 0, StringName(), Variant(), 0, StringName(), Variant())).get_construct_string().replace("\n", " "); } else { return p_value.get_construct_string().replace("\n", " "); } @@ -57,6 +59,8 @@ void DocData::return_doc_from_retinfo(DocData::MethodDoc &p_method, const Proper p_method.return_type = p_retinfo.class_name; } else if (p_retinfo.type == Variant::ARRAY && p_retinfo.hint == PROPERTY_HINT_ARRAY_TYPE) { p_method.return_type = p_retinfo.hint_string + "[]"; + } else if (p_retinfo.type == Variant::DICTIONARY && p_retinfo.hint == PROPERTY_HINT_DICTIONARY_TYPE) { + p_method.return_type = "Dictionary[" + p_retinfo.hint_string.replace(";", ", ") + "]"; } else if (p_retinfo.hint == PROPERTY_HINT_RESOURCE_TYPE) { p_method.return_type = p_retinfo.hint_string; } else if (p_retinfo.type == Variant::NIL && p_retinfo.usage & PROPERTY_USAGE_NIL_IS_VARIANT) { @@ -89,6 +93,8 @@ void DocData::argument_doc_from_arginfo(DocData::ArgumentDoc &p_argument, const p_argument.type = p_arginfo.class_name; } else if (p_arginfo.type == Variant::ARRAY && p_arginfo.hint == PROPERTY_HINT_ARRAY_TYPE) { p_argument.type = p_arginfo.hint_string + "[]"; + } else if (p_arginfo.type == Variant::DICTIONARY && p_arginfo.hint == PROPERTY_HINT_DICTIONARY_TYPE) { + p_argument.type = "Dictionary[" + p_arginfo.hint_string.replace(";", ", ") + "]"; } else if (p_arginfo.hint == PROPERTY_HINT_RESOURCE_TYPE) { p_argument.type = p_arginfo.hint_string; } else if (p_arginfo.type == Variant::NIL) { diff --git a/core/doc_data.h b/core/doc_data.h index 04bd55eabae9..6a7f4355db54 100644 --- a/core/doc_data.h +++ b/core/doc_data.h @@ -522,6 +522,10 @@ class DocData { String type; String data_type; String description; + bool is_deprecated = false; + String deprecated_message; + bool is_experimental = false; + String experimental_message; String default_value; String keywords; bool operator<(const ThemeItemDoc &p_theme_item) const { @@ -550,6 +554,16 @@ class DocData { doc.description = p_dict["description"]; } + if (p_dict.has("deprecated")) { + doc.is_deprecated = true; + doc.deprecated_message = p_dict["deprecated"]; + } + + if (p_dict.has("experimental")) { + doc.is_experimental = true; + doc.experimental_message = p_dict["experimental"]; + } + if (p_dict.has("default_value")) { doc.default_value = p_dict["default_value"]; } @@ -579,6 +593,14 @@ class DocData { dict["description"] = p_doc.description; } + if (p_doc.is_deprecated) { + dict["deprecated"] = p_doc.deprecated_message; + } + + if (p_doc.is_experimental) { + dict["experimental"] = p_doc.experimental_message; + } + if (!p_doc.default_value.is_empty()) { dict["default_value"] = p_doc.default_value; } diff --git a/core/error/error_list.h b/core/error/error_list.h index abc637106a57..cdf06eb06d7f 100644 --- a/core/error/error_list.h +++ b/core/error/error_list.h @@ -41,6 +41,7 @@ * - Are added to the Error enum in core/error/error_list.h * - Have a description added to error_names in core/error/error_list.cpp * - Are bound with BIND_CORE_ENUM_CONSTANT() in core/core_constants.cpp + * - Have a matching Android version in platform/android/java/lib/src/org/godotengine/godot/error/Error.kt */ enum Error { diff --git a/core/error/error_macros.cpp b/core/error/error_macros.cpp index 8376c0aaf84c..813ee7684ff4 100644 --- a/core/error/error_macros.cpp +++ b/core/error/error_macros.cpp @@ -34,6 +34,12 @@ #include "core/os/os.h" #include "core/string/ustring.h" +// Optional physics interpolation warnings try to include the path to the relevant node. +#if defined(DEBUG_ENABLED) && defined(TOOLS_ENABLED) +#include "core/config/project_settings.h" +#include "scene/main/node.h" +#endif + static ErrorHandlerList *error_handler_list = nullptr; void add_error_handler(ErrorHandlerList *p_handler) { @@ -128,3 +134,48 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li void _err_flush_stdout() { fflush(stdout); } + +// Prevent error spam by limiting the warnings to a certain frequency. +void _physics_interpolation_warning(const char *p_function, const char *p_file, int p_line, ObjectID p_id, const char *p_warn_string) { +#if defined(DEBUG_ENABLED) && defined(TOOLS_ENABLED) + const uint32_t warn_max = 2048; + const uint32_t warn_timeout_seconds = 15; + + static uint32_t warn_count = warn_max; + static uint32_t warn_timeout = warn_timeout_seconds; + + uint32_t time_now = UINT32_MAX; + + if (warn_count) { + warn_count--; + } + + if (!warn_count) { + time_now = OS::get_singleton()->get_ticks_msec() / 1000; + } + + if ((warn_count == 0) && (time_now >= warn_timeout)) { + warn_count = warn_max; + warn_timeout = time_now + warn_timeout_seconds; + + if (GLOBAL_GET("debug/settings/physics_interpolation/enable_warnings")) { + // UINT64_MAX means unused. + if (p_id.operator uint64_t() == UINT64_MAX) { + _err_print_error(p_function, p_file, p_line, "[Physics interpolation] " + String(p_warn_string) + " (possibly benign).", false, ERR_HANDLER_WARNING); + } else { + String node_name; + if (p_id.is_valid()) { + Node *node = Object::cast_to(ObjectDB::get_instance(p_id)); + if (node && node->is_inside_tree()) { + node_name = "\"" + String(node->get_path()) + "\""; + } else { + node_name = "\"unknown\""; + } + } + + _err_print_error(p_function, p_file, p_line, "[Physics interpolation] " + String(p_warn_string) + ": " + node_name + " (possibly benign).", false, ERR_HANDLER_WARNING); + } + } + } +#endif +} diff --git a/core/error/error_macros.h b/core/error/error_macros.h index ab7dbcbd44b7..19c16667d01b 100644 --- a/core/error/error_macros.h +++ b/core/error/error_macros.h @@ -31,6 +31,7 @@ #ifndef ERROR_MACROS_H #define ERROR_MACROS_H +#include "core/object/object_id.h" #include "core/typedefs.h" #include // We'd normally use safe_refcount.h, but that would cause circular includes. @@ -71,6 +72,8 @@ void _err_print_index_error(const char *p_function, const char *p_file, int p_li void _err_print_index_error(const char *p_function, const char *p_file, int p_line, int64_t p_index, int64_t p_size, const char *p_index_str, const char *p_size_str, const String &p_message, bool p_editor_notify = false, bool fatal = false); void _err_flush_stdout(); +void _physics_interpolation_warning(const char *p_function, const char *p_file, int p_line, ObjectID p_id, const char *p_warn_string); + #ifdef __GNUC__ //#define FUNCTION_STR __PRETTY_FUNCTION__ - too annoying #define FUNCTION_STR __FUNCTION__ @@ -832,4 +835,14 @@ void _err_flush_stdout(); #define DEV_CHECK_ONCE(m_cond) #endif +/** + * Physics Interpolation warnings. + * These are spam protection warnings. + */ +#define PHYSICS_INTERPOLATION_NODE_WARNING(m_object_id, m_string) \ + _physics_interpolation_warning(FUNCTION_STR, __FILE__, __LINE__, m_object_id, m_string) + +#define PHYSICS_INTERPOLATION_WARNING(m_string) \ + _physics_interpolation_warning(FUNCTION_STR, __FILE__, __LINE__, ObjectID(UINT64_MAX), m_string) + #endif // ERROR_MACROS_H diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 848b6f3886e5..4042d6b80dff 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -60,6 +60,9 @@ static String get_property_info_type_name(const PropertyInfo &p_info) { if (p_info.type == Variant::ARRAY && (p_info.hint == PROPERTY_HINT_ARRAY_TYPE)) { return String("typedarray::") + p_info.hint_string; } + if (p_info.type == Variant::DICTIONARY && (p_info.hint == PROPERTY_HINT_DICTIONARY_TYPE)) { + return String("typeddictionary::") + p_info.hint_string; + } if (p_info.type == Variant::INT && (p_info.usage & (PROPERTY_USAGE_CLASS_IS_ENUM))) { return String("enum::") + String(p_info.class_name); } @@ -85,7 +88,7 @@ static String get_property_info_type_name(const PropertyInfo &p_info) { } static String get_type_meta_name(const GodotTypeInfo::Metadata metadata) { - static const char *argmeta[11] = { "none", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64", "float", "double" }; + static const char *argmeta[13] = { "none", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64", "float", "double", "char16", "char32" }; return argmeta[metadata]; } diff --git a/core/extension/gdextension.cpp b/core/extension/gdextension.cpp index 8e2366fc95e1..7cba5cb161ef 100644 --- a/core/extension/gdextension.cpp +++ b/core/extension/gdextension.cpp @@ -32,11 +32,9 @@ #include "gdextension.compat.inc" #include "core/config/project_settings.h" -#include "core/io/dir_access.h" #include "core/object/class_db.h" #include "core/object/method_bind.h" -#include "core/os/os.h" -#include "core/version.h" +#include "gdextension_library_loader.h" #include "gdextension_manager.h" extern void gdextension_setup_interface(); @@ -48,146 +46,6 @@ String GDExtension::get_extension_list_config_file() { return ProjectSettings::get_singleton()->get_project_data_path().path_join("extension_list.cfg"); } -Vector GDExtension::find_extension_dependencies(const String &p_path, Ref p_config, std::function p_has_feature) { - Vector dependencies_shared_objects; - if (p_config->has_section("dependencies")) { - List config_dependencies; - p_config->get_section_keys("dependencies", &config_dependencies); - - for (const String &dependency : config_dependencies) { - Vector dependency_tags = dependency.split("."); - bool all_tags_met = true; - for (int i = 0; i < dependency_tags.size(); i++) { - String tag = dependency_tags[i].strip_edges(); - if (!p_has_feature(tag)) { - all_tags_met = false; - break; - } - } - - if (all_tags_met) { - Dictionary dependency_value = p_config->get_value("dependencies", dependency); - for (const Variant *key = dependency_value.next(nullptr); key; key = dependency_value.next(key)) { - String dependency_path = *key; - String target_path = dependency_value[*key]; - if (dependency_path.is_relative_path()) { - dependency_path = p_path.get_base_dir().path_join(dependency_path); - } - dependencies_shared_objects.push_back(SharedObject(dependency_path, dependency_tags, target_path)); - } - break; - } - } - } - - return dependencies_shared_objects; -} - -String GDExtension::find_extension_library(const String &p_path, Ref p_config, std::function p_has_feature, PackedStringArray *r_tags) { - // First, check the explicit libraries. - if (p_config->has_section("libraries")) { - List libraries; - p_config->get_section_keys("libraries", &libraries); - - // Iterate the libraries, finding the best matching tags. - String best_library_path; - Vector best_library_tags; - for (const String &E : libraries) { - Vector tags = E.split("."); - bool all_tags_met = true; - for (int i = 0; i < tags.size(); i++) { - String tag = tags[i].strip_edges(); - if (!p_has_feature(tag)) { - all_tags_met = false; - break; - } - } - - if (all_tags_met && tags.size() > best_library_tags.size()) { - best_library_path = p_config->get_value("libraries", E); - best_library_tags = tags; - } - } - - if (!best_library_path.is_empty()) { - if (best_library_path.is_relative_path()) { - best_library_path = p_path.get_base_dir().path_join(best_library_path); - } - if (r_tags != nullptr) { - r_tags->append_array(best_library_tags); - } - return best_library_path; - } - } - - // Second, try to autodetect - String autodetect_library_prefix; - if (p_config->has_section_key("configuration", "autodetect_library_prefix")) { - autodetect_library_prefix = p_config->get_value("configuration", "autodetect_library_prefix"); - } - if (!autodetect_library_prefix.is_empty()) { - String autodetect_path = autodetect_library_prefix; - if (autodetect_path.is_relative_path()) { - autodetect_path = p_path.get_base_dir().path_join(autodetect_path); - } - - // Find the folder and file parts of the prefix. - String folder; - String file_prefix; - if (DirAccess::dir_exists_absolute(autodetect_path)) { - folder = autodetect_path; - } else if (DirAccess::dir_exists_absolute(autodetect_path.get_base_dir())) { - folder = autodetect_path.get_base_dir(); - file_prefix = autodetect_path.get_file(); - } else { - ERR_FAIL_V_MSG(String(), vformat("Error in extension: %s. Could not find folder for automatic detection of libraries files. autodetect_library_prefix=\"%s\"", p_path, autodetect_library_prefix)); - } - - // Open the folder. - Ref dir = DirAccess::open(folder); - ERR_FAIL_COND_V_MSG(!dir.is_valid(), String(), vformat("Error in extension: %s. Could not open folder for automatic detection of libraries files. autodetect_library_prefix=\"%s\"", p_path, autodetect_library_prefix)); - - // Iterate the files and check the prefixes, finding the best matching file. - String best_file; - Vector best_file_tags; - dir->list_dir_begin(); - String file_name = dir->_get_next(); - while (file_name != "") { - if (!dir->current_is_dir() && file_name.begins_with(file_prefix)) { - // Check if the files matches all requested feature tags. - String tags_str = file_name.trim_prefix(file_prefix); - tags_str = tags_str.trim_suffix(tags_str.get_extension()); - - Vector tags = tags_str.split(".", false); - bool all_tags_met = true; - for (int i = 0; i < tags.size(); i++) { - String tag = tags[i].strip_edges(); - if (!p_has_feature(tag)) { - all_tags_met = false; - break; - } - } - - // If all tags are found in the feature list, and we found more tags than before, use this file. - if (all_tags_met && tags.size() > best_file_tags.size()) { - best_file_tags = tags; - best_file = file_name; - } - } - file_name = dir->_get_next(); - } - - if (!best_file.is_empty()) { - String library_path = folder.path_join(best_file); - if (r_tags != nullptr) { - r_tags->append_array(best_file_tags); - } - return library_path; - } - } - return String(); -} - class GDExtensionMethodBind : public MethodBind { GDExtensionClassMethodCall call_func; GDExtensionClassMethodValidatedCall validated_call_func; @@ -382,7 +240,7 @@ class GDExtensionMethodBind : public MethodBind { #ifndef DISABLE_DEPRECATED void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs) { - const GDExtensionClassCreationInfo3 class_info3 = { + const GDExtensionClassCreationInfo4 class_info4 = { p_extension_funcs->is_virtual, // GDExtensionBool is_virtual; p_extension_funcs->is_abstract, // GDExtensionBool is_abstract; true, // GDExtensionBool is_exposed; @@ -398,25 +256,26 @@ void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library p_extension_funcs->to_string_func, // GDExtensionClassToString to_string_func; p_extension_funcs->reference_func, // GDExtensionClassReference reference_func; p_extension_funcs->unreference_func, // GDExtensionClassUnreference unreference_func; - p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */ + nullptr, // GDExtensionClassCreateInstance2 create_instance_func; /* this one is mandatory */ p_extension_funcs->free_instance_func, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */ nullptr, // GDExtensionClassRecreateInstance recreate_instance_func; p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func; nullptr, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func; nullptr, // GDExtensionClassCallVirtualWithData call_virtual_func; - p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid; p_extension_funcs->class_userdata, // void *class_userdata; }; const ClassCreationDeprecatedInfo legacy = { p_extension_funcs->notification_func, // GDExtensionClassNotification notification_func; p_extension_funcs->free_property_list_func, // GDExtensionClassFreePropertyList free_property_list_func; + p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; + p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid; }; - _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info3, &legacy); + _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy); } void GDExtension::_register_extension_class2(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo2 *p_extension_funcs) { - const GDExtensionClassCreationInfo3 class_info3 = { + const GDExtensionClassCreationInfo4 class_info4 = { p_extension_funcs->is_virtual, // GDExtensionBool is_virtual; p_extension_funcs->is_abstract, // GDExtensionBool is_abstract; p_extension_funcs->is_exposed, // GDExtensionBool is_exposed; @@ -432,34 +291,71 @@ void GDExtension::_register_extension_class2(GDExtensionClassLibraryPtr p_librar p_extension_funcs->to_string_func, // GDExtensionClassToString to_string_func; p_extension_funcs->reference_func, // GDExtensionClassReference reference_func; p_extension_funcs->unreference_func, // GDExtensionClassUnreference unreference_func; - p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; /* this one is mandatory */ + nullptr, // GDExtensionClassCreateInstance2 create_instance_func; /* this one is mandatory */ p_extension_funcs->free_instance_func, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */ p_extension_funcs->recreate_instance_func, // GDExtensionClassRecreateInstance recreate_instance_func; p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func; p_extension_funcs->get_virtual_call_data_func, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func; p_extension_funcs->call_virtual_with_data_func, // GDExtensionClassCallVirtualWithData call_virtual_func; - p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid; p_extension_funcs->class_userdata, // void *class_userdata; }; const ClassCreationDeprecatedInfo legacy = { nullptr, // GDExtensionClassNotification notification_func; p_extension_funcs->free_property_list_func, // GDExtensionClassFreePropertyList free_property_list_func; + p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance create_instance_func; + p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid; }; - _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info3, &legacy); + _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy); } -#endif // DISABLE_DEPRECATED void GDExtension::_register_extension_class3(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs) { + const GDExtensionClassCreationInfo4 class_info4 = { + p_extension_funcs->is_virtual, // GDExtensionBool is_virtual; + p_extension_funcs->is_abstract, // GDExtensionBool is_abstract; + p_extension_funcs->is_exposed, // GDExtensionBool is_exposed; + p_extension_funcs->is_runtime, // GDExtensionBool is_runtime; + p_extension_funcs->set_func, // GDExtensionClassSet set_func; + p_extension_funcs->get_func, // GDExtensionClassGet get_func; + p_extension_funcs->get_property_list_func, // GDExtensionClassGetPropertyList get_property_list_func; + p_extension_funcs->free_property_list_func, // GDExtensionClassFreePropertyList free_property_list_func; + p_extension_funcs->property_can_revert_func, // GDExtensionClassPropertyCanRevert property_can_revert_func; + p_extension_funcs->property_get_revert_func, // GDExtensionClassPropertyGetRevert property_get_revert_func; + p_extension_funcs->validate_property_func, // GDExtensionClassValidateProperty validate_property_func; + p_extension_funcs->notification_func, // GDExtensionClassNotification2 notification_func; + p_extension_funcs->to_string_func, // GDExtensionClassToString to_string_func; + p_extension_funcs->reference_func, // GDExtensionClassReference reference_func; + p_extension_funcs->unreference_func, // GDExtensionClassUnreference unreference_func; + nullptr, // GDExtensionClassCreateInstance2 create_instance_func; /* this one is mandatory */ + p_extension_funcs->free_instance_func, // GDExtensionClassFreeInstance free_instance_func; /* this one is mandatory */ + p_extension_funcs->recreate_instance_func, // GDExtensionClassRecreateInstance recreate_instance_func; + p_extension_funcs->get_virtual_func, // GDExtensionClassGetVirtual get_virtual_func; + p_extension_funcs->get_virtual_call_data_func, // GDExtensionClassGetVirtualCallData get_virtual_call_data_func; + p_extension_funcs->call_virtual_with_data_func, // GDExtensionClassCallVirtualWithData call_virtual_func; + p_extension_funcs->class_userdata, // void *class_userdata; + }; + + const ClassCreationDeprecatedInfo legacy = { + nullptr, // GDExtensionClassNotification notification_func; + nullptr, // GDExtensionClassFreePropertyList free_property_list_func; + p_extension_funcs->create_instance_func, // GDExtensionClassCreateInstance2 create_instance_func; + p_extension_funcs->get_rid_func, // GDExtensionClassGetRID get_rid; + }; + _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, &class_info4, &legacy); +} + +#endif // DISABLE_DEPRECATED + +void GDExtension::_register_extension_class4(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs) { _register_extension_class_internal(p_library, p_class_name, p_parent_class_name, p_extension_funcs); } -void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs) { +void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs) { GDExtension *self = reinterpret_cast(p_library); StringName class_name = *reinterpret_cast(p_class_name); StringName parent_class_name = *reinterpret_cast(p_parent_class_name); - ERR_FAIL_COND_MSG(!String(class_name).is_valid_identifier(), "Attempt to register extension class '" + class_name + "', which is not a valid class identifier."); + ERR_FAIL_COND_MSG(!String(class_name).is_valid_unicode_identifier(), "Attempt to register extension class '" + class_name + "', which is not a valid class identifier."); ERR_FAIL_COND_MSG(ClassDB::class_exists(class_name), "Attempt to register extension class '" + class_name + "', which appears to be already registered."); Extension *parent_extension = nullptr; @@ -530,6 +426,8 @@ void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr if (p_deprecated_funcs) { extension->gdextension.notification = p_deprecated_funcs->notification_func; extension->gdextension.free_property_list = p_deprecated_funcs->free_property_list_func; + extension->gdextension.create_instance = p_deprecated_funcs->create_instance_func; + extension->gdextension.get_rid = p_deprecated_funcs->get_rid_func; } #endif // DISABLE_DEPRECATED extension->gdextension.notification2 = p_extension_funcs->notification_func; @@ -537,13 +435,12 @@ void GDExtension::_register_extension_class_internal(GDExtensionClassLibraryPtr extension->gdextension.reference = p_extension_funcs->reference_func; extension->gdextension.unreference = p_extension_funcs->unreference_func; extension->gdextension.class_userdata = p_extension_funcs->class_userdata; - extension->gdextension.create_instance = p_extension_funcs->create_instance_func; + extension->gdextension.create_instance2 = p_extension_funcs->create_instance_func; extension->gdextension.free_instance = p_extension_funcs->free_instance_func; extension->gdextension.recreate_instance = p_extension_funcs->recreate_instance_func; extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func; extension->gdextension.get_virtual_call_data = p_extension_funcs->get_virtual_call_data_func; extension->gdextension.call_virtual_with_data = p_extension_funcs->call_virtual_with_data_func; - extension->gdextension.get_rid = p_extension_funcs->get_rid_func; extension->gdextension.reloadable = self->reloadable; #ifdef TOOLS_ENABLED @@ -755,7 +652,13 @@ void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_libra void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionUninitializedStringPtr r_path) { GDExtension *self = reinterpret_cast(p_library); - memnew_placement(r_path, String(self->library_path)); + Ref library_loader = self->loader; + String library_path; + if (library_loader.is_valid()) { + library_path = library_loader->library_path; + } + + memnew_placement(r_path, String(library_path)); } HashMap GDExtension::gdextension_interface_functions; @@ -771,64 +674,32 @@ GDExtensionInterfaceFunctionPtr GDExtension::get_interface_function(const String return *function; } -Error GDExtension::open_library(const String &p_path, const String &p_entry_symbol, Vector *p_dependencies) { - String abs_path = ProjectSettings::get_singleton()->globalize_path(p_path); - - Vector abs_dependencies_paths; - if (p_dependencies != nullptr && !p_dependencies->is_empty()) { - for (const SharedObject &dependency : *p_dependencies) { - abs_dependencies_paths.push_back(ProjectSettings::get_singleton()->globalize_path(dependency.path)); - } - } - - String actual_lib_path; - OS::GDExtensionData data = { - true, // also_set_library_path - &actual_lib_path, // r_resolved_path - Engine::get_singleton()->is_editor_hint(), // generate_temp_files - &abs_dependencies_paths, // library_dependencies - }; - Error err = OS::get_singleton()->open_dynamic_library(abs_path, library, &data); - - if (actual_lib_path.get_file() != abs_path.get_file()) { - // If temporary files are generated, let's change the library path to point at the original, - // because that's what we want to check to see if it's changed. - library_path = actual_lib_path.get_base_dir().path_join(p_path.get_file()); - } else { - library_path = actual_lib_path; - } +Error GDExtension::open_library(const String &p_path, const Ref &p_loader) { + ERR_FAIL_COND_V_MSG(p_loader.is_null(), FAILED, "Can't open GDExtension without a loader."); + loader = p_loader; - ERR_FAIL_COND_V_MSG(err == ERR_FILE_NOT_FOUND, err, "GDExtension dynamic library not found: " + abs_path); - ERR_FAIL_COND_V_MSG(err != OK, err, "Can't open GDExtension dynamic library: " + abs_path); + Error err = loader->open_library(p_path); - void *entry_funcptr = nullptr; + ERR_FAIL_COND_V_MSG(err == ERR_FILE_NOT_FOUND, err, "GDExtension dynamic library not found: " + p_path); + ERR_FAIL_COND_V_MSG(err != OK, err, "Can't open GDExtension dynamic library: " + p_path); - err = OS::get_singleton()->get_dynamic_library_symbol_handle(library, p_entry_symbol, entry_funcptr, false); + err = loader->initialize(&gdextension_get_proc_address, this, &initialization); if (err != OK) { - ERR_PRINT("GDExtension entry point '" + p_entry_symbol + "' not found in library " + abs_path); - OS::get_singleton()->close_dynamic_library(library); + // Errors already logged in initialize(). + loader->close_library(); return err; } - GDExtensionInitializationFunction initialization_function = (GDExtensionInitializationFunction)entry_funcptr; - GDExtensionBool ret = initialization_function(&gdextension_get_proc_address, this, &initialization); + level_initialized = -1; - if (ret) { - level_initialized = -1; - return OK; - } else { - ERR_PRINT("GDExtension initialization function '" + p_entry_symbol + "' returned an error."); - OS::get_singleton()->close_dynamic_library(library); - return FAILED; - } + return OK; } void GDExtension::close_library() { - ERR_FAIL_NULL(library); - OS::get_singleton()->close_dynamic_library(library); + ERR_FAIL_COND(!is_library_open()); + loader->close_library(); - library = nullptr; class_icon_paths.clear(); #ifdef TOOLS_ENABLED @@ -837,16 +708,16 @@ void GDExtension::close_library() { } bool GDExtension::is_library_open() const { - return library != nullptr; + return loader.is_valid() && loader->is_library_open(); } GDExtension::InitializationLevel GDExtension::get_minimum_library_initialization_level() const { - ERR_FAIL_NULL_V(library, INITIALIZATION_LEVEL_CORE); + ERR_FAIL_COND_V(!is_library_open(), INITIALIZATION_LEVEL_CORE); return InitializationLevel(initialization.minimum_initialization_level); } void GDExtension::initialize_library(InitializationLevel p_level) { - ERR_FAIL_NULL(library); + ERR_FAIL_COND(!is_library_open()); ERR_FAIL_COND_MSG(p_level <= int32_t(level_initialized), vformat("Level '%d' must be higher than the current level '%d'", p_level, level_initialized)); level_initialized = int32_t(p_level); @@ -856,7 +727,7 @@ void GDExtension::initialize_library(InitializationLevel p_level) { initialization.initialize(initialization.userdata, GDExtensionInitializationLevel(p_level)); } void GDExtension::deinitialize_library(InitializationLevel p_level) { - ERR_FAIL_NULL(library); + ERR_FAIL_COND(!is_library_open()); ERR_FAIL_COND(p_level > int32_t(level_initialized)); level_initialized = int32_t(p_level) - 1; @@ -880,7 +751,7 @@ GDExtension::GDExtension() { } GDExtension::~GDExtension() { - if (library != nullptr) { + if (is_library_open()) { close_library(); } #ifdef TOOLS_ENABLED @@ -897,8 +768,9 @@ void GDExtension::initialize_gdextensions() { #ifndef DISABLE_DEPRECATED register_interface_function("classdb_register_extension_class", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class); register_interface_function("classdb_register_extension_class2", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class2); -#endif // DISABLE_DEPRECATED register_interface_function("classdb_register_extension_class3", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class3); +#endif // DISABLE_DEPRECATED + register_interface_function("classdb_register_extension_class4", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class4); register_interface_function("classdb_register_extension_class_method", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_method); register_interface_function("classdb_register_extension_class_virtual_method", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_virtual_method); register_interface_function("classdb_register_extension_class_integer_constant", (GDExtensionInterfaceFunctionPtr)&GDExtension::_register_extension_class_integer_constant); @@ -918,142 +790,15 @@ void GDExtension::finalize_gdextensions() { Error GDExtensionResourceLoader::load_gdextension_resource(const String &p_path, Ref &p_extension) { ERR_FAIL_COND_V_MSG(p_extension.is_valid() && p_extension->is_library_open(), ERR_ALREADY_IN_USE, "Cannot load GDExtension resource into already opened library."); - Ref config; - config.instantiate(); - - Error err = config->load(p_path); - - if (err != OK) { - ERR_PRINT("Error loading GDExtension configuration file: " + p_path); - return err; - } - - if (!config->has_section_key("configuration", "entry_symbol")) { - ERR_PRINT("GDExtension configuration file must contain a \"configuration/entry_symbol\" key: " + p_path); - return ERR_INVALID_DATA; - } - - String entry_symbol = config->get_value("configuration", "entry_symbol"); - - uint32_t compatibility_minimum[3] = { 0, 0, 0 }; - if (config->has_section_key("configuration", "compatibility_minimum")) { - String compat_string = config->get_value("configuration", "compatibility_minimum"); - Vector parts = compat_string.split_ints("."); - for (int i = 0; i < parts.size(); i++) { - if (i >= 3) { - break; - } - if (parts[i] >= 0) { - compatibility_minimum[i] = parts[i]; - } - } - } else { - ERR_PRINT("GDExtension configuration file must contain a \"configuration/compatibility_minimum\" key: " + p_path); - return ERR_INVALID_DATA; - } - - if (compatibility_minimum[0] < 4 || (compatibility_minimum[0] == 4 && compatibility_minimum[1] == 0)) { - ERR_PRINT(vformat("GDExtension's compatibility_minimum (%d.%d.%d) must be at least 4.1.0: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path)); - return ERR_INVALID_DATA; - } - - bool compatible = true; - // Check version lexicographically. - if (VERSION_MAJOR != compatibility_minimum[0]) { - compatible = VERSION_MAJOR > compatibility_minimum[0]; - } else if (VERSION_MINOR != compatibility_minimum[1]) { - compatible = VERSION_MINOR > compatibility_minimum[1]; - } else { - compatible = VERSION_PATCH >= compatibility_minimum[2]; - } - if (!compatible) { - ERR_PRINT(vformat("GDExtension only compatible with Godot version %d.%d.%d or later: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path)); - return ERR_INVALID_DATA; - } - - // Optionally check maximum compatibility. - if (config->has_section_key("configuration", "compatibility_maximum")) { - uint32_t compatibility_maximum[3] = { 0, 0, 0 }; - String compat_string = config->get_value("configuration", "compatibility_maximum"); - Vector parts = compat_string.split_ints("."); - for (int i = 0; i < 3; i++) { - if (i < parts.size() && parts[i] >= 0) { - compatibility_maximum[i] = parts[i]; - } else { - // If a version part is missing, set the maximum to an arbitrary high value. - compatibility_maximum[i] = 9999; - } - } - - compatible = true; - if (VERSION_MAJOR != compatibility_maximum[0]) { - compatible = VERSION_MAJOR < compatibility_maximum[0]; - } else if (VERSION_MINOR != compatibility_maximum[1]) { - compatible = VERSION_MINOR < compatibility_maximum[1]; - } -#if VERSION_PATCH - // #if check to avoid -Wtype-limits warning when 0. - else { - compatible = VERSION_PATCH <= compatibility_maximum[2]; - } -#endif - - if (!compatible) { - ERR_PRINT(vformat("GDExtension only compatible with Godot version %s or earlier: %s", compat_string, p_path)); - return ERR_INVALID_DATA; - } - } - - String library_path = GDExtension::find_extension_library(p_path, config, [](const String &p_feature) { return OS::get_singleton()->has_feature(p_feature); }); - - if (library_path.is_empty()) { - const String os_arch = OS::get_singleton()->get_name().to_lower() + "." + Engine::get_singleton()->get_architecture_name(); - ERR_PRINT(vformat("No GDExtension library found for current OS and architecture (%s) in configuration file: %s", os_arch, p_path)); - return ERR_FILE_NOT_FOUND; - } - - bool is_static_library = library_path.ends_with(".a") || library_path.ends_with(".xcframework"); - - if (!library_path.is_resource_file() && !library_path.is_absolute_path()) { - library_path = p_path.get_base_dir().path_join(library_path); - } - - if (p_extension.is_null()) { - p_extension.instantiate(); - } - -#ifdef TOOLS_ENABLED - p_extension->set_reloadable(config->get_value("configuration", "reloadable", false) && Engine::get_singleton()->is_extension_reloading_enabled()); - - p_extension->update_last_modified_time( - FileAccess::get_modified_time(p_path), - FileAccess::get_modified_time(library_path)); -#endif - - Vector library_dependencies = GDExtension::find_extension_dependencies(p_path, config, [](const String &p_feature) { return OS::get_singleton()->has_feature(p_feature); }); - err = p_extension->open_library(is_static_library ? String() : library_path, entry_symbol, &library_dependencies); - if (err != OK) { - // Unreference the extension so that this loading can be considered a failure. - p_extension.unref(); - - // Errors already logged in open_library() - return err; - } - - // Handle icons if any are specified. - if (config->has_section("icons")) { - List keys; - config->get_section_keys("icons", &keys); - for (const String &key : keys) { - String icon_path = config->get_value("icons", key); - if (icon_path.is_relative_path()) { - icon_path = p_path.get_base_dir().path_join(icon_path); - } + GDExtensionManager *extension_manager = GDExtensionManager::get_singleton(); - p_extension->class_icon_paths[key] = icon_path; - } + GDExtensionManager::LoadStatus status = extension_manager->load_extension(p_path); + if (status != GDExtensionManager::LOAD_STATUS_OK && status != GDExtensionManager::LOAD_STATUS_ALREADY_LOADED) { + // Errors already logged in load_extension(). + return FAILED; } + p_extension = extension_manager->get_extension(p_path); return OK; } @@ -1094,16 +839,7 @@ String GDExtensionResourceLoader::get_resource_type(const String &p_path) const #ifdef TOOLS_ENABLED bool GDExtension::has_library_changed() const { - // Check only that the last modified time is different (rather than checking - // that it's newer) since some OS's (namely Windows) will preserve the modified - // time by default when copying files. - if (FileAccess::get_modified_time(get_path()) != resource_last_modified_time) { - return true; - } - if (FileAccess::get_modified_time(library_path) != library_last_modified_time) { - return true; - } - return false; + return loader->has_library_changed(); } void GDExtension::prepare_reload() { diff --git a/core/extension/gdextension.h b/core/extension/gdextension.h index 9393e7399ba2..706bc7e18961 100644 --- a/core/extension/gdextension.h +++ b/core/extension/gdextension.h @@ -31,13 +31,11 @@ #ifndef GDEXTENSION_H #define GDEXTENSION_H -#include - #include "core/extension/gdextension_interface.h" +#include "core/extension/gdextension_loader.h" #include "core/io/config_file.h" #include "core/io/resource_loader.h" #include "core/object/ref_counted.h" -#include "core/os/shared_object.h" class GDExtensionMethodBind; @@ -46,8 +44,8 @@ class GDExtension : public Resource { friend class GDExtensionManager; - void *library = nullptr; // pointer if valid, - String library_path; + Ref loader; + bool reloadable = false; struct Extension { @@ -72,15 +70,18 @@ class GDExtension : public Resource { #ifndef DISABLE_DEPRECATED GDExtensionClassNotification notification_func = nullptr; GDExtensionClassFreePropertyList free_property_list_func = nullptr; + GDExtensionClassCreateInstance create_instance_func = nullptr; + GDExtensionClassGetRID get_rid_func = nullptr; #endif // DISABLE_DEPRECATED }; #ifndef DISABLE_DEPRECATED static void _register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs); static void _register_extension_class2(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo2 *p_extension_funcs); -#endif // DISABLE_DEPRECATED static void _register_extension_class3(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs); - static void _register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs = nullptr); +#endif // DISABLE_DEPRECATED + static void _register_extension_class4(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs); + static void _register_extension_class_internal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs, const ClassCreationDeprecatedInfo *p_deprecated_funcs = nullptr); static void _register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info); static void _register_extension_class_virtual_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassVirtualMethodInfo *p_method_info); static void _register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield); @@ -96,8 +97,6 @@ class GDExtension : public Resource { int32_t level_initialized = -1; #ifdef TOOLS_ENABLED - uint64_t resource_last_modified_time = 0; - uint64_t library_last_modified_time = 0; bool is_reloading = false; Vector invalid_methods; Vector instance_bindings; @@ -124,11 +123,12 @@ class GDExtension : public Resource { virtual bool editor_can_reload_from_file() override { return false; } // Reloading is handled in a special way. static String get_extension_list_config_file(); - static String find_extension_library(const String &p_path, Ref p_config, std::function p_has_feature, PackedStringArray *r_tags = nullptr); - static Vector find_extension_dependencies(const String &p_path, Ref p_config, std::function p_has_feature); - Error open_library(const String &p_path, const String &p_entry_symbol, Vector *p_dependencies = nullptr); + const Ref get_loader() const { return loader; } + + Error open_library(const String &p_path, const Ref &p_loader); void close_library(); + bool is_library_open() const; enum InitializationLevel { INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE, @@ -146,17 +146,11 @@ class GDExtension : public Resource { #endif public: - bool is_library_open() const; - #ifdef TOOLS_ENABLED bool is_reloadable() const { return reloadable; } void set_reloadable(bool p_reloadable) { reloadable = p_reloadable; } bool has_library_changed() const; - void update_last_modified_time(uint64_t p_resource_last_modified_time, uint64_t p_library_last_modified_time) { - resource_last_modified_time = p_resource_last_modified_time; - library_last_modified_time = p_library_last_modified_time; - } void track_instance_binding(Object *p_object); void untrack_instance_binding(Object *p_object); diff --git a/core/extension/gdextension_compat_hashes.cpp b/core/extension/gdextension_compat_hashes.cpp index ebbf795070f7..b07f5b185893 100644 --- a/core/extension/gdextension_compat_hashes.cpp +++ b/core/extension/gdextension_compat_hashes.cpp @@ -103,6 +103,14 @@ void GDExtensionCompatHashes::initialize() { mappings.insert("AcceptDialog", { { "add_button", 4158837846, 3328440682 }, }); + mappings.insert("AnimatedSprite2D", { + { "play", 2372066587, 3269405555 }, + { "play_backwards", 1421762485, 3323268493 }, + }); + mappings.insert("AnimatedSprite3D", { + { "play", 2372066587, 3269405555 }, + { "play_backwards", 1421762485, 3323268493 }, + }); mappings.insert("Animation", { { "add_track", 2393815928, 3843682357 }, { "track_insert_key", 1985425300, 808952278 }, @@ -146,6 +154,12 @@ void GDExtensionCompatHashes::initialize() { { "travel", 3683006648, 3823612587 }, { "start", 3683006648, 3823612587 }, }); + mappings.insert("AnimationPlayer", { + { "play", 3697947785, 3118260607 }, + { "play", 2221377757, 3118260607 }, + { "play_backwards", 3890664824, 2787282401 }, + { "play_with_capture", 3180464118, 1572969103 }, + }); mappings.insert("ArrayMesh", { { "add_surface_from_arrays", 172284304, 1796411378 }, }); @@ -247,13 +261,20 @@ void GDExtensionCompatHashes::initialize() { }); mappings.insert("DisplayServer", { { "global_menu_add_submenu_item", 3806306913, 2828985934 }, - { "global_menu_add_item", 3415468211, 3401266716 }, - { "global_menu_add_check_item", 3415468211, 3401266716 }, - { "global_menu_add_icon_item", 1700867534, 4245856523 }, - { "global_menu_add_icon_check_item", 1700867534, 4245856523 }, - { "global_menu_add_radio_check_item", 3415468211, 3401266716 }, - { "global_menu_add_icon_radio_check_item", 1700867534, 4245856523 }, - { "global_menu_add_multistate_item", 635750054, 3431222859 }, + { "global_menu_add_item", 3415468211, 3616842746 }, + { "global_menu_add_item", 3401266716, 3616842746 }, + { "global_menu_add_check_item", 3415468211, 3616842746 }, + { "global_menu_add_check_item", 3401266716, 3616842746 }, + { "global_menu_add_icon_item", 1700867534, 3867083847 }, + { "global_menu_add_icon_item", 4245856523, 3867083847 }, + { "global_menu_add_icon_check_item", 1700867534, 3867083847 }, + { "global_menu_add_icon_check_item", 4245856523, 3867083847 }, + { "global_menu_add_radio_check_item", 3415468211, 3616842746 }, + { "global_menu_add_radio_check_item", 3401266716, 3616842746 }, + { "global_menu_add_icon_radio_check_item", 1700867534, 3867083847 }, + { "global_menu_add_icon_radio_check_item", 4245856523, 3867083847 }, + { "global_menu_add_multistate_item", 635750054, 3297554655 }, + { "global_menu_add_multistate_item", 3431222859, 3297554655 }, { "global_menu_add_separator", 1041533178, 3214812433 }, { "tts_speak", 3741216677, 903992738 }, { "is_touchscreen_available", 4162880507, 3323674545 }, @@ -286,6 +307,12 @@ void GDExtensionCompatHashes::initialize() { { "virtual_keyboard_show", 860410478, 3042891259 }, #endif }); + mappings.insert("EditorExportPlatform", { + { "export_project_files", 425454869, 1063735070 }, + }); + mappings.insert("EditorProperty", { + { "emit_changed", 3069422438, 1822500399 }, + }); mappings.insert("ENetConnection", { { "create_host_bound", 866250949, 1515002313 }, { "connect_to_host", 385984708, 2171300490 }, @@ -453,18 +480,35 @@ void GDExtensionCompatHashes::initialize() { mappings.insert("MultiplayerAPI", { { "rpc", 1833408346, 2077486355 }, }); + mappings.insert("NativeMenu", { + { "add_item", 2553375659, 980552939 }, + { "add_check_item", 2553375659, 980552939 }, + { "add_icon_item", 2987595282, 1372188274 }, + { "add_icon_check_item", 2987595282, 1372188274 }, + { "add_radio_check_item", 2553375659, 980552939 }, + { "add_icon_radio_check_item", 2987595282, 1372188274 }, + { "add_multistate_item", 1558592568, 2674635658 }, + }); mappings.insert("NavigationMeshGenerator", { - { "parse_source_geometry_data", 3703028813, 685862123 }, - { "bake_from_source_geometry_data", 3669016597, 2469318639 }, + { "parse_source_geometry_data", 3703028813, 3172802542 }, + { "parse_source_geometry_data", 685862123, 3172802542 }, + { "bake_from_source_geometry_data", 3669016597, 1286748856 }, + { "bake_from_source_geometry_data", 2469318639, 1286748856 }, }); mappings.insert("NavigationServer2D", { { "map_get_path", 56240621, 3146466012 }, + { "parse_source_geometry_data", 1176164995, 1766905497 }, + { "bake_from_source_geometry_data", 2909414286, 2179660022 }, + { "bake_from_source_geometry_data_async", 2909414286, 2179660022 }, }); mappings.insert("NavigationServer3D", { { "map_get_path", 2121045993, 1187418690 }, - { "parse_source_geometry_data", 3703028813, 685862123 }, - { "bake_from_source_geometry_data", 3669016597, 2469318639 }, - { "bake_from_source_geometry_data_async", 3669016597, 2469318639 }, + { "parse_source_geometry_data", 3703028813, 3172802542 }, + { "parse_source_geometry_data", 685862123, 3172802542 }, + { "bake_from_source_geometry_data", 3669016597, 1286748856 }, + { "bake_from_source_geometry_data", 2469318639, 1286748856 }, + { "bake_from_source_geometry_data_async", 3669016597, 1286748856 }, + { "bake_from_source_geometry_data_async", 2469318639, 1286748856 }, }); mappings.insert("Node", { { "add_child", 3070154285, 3863233950 }, @@ -631,6 +675,11 @@ void GDExtensionCompatHashes::initialize() { mappings.insert("ProjectSettings", { { "load_resource_pack", 3001721055, 708980503 }, }); + mappings.insert("RDShaderFile", { + { "bake_from_source_geometry_data_async", 2469318639, 1286748856 }, + { "set_bytecode", 1558064255, 1526857008 }, + { "get_spirv", 3340165340, 2689310080 }, + }); mappings.insert("RegEx", { { "search", 4087180739, 3365977994 }, { "search_all", 3354100289, 849021363 }, diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp index 85f83eecfddf..ddf90f61307f 100644 --- a/core/extension/gdextension_interface.cpp +++ b/core/extension/gdextension_interface.cpp @@ -1199,6 +1199,15 @@ static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExten return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key); } +void gdextension_dictionary_set_typed(GDExtensionTypePtr p_self, GDExtensionVariantType p_key_type, GDExtensionConstStringNamePtr p_key_class_name, GDExtensionConstVariantPtr p_key_script, GDExtensionVariantType p_value_type, GDExtensionConstStringNamePtr p_value_class_name, GDExtensionConstVariantPtr p_value_script) { + Dictionary *self = reinterpret_cast(p_self); + const StringName *key_class_name = reinterpret_cast(p_key_class_name); + const Variant *key_script = reinterpret_cast(p_key_script); + const StringName *value_class_name = reinterpret_cast(p_value_class_name); + const Variant *value_script = reinterpret_cast(p_value_script); + self->set_typed((uint32_t)p_key_type, *key_class_name, *key_script, (uint32_t)p_value_type, *value_class_name, *value_script); +} + /* OBJECT API */ static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionUninitializedVariantPtr r_return, GDExtensionCallError *r_error) { @@ -1299,7 +1308,7 @@ static void gdextension_object_call_script_method(GDExtensionObjectPtr p_object, const StringName method = *reinterpret_cast(p_method); const Variant **args = (const Variant **)p_args; - Callable::CallError error; + Callable::CallError error; // TODO: Check `error`? memnew_placement(r_return, Variant); *(Variant *)r_return = o->callp(method, args, p_argument_count, error); @@ -1515,10 +1524,17 @@ static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionC return (GDExtensionMethodBindPtr)mb; } +#ifndef DISABLE_DEPRECATED static GDExtensionObjectPtr gdextension_classdb_construct_object(GDExtensionConstStringNamePtr p_classname) { const StringName classname = *reinterpret_cast(p_classname); return (GDExtensionObjectPtr)ClassDB::instantiate_no_placeholders(classname); } +#endif + +static GDExtensionObjectPtr gdextension_classdb_construct_object2(GDExtensionConstStringNamePtr p_classname) { + const StringName classname = *reinterpret_cast(p_classname); + return (GDExtensionObjectPtr)ClassDB::instantiate_without_postinitialization(classname); +} static void *gdextension_classdb_get_class_tag(GDExtensionConstStringNamePtr p_classname) { const StringName classname = *reinterpret_cast(p_classname); @@ -1672,6 +1688,7 @@ void gdextension_setup_interface() { REGISTER_INTERFACE_FUNC(array_set_typed); REGISTER_INTERFACE_FUNC(dictionary_operator_index); REGISTER_INTERFACE_FUNC(dictionary_operator_index_const); + REGISTER_INTERFACE_FUNC(dictionary_set_typed); REGISTER_INTERFACE_FUNC(object_method_bind_call); REGISTER_INTERFACE_FUNC(object_method_bind_ptrcall); REGISTER_INTERFACE_FUNC(object_destroy); @@ -1701,7 +1718,10 @@ void gdextension_setup_interface() { #endif // DISABLE_DEPRECATED REGISTER_INTERFACE_FUNC(callable_custom_create2); REGISTER_INTERFACE_FUNC(callable_custom_get_userdata); +#ifndef DISABLE_DEPRECATED REGISTER_INTERFACE_FUNC(classdb_construct_object); +#endif // DISABLE_DEPRECATED + REGISTER_INTERFACE_FUNC(classdb_construct_object2); REGISTER_INTERFACE_FUNC(classdb_get_method_bind); REGISTER_INTERFACE_FUNC(classdb_get_class_tag); REGISTER_INTERFACE_FUNC(editor_add_plugin); diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h index fce377f96738..9e3ce25698ed 100644 --- a/core/extension/gdextension_interface.h +++ b/core/extension/gdextension_interface.h @@ -268,6 +268,7 @@ typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance); typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_class_userdata); +typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance2)(void *p_class_userdata, GDExtensionBool p_notify_postinitialize); typedef void (*GDExtensionClassFreeInstance)(void *p_class_userdata, GDExtensionClassInstancePtr p_instance); typedef GDExtensionClassInstancePtr (*GDExtensionClassRecreateInstance)(void *p_class_userdata, GDExtensionObjectPtr p_object); typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_class_userdata, GDExtensionConstStringNamePtr p_name); @@ -292,7 +293,7 @@ typedef struct { GDExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function. GDExtensionClassGetRID get_rid_func; void *class_userdata; // Per-class user data, later accessible in instance bindings. -} GDExtensionClassCreationInfo; // Deprecated. Use GDExtensionClassCreationInfo3 instead. +} GDExtensionClassCreationInfo; // Deprecated. Use GDExtensionClassCreationInfo4 instead. typedef struct { GDExtensionBool is_virtual; @@ -325,7 +326,7 @@ typedef struct { GDExtensionClassCallVirtualWithData call_virtual_with_data_func; GDExtensionClassGetRID get_rid_func; void *class_userdata; // Per-class user data, later accessible in instance bindings. -} GDExtensionClassCreationInfo2; // Deprecated. Use GDExtensionClassCreationInfo3 instead. +} GDExtensionClassCreationInfo2; // Deprecated. Use GDExtensionClassCreationInfo4 instead. typedef struct { GDExtensionBool is_virtual; @@ -359,7 +360,40 @@ typedef struct { GDExtensionClassCallVirtualWithData call_virtual_with_data_func; GDExtensionClassGetRID get_rid_func; void *class_userdata; // Per-class user data, later accessible in instance bindings. -} GDExtensionClassCreationInfo3; +} GDExtensionClassCreationInfo3; // Deprecated. Use GDExtensionClassCreationInfo4 instead. + +typedef struct { + GDExtensionBool is_virtual; + GDExtensionBool is_abstract; + GDExtensionBool is_exposed; + GDExtensionBool is_runtime; + GDExtensionClassSet set_func; + GDExtensionClassGet get_func; + GDExtensionClassGetPropertyList get_property_list_func; + GDExtensionClassFreePropertyList2 free_property_list_func; + GDExtensionClassPropertyCanRevert property_can_revert_func; + GDExtensionClassPropertyGetRevert property_get_revert_func; + GDExtensionClassValidateProperty validate_property_func; + GDExtensionClassNotification2 notification_func; + GDExtensionClassToString to_string_func; + GDExtensionClassReference reference_func; + GDExtensionClassUnreference unreference_func; + GDExtensionClassCreateInstance2 create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract. + GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory. + GDExtensionClassRecreateInstance recreate_instance_func; + // Queries a virtual function by name and returns a callback to invoke the requested virtual function. + GDExtensionClassGetVirtual get_virtual_func; + // Paired with `call_virtual_with_data_func`, this is an alternative to `get_virtual_func` for extensions that + // need or benefit from extra data when calling virtual functions. + // Returns user data that will be passed to `call_virtual_with_data_func`. + // Returning `NULL` from this function signals to Godot that the virtual function is not overridden. + // Data returned from this function should be managed by the extension and must be valid until the extension is deinitialized. + // You should supply either `get_virtual_func`, or `get_virtual_call_data_func` with `call_virtual_with_data_func`. + GDExtensionClassGetVirtualCallData get_virtual_call_data_func; + // Used to call virtual functions when `get_virtual_call_data_func` is not null. + GDExtensionClassCallVirtualWithData call_virtual_with_data_func; + void *class_userdata; // Per-class user data, later accessible in instance bindings. +} GDExtensionClassCreationInfo4; typedef void *GDExtensionClassLibraryPtr; @@ -386,7 +420,9 @@ typedef enum { GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32, GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64, GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT, - GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE + GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_CHAR16, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_CHAR32, } GDExtensionClassMethodArgumentMetadata; typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); @@ -2337,6 +2373,22 @@ typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndex)(GDE */ typedef GDExtensionVariantPtr (*GDExtensionInterfaceDictionaryOperatorIndexConst)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key); +/** + * @name dictionary_set_typed + * @since 4.4 + * + * Makes a Dictionary into a typed Dictionary. + * + * @param p_self A pointer to the Dictionary. + * @param p_key_type The type of Variant the Dictionary key will store. + * @param p_key_class_name A pointer to a StringName with the name of the object (if p_key_type is GDEXTENSION_VARIANT_TYPE_OBJECT). + * @param p_key_script A pointer to a Script object (if p_key_type is GDEXTENSION_VARIANT_TYPE_OBJECT and the base class is extended by a script). + * @param p_value_type The type of Variant the Dictionary value will store. + * @param p_value_class_name A pointer to a StringName with the name of the object (if p_value_type is GDEXTENSION_VARIANT_TYPE_OBJECT). + * @param p_value_script A pointer to a Script object (if p_value_type is GDEXTENSION_VARIANT_TYPE_OBJECT and the base class is extended by a script). + */ +typedef void (*GDExtensionInterfaceDictionarySetTyped)(GDExtensionTypePtr p_self, GDExtensionVariantType p_key_type, GDExtensionConstStringNamePtr p_key_class_name, GDExtensionConstVariantPtr p_key_script, GDExtensionVariantType p_value_type, GDExtensionConstStringNamePtr p_value_class_name, GDExtensionConstVariantPtr p_value_script); + /* INTERFACE: Object */ /** @@ -2680,6 +2732,7 @@ typedef void *(*GDExtensionInterfaceCallableCustomGetUserData)(GDExtensionConstT /** * @name classdb_construct_object * @since 4.1 + * @deprecated in Godot 4.4. Use `classdb_construct_object2` instead. * * Constructs an Object of the requested class. * @@ -2691,6 +2744,22 @@ typedef void *(*GDExtensionInterfaceCallableCustomGetUserData)(GDExtensionConstT */ typedef GDExtensionObjectPtr (*GDExtensionInterfaceClassdbConstructObject)(GDExtensionConstStringNamePtr p_classname); +/** + * @name classdb_construct_object2 + * @since 4.4 + * + * Constructs an Object of the requested class. + * + * The passed class must be a built-in godot class, or an already-registered extension class. In both cases, object_set_instance() should be called to fully initialize the object. + * + * "NOTIFICATION_POSTINITIALIZE" must be sent after construction. + * + * @param p_classname A pointer to a StringName with the class name. + * + * @return A pointer to the newly created Object. + */ +typedef GDExtensionObjectPtr (*GDExtensionInterfaceClassdbConstructObject2)(GDExtensionConstStringNamePtr p_classname); + /** * @name classdb_get_method_bind * @since 4.1 @@ -2722,7 +2791,7 @@ typedef void *(*GDExtensionInterfaceClassdbGetClassTag)(GDExtensionConstStringNa /** * @name classdb_register_extension_class * @since 4.1 - * @deprecated in Godot 4.2. Use `classdb_register_extension_class3` instead. + * @deprecated in Godot 4.2. Use `classdb_register_extension_class4` instead. * * Registers an extension class in the ClassDB. * @@ -2738,7 +2807,7 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass)(GDExtensionCla /** * @name classdb_register_extension_class2 * @since 4.2 - * @deprecated in Godot 4.3. Use `classdb_register_extension_class3` instead. + * @deprecated in Godot 4.3. Use `classdb_register_extension_class4` instead. * * Registers an extension class in the ClassDB. * @@ -2754,6 +2823,7 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass2)(GDExtensionCl /** * @name classdb_register_extension_class3 * @since 4.3 + * @deprecated in Godot 4.4. Use `classdb_register_extension_class4` instead. * * Registers an extension class in the ClassDB. * @@ -2766,6 +2836,21 @@ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass2)(GDExtensionCl */ typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass3)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo3 *p_extension_funcs); +/** + * @name classdb_register_extension_class4 + * @since 4.4 + * + * Registers an extension class in the ClassDB. + * + * Provided struct can be safely freed once the function returns. + * + * @param p_library A pointer the library received by the GDExtension's entry point function. + * @param p_class_name A pointer to a StringName with the class name. + * @param p_parent_class_name A pointer to a StringName with the parent class name. + * @param p_extension_funcs A pointer to a GDExtensionClassCreationInfo2 struct. + */ +typedef void (*GDExtensionInterfaceClassdbRegisterExtensionClass4)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo4 *p_extension_funcs); + /** * @name classdb_register_extension_class_method * @since 4.1 diff --git a/core/extension/gdextension_library_loader.cpp b/core/extension/gdextension_library_loader.cpp new file mode 100644 index 000000000000..5ba4933c357e --- /dev/null +++ b/core/extension/gdextension_library_loader.cpp @@ -0,0 +1,390 @@ +/**************************************************************************/ +/* gdextension_library_loader.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "gdextension_library_loader.h" + +#include "core/config/project_settings.h" +#include "core/io/dir_access.h" +#include "core/version.h" +#include "gdextension.h" + +Vector GDExtensionLibraryLoader::find_extension_dependencies(const String &p_path, Ref p_config, std::function p_has_feature) { + Vector dependencies_shared_objects; + if (p_config->has_section("dependencies")) { + List config_dependencies; + p_config->get_section_keys("dependencies", &config_dependencies); + + for (const String &dependency : config_dependencies) { + Vector dependency_tags = dependency.split("."); + bool all_tags_met = true; + for (int i = 0; i < dependency_tags.size(); i++) { + String tag = dependency_tags[i].strip_edges(); + if (!p_has_feature(tag)) { + all_tags_met = false; + break; + } + } + + if (all_tags_met) { + Dictionary dependency_value = p_config->get_value("dependencies", dependency); + for (const Variant *key = dependency_value.next(nullptr); key; key = dependency_value.next(key)) { + String dependency_path = *key; + String target_path = dependency_value[*key]; + if (dependency_path.is_relative_path()) { + dependency_path = p_path.get_base_dir().path_join(dependency_path); + } + dependencies_shared_objects.push_back(SharedObject(dependency_path, dependency_tags, target_path)); + } + break; + } + } + } + + return dependencies_shared_objects; +} + +String GDExtensionLibraryLoader::find_extension_library(const String &p_path, Ref p_config, std::function p_has_feature, PackedStringArray *r_tags) { + // First, check the explicit libraries. + if (p_config->has_section("libraries")) { + List libraries; + p_config->get_section_keys("libraries", &libraries); + + // Iterate the libraries, finding the best matching tags. + String best_library_path; + Vector best_library_tags; + for (const String &E : libraries) { + Vector tags = E.split("."); + bool all_tags_met = true; + for (int i = 0; i < tags.size(); i++) { + String tag = tags[i].strip_edges(); + if (!p_has_feature(tag)) { + all_tags_met = false; + break; + } + } + + if (all_tags_met && tags.size() > best_library_tags.size()) { + best_library_path = p_config->get_value("libraries", E); + best_library_tags = tags; + } + } + + if (!best_library_path.is_empty()) { + if (best_library_path.is_relative_path()) { + best_library_path = p_path.get_base_dir().path_join(best_library_path); + } + if (r_tags != nullptr) { + r_tags->append_array(best_library_tags); + } + return best_library_path; + } + } + + // Second, try to autodetect. + String autodetect_library_prefix; + if (p_config->has_section_key("configuration", "autodetect_library_prefix")) { + autodetect_library_prefix = p_config->get_value("configuration", "autodetect_library_prefix"); + } + if (!autodetect_library_prefix.is_empty()) { + String autodetect_path = autodetect_library_prefix; + if (autodetect_path.is_relative_path()) { + autodetect_path = p_path.get_base_dir().path_join(autodetect_path); + } + + // Find the folder and file parts of the prefix. + String folder; + String file_prefix; + if (DirAccess::dir_exists_absolute(autodetect_path)) { + folder = autodetect_path; + } else if (DirAccess::dir_exists_absolute(autodetect_path.get_base_dir())) { + folder = autodetect_path.get_base_dir(); + file_prefix = autodetect_path.get_file(); + } else { + ERR_FAIL_V_MSG(String(), vformat("Error in extension: %s. Could not find folder for automatic detection of libraries files. autodetect_library_prefix=\"%s\"", p_path, autodetect_library_prefix)); + } + + // Open the folder. + Ref dir = DirAccess::open(folder); + ERR_FAIL_COND_V_MSG(dir.is_null(), String(), vformat("Error in extension: %s. Could not open folder for automatic detection of libraries files. autodetect_library_prefix=\"%s\"", p_path, autodetect_library_prefix)); + + // Iterate the files and check the prefixes, finding the best matching file. + String best_file; + Vector best_file_tags; + dir->list_dir_begin(); + String file_name = dir->_get_next(); + while (file_name != "") { + if (!dir->current_is_dir() && file_name.begins_with(file_prefix)) { + // Check if the files matches all requested feature tags. + String tags_str = file_name.trim_prefix(file_prefix); + tags_str = tags_str.trim_suffix(tags_str.get_extension()); + + Vector tags = tags_str.split(".", false); + bool all_tags_met = true; + for (int i = 0; i < tags.size(); i++) { + String tag = tags[i].strip_edges(); + if (!p_has_feature(tag)) { + all_tags_met = false; + break; + } + } + + // If all tags are found in the feature list, and we found more tags than before, use this file. + if (all_tags_met && tags.size() > best_file_tags.size()) { + best_file_tags = tags; + best_file = file_name; + } + } + file_name = dir->_get_next(); + } + + if (!best_file.is_empty()) { + String library_path = folder.path_join(best_file); + if (r_tags != nullptr) { + r_tags->append_array(best_file_tags); + } + return library_path; + } + } + return String(); +} + +Error GDExtensionLibraryLoader::open_library(const String &p_path) { + Error err = parse_gdextension_file(p_path); + if (err != OK) { + return err; + } + + String abs_path = ProjectSettings::get_singleton()->globalize_path(library_path); + + Vector abs_dependencies_paths; + if (!library_dependencies.is_empty()) { + for (const SharedObject &dependency : library_dependencies) { + abs_dependencies_paths.push_back(ProjectSettings::get_singleton()->globalize_path(dependency.path)); + } + } + + OS::GDExtensionData data = { + true, // also_set_library_path + &library_path, // r_resolved_path + Engine::get_singleton()->is_editor_hint(), // generate_temp_files + &abs_dependencies_paths, // library_dependencies + }; + + err = OS::get_singleton()->open_dynamic_library(is_static_library ? String() : abs_path, library, &data); + if (err != OK) { + return err; + } + + return OK; +} + +Error GDExtensionLibraryLoader::initialize(GDExtensionInterfaceGetProcAddress p_get_proc_address, const Ref &p_extension, GDExtensionInitialization *r_initialization) { +#ifdef TOOLS_ENABLED + p_extension->set_reloadable(is_reloadable && Engine::get_singleton()->is_extension_reloading_enabled()); +#endif + + for (const KeyValue &icon : class_icon_paths) { + p_extension->class_icon_paths[icon.key] = icon.value; + } + + void *entry_funcptr = nullptr; + + Error err = OS::get_singleton()->get_dynamic_library_symbol_handle(library, entry_symbol, entry_funcptr, false); + + if (err != OK) { + ERR_PRINT("GDExtension entry point '" + entry_symbol + "' not found in library " + library_path); + return err; + } + + GDExtensionInitializationFunction initialization_function = (GDExtensionInitializationFunction)entry_funcptr; + + GDExtensionBool ret = initialization_function(p_get_proc_address, p_extension.ptr(), r_initialization); + + if (ret) { + return OK; + } else { + ERR_PRINT("GDExtension initialization function '" + entry_symbol + "' returned an error."); + return FAILED; + } +} + +void GDExtensionLibraryLoader::close_library() { + OS::get_singleton()->close_dynamic_library(library); + library = nullptr; +} + +bool GDExtensionLibraryLoader::is_library_open() const { + return library != nullptr; +} + +bool GDExtensionLibraryLoader::has_library_changed() const { +#ifdef TOOLS_ENABLED + // Check only that the last modified time is different (rather than checking + // that it's newer) since some OS's (namely Windows) will preserve the modified + // time by default when copying files. + if (FileAccess::get_modified_time(resource_path) != resource_last_modified_time) { + return true; + } + if (FileAccess::get_modified_time(library_path) != library_last_modified_time) { + return true; + } +#endif + return false; +} + +Error GDExtensionLibraryLoader::parse_gdextension_file(const String &p_path) { + resource_path = p_path; + + Ref config; + config.instantiate(); + + Error err = config->load(p_path); + + if (err != OK) { + ERR_PRINT("Error loading GDExtension configuration file: " + p_path); + return err; + } + + if (!config->has_section_key("configuration", "entry_symbol")) { + ERR_PRINT("GDExtension configuration file must contain a \"configuration/entry_symbol\" key: " + p_path); + return ERR_INVALID_DATA; + } + + entry_symbol = config->get_value("configuration", "entry_symbol"); + + uint32_t compatibility_minimum[3] = { 0, 0, 0 }; + if (config->has_section_key("configuration", "compatibility_minimum")) { + String compat_string = config->get_value("configuration", "compatibility_minimum"); + Vector parts = compat_string.split_ints("."); + for (int i = 0; i < parts.size(); i++) { + if (i >= 3) { + break; + } + if (parts[i] >= 0) { + compatibility_minimum[i] = parts[i]; + } + } + } else { + ERR_PRINT("GDExtension configuration file must contain a \"configuration/compatibility_minimum\" key: " + p_path); + return ERR_INVALID_DATA; + } + + if (compatibility_minimum[0] < 4 || (compatibility_minimum[0] == 4 && compatibility_minimum[1] == 0)) { + ERR_PRINT(vformat("GDExtension's compatibility_minimum (%d.%d.%d) must be at least 4.1.0: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path)); + return ERR_INVALID_DATA; + } + + bool compatible = true; + // Check version lexicographically. + if (VERSION_MAJOR != compatibility_minimum[0]) { + compatible = VERSION_MAJOR > compatibility_minimum[0]; + } else if (VERSION_MINOR != compatibility_minimum[1]) { + compatible = VERSION_MINOR > compatibility_minimum[1]; + } else { + compatible = VERSION_PATCH >= compatibility_minimum[2]; + } + if (!compatible) { + ERR_PRINT(vformat("GDExtension only compatible with Godot version %d.%d.%d or later: %s", compatibility_minimum[0], compatibility_minimum[1], compatibility_minimum[2], p_path)); + return ERR_INVALID_DATA; + } + + // Optionally check maximum compatibility. + if (config->has_section_key("configuration", "compatibility_maximum")) { + uint32_t compatibility_maximum[3] = { 0, 0, 0 }; + String compat_string = config->get_value("configuration", "compatibility_maximum"); + Vector parts = compat_string.split_ints("."); + for (int i = 0; i < 3; i++) { + if (i < parts.size() && parts[i] >= 0) { + compatibility_maximum[i] = parts[i]; + } else { + // If a version part is missing, set the maximum to an arbitrary high value. + compatibility_maximum[i] = 9999; + } + } + + compatible = true; + if (VERSION_MAJOR != compatibility_maximum[0]) { + compatible = VERSION_MAJOR < compatibility_maximum[0]; + } else if (VERSION_MINOR != compatibility_maximum[1]) { + compatible = VERSION_MINOR < compatibility_maximum[1]; + } +#if VERSION_PATCH + // #if check to avoid -Wtype-limits warning when 0. + else { + compatible = VERSION_PATCH <= compatibility_maximum[2]; + } +#endif + + if (!compatible) { + ERR_PRINT(vformat("GDExtension only compatible with Godot version %s or earlier: %s", compat_string, p_path)); + return ERR_INVALID_DATA; + } + } + + library_path = find_extension_library(p_path, config, [](const String &p_feature) { return OS::get_singleton()->has_feature(p_feature); }); + + if (library_path.is_empty()) { + const String os_arch = OS::get_singleton()->get_name().to_lower() + "." + Engine::get_singleton()->get_architecture_name(); + ERR_PRINT(vformat("No GDExtension library found for current OS and architecture (%s) in configuration file: %s", os_arch, p_path)); + return ERR_FILE_NOT_FOUND; + } + + is_static_library = library_path.ends_with(".a") || library_path.ends_with(".xcframework"); + + if (!library_path.is_resource_file() && !library_path.is_absolute_path()) { + library_path = p_path.get_base_dir().path_join(library_path); + } + +#ifdef TOOLS_ENABLED + is_reloadable = config->get_value("configuration", "reloadable", false); + + update_last_modified_time( + FileAccess::get_modified_time(resource_path), + FileAccess::get_modified_time(library_path)); +#endif + + library_dependencies = find_extension_dependencies(p_path, config, [](const String &p_feature) { return OS::get_singleton()->has_feature(p_feature); }); + + // Handle icons if any are specified. + if (config->has_section("icons")) { + List keys; + config->get_section_keys("icons", &keys); + for (const String &key : keys) { + String icon_path = config->get_value("icons", key); + if (icon_path.is_relative_path()) { + icon_path = p_path.get_base_dir().path_join(icon_path); + } + + class_icon_paths[key] = icon_path; + } + } + + return OK; +} diff --git a/core/extension/gdextension_library_loader.h b/core/extension/gdextension_library_loader.h new file mode 100644 index 000000000000..f4372a75d418 --- /dev/null +++ b/core/extension/gdextension_library_loader.h @@ -0,0 +1,84 @@ +/**************************************************************************/ +/* gdextension_library_loader.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef GDEXTENSION_LIBRARY_LOADER_H +#define GDEXTENSION_LIBRARY_LOADER_H + +#include + +#include "core/extension/gdextension_loader.h" +#include "core/io/config_file.h" +#include "core/os/shared_object.h" + +class GDExtensionLibraryLoader : public GDExtensionLoader { + friend class GDExtensionManager; + friend class GDExtension; + +private: + String resource_path; + + void *library = nullptr; // pointer if valid. + String library_path; + String entry_symbol; + + bool is_static_library = false; + +#ifdef TOOLS_ENABLED + bool is_reloadable = false; +#endif + + Vector library_dependencies; + + HashMap class_icon_paths; + +#ifdef TOOLS_ENABLED + uint64_t resource_last_modified_time = 0; + uint64_t library_last_modified_time = 0; + + void update_last_modified_time(uint64_t p_resource_last_modified_time, uint64_t p_library_last_modified_time) { + resource_last_modified_time = p_resource_last_modified_time; + library_last_modified_time = p_library_last_modified_time; + } +#endif + +public: + static String find_extension_library(const String &p_path, Ref p_config, std::function p_has_feature, PackedStringArray *r_tags = nullptr); + static Vector find_extension_dependencies(const String &p_path, Ref p_config, std::function p_has_feature); + + virtual Error open_library(const String &p_path) override; + virtual Error initialize(GDExtensionInterfaceGetProcAddress p_get_proc_address, const Ref &p_extension, GDExtensionInitialization *r_initialization) override; + virtual void close_library() override; + virtual bool is_library_open() const override; + virtual bool has_library_changed() const override; + + Error parse_gdextension_file(const String &p_path); +}; + +#endif // GDEXTENSION_LIBRARY_LOADER_H diff --git a/core/extension/gdextension_loader.h b/core/extension/gdextension_loader.h new file mode 100644 index 000000000000..7d779858b72c --- /dev/null +++ b/core/extension/gdextension_loader.h @@ -0,0 +1,47 @@ +/**************************************************************************/ +/* gdextension_loader.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef GDEXTENSION_LOADER_H +#define GDEXTENSION_LOADER_H + +#include "core/object/ref_counted.h" + +class GDExtension; + +class GDExtensionLoader : public RefCounted { +public: + virtual Error open_library(const String &p_path) = 0; + virtual Error initialize(GDExtensionInterfaceGetProcAddress p_get_proc_address, const Ref &p_extension, GDExtensionInitialization *r_initialization) = 0; + virtual void close_library() = 0; + virtual bool is_library_open() const = 0; + virtual bool has_library_changed() const = 0; +}; + +#endif // GDEXTENSION_LOADER_H diff --git a/core/extension/gdextension_manager.cpp b/core/extension/gdextension_manager.cpp index 1ee9de077689..01efe0d96e91 100644 --- a/core/extension/gdextension_manager.cpp +++ b/core/extension/gdextension_manager.cpp @@ -31,14 +31,19 @@ #include "gdextension_manager.h" #include "core/extension/gdextension_compat_hashes.h" +#include "core/extension/gdextension_library_loader.h" +#include "core/io/dir_access.h" #include "core/io/file_access.h" #include "core/object/script_language.h" -GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(const Ref &p_extension) { +GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(const Ref &p_extension, bool p_first_load) { if (level >= 0) { // Already initialized up to some level. - int32_t minimum_level = p_extension->get_minimum_library_initialization_level(); - if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) { - return LOAD_STATUS_NEEDS_RESTART; + int32_t minimum_level = 0; + if (!p_first_load) { + minimum_level = p_extension->get_minimum_library_initialization_level(); + if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) { + return LOAD_STATUS_NEEDS_RESTART; + } } // Initialize up to current level. for (int32_t i = minimum_level; i <= level; i++) { @@ -50,10 +55,20 @@ GDExtensionManager::LoadStatus GDExtensionManager::_load_extension_internal(cons gdextension_class_icon_paths[kv.key] = kv.value; } +#ifdef TOOLS_ENABLED + // Signals that a new extension is loaded so GDScript can register new class names. + emit_signal("extension_loaded", p_extension); +#endif + return LOAD_STATUS_OK; } GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(const Ref &p_extension) { +#ifdef TOOLS_ENABLED + // Signals that a new extension is unloading so GDScript can unregister class names. + emit_signal("extension_unloading", p_extension); +#endif + if (level >= 0) { // Already initialized up to some level. // Deinitialize down from current level. for (int32_t i = level; i >= GDExtension::INITIALIZATION_LEVEL_CORE; i--) { @@ -69,19 +84,31 @@ GDExtensionManager::LoadStatus GDExtensionManager::_unload_extension_internal(co } GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) { + Ref loader; + loader.instantiate(); + return GDExtensionManager::get_singleton()->load_extension_with_loader(p_path, loader); +} + +GDExtensionManager::LoadStatus GDExtensionManager::load_extension_with_loader(const String &p_path, const Ref &p_loader) { + DEV_ASSERT(p_loader.is_valid()); + if (gdextension_map.has(p_path)) { return LOAD_STATUS_ALREADY_LOADED; } - Ref extension = ResourceLoader::load(p_path); - if (extension.is_null()) { + + Ref extension; + extension.instantiate(); + Error err = extension->open_library(p_path, p_loader); + if (err != OK) { return LOAD_STATUS_FAILED; } - LoadStatus status = _load_extension_internal(extension); + LoadStatus status = _load_extension_internal(extension, true); if (status != LOAD_STATUS_OK) { return status; } + extension->set_path(p_path); gdextension_map[p_path] = extension; return LOAD_STATUS_OK; } @@ -117,12 +144,12 @@ GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String extension->close_library(); } - Error err = GDExtensionResourceLoader::load_gdextension_resource(p_path, extension); + Error err = extension->open_library(p_path, extension->loader); if (err != OK) { return LOAD_STATUS_FAILED; } - status = _load_extension_internal(extension); + status = _load_extension_internal(extension, false); if (status != LOAD_STATUS_OK) { return status; } @@ -261,6 +288,71 @@ void GDExtensionManager::reload_extensions() { #endif } +bool GDExtensionManager::ensure_extensions_loaded(const HashSet &p_extensions) { + Vector extensions_added; + Vector extensions_removed; + + for (const String &E : p_extensions) { + if (!is_extension_loaded(E)) { + extensions_added.push_back(E); + } + } + + Vector loaded_extensions = get_loaded_extensions(); + for (const String &loaded_extension : loaded_extensions) { + if (!p_extensions.has(loaded_extension)) { + // The extension may not have a .gdextension file. + if (!FileAccess::exists(loaded_extension)) { + extensions_removed.push_back(loaded_extension); + } + } + } + + String extension_list_config_file = GDExtension::get_extension_list_config_file(); + if (p_extensions.size()) { + if (extensions_added.size() || extensions_removed.size()) { + // Extensions were added or removed. + Ref f = FileAccess::open(extension_list_config_file, FileAccess::WRITE); + for (const String &E : p_extensions) { + f->store_line(E); + } + } + } else { + if (loaded_extensions.size() || FileAccess::exists(extension_list_config_file)) { + // Extensions were removed. + Ref da = DirAccess::create(DirAccess::ACCESS_RESOURCES); + da->remove(extension_list_config_file); + } + } + + bool needs_restart = false; + for (const String &extension : extensions_added) { + GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->load_extension(extension); + if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) { + needs_restart = true; + } + } + + for (const String &extension : extensions_removed) { + GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->unload_extension(extension); + if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) { + needs_restart = true; + } + } + +#ifdef TOOLS_ENABLED + if (extensions_added.size() || extensions_removed.size()) { + // Emitting extensions_reloaded so EditorNode can reload Inspector and regenerate documentation. + emit_signal("extensions_reloaded"); + + // Reload all scripts to clear out old references. + callable_mp_static(&GDExtensionManager::_reload_all_scripts).call_deferred(); + } +#endif + + return needs_restart; +} + GDExtensionManager *GDExtensionManager::get_singleton() { return singleton; } @@ -281,6 +373,8 @@ void GDExtensionManager::_bind_methods() { BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART); ADD_SIGNAL(MethodInfo("extensions_reloaded")); + ADD_SIGNAL(MethodInfo("extension_loaded", PropertyInfo(Variant::OBJECT, "extension", PROPERTY_HINT_RESOURCE_TYPE, "GDExtension"))); + ADD_SIGNAL(MethodInfo("extension_unloading", PropertyInfo(Variant::OBJECT, "extension", PROPERTY_HINT_RESOURCE_TYPE, "GDExtension"))); } GDExtensionManager *GDExtensionManager::singleton = nullptr; diff --git a/core/extension/gdextension_manager.h b/core/extension/gdextension_manager.h index 9386e356bbec..39a600474cda 100644 --- a/core/extension/gdextension_manager.h +++ b/core/extension/gdextension_manager.h @@ -54,7 +54,7 @@ class GDExtensionManager : public Object { }; private: - LoadStatus _load_extension_internal(const Ref &p_extension); + LoadStatus _load_extension_internal(const Ref &p_extension, bool p_first_load); LoadStatus _unload_extension_internal(const Ref &p_extension); #ifdef TOOLS_ENABLED @@ -63,6 +63,7 @@ class GDExtensionManager : public Object { public: LoadStatus load_extension(const String &p_path); + LoadStatus load_extension_with_loader(const String &p_path, const Ref &p_loader); LoadStatus reload_extension(const String &p_path); LoadStatus unload_extension(const String &p_path); bool is_extension_loaded(const String &p_path) const; @@ -84,6 +85,7 @@ class GDExtensionManager : public Object { void load_extensions(); void reload_extensions(); + bool ensure_extensions_loaded(const HashSet &p_extensions); GDExtensionManager(); ~GDExtensionManager(); diff --git a/core/input/godotcontrollerdb.txt b/core/input/godotcontrollerdb.txt index f5158bfabbfb..8e8ec4c7186a 100644 --- a/core/input/godotcontrollerdb.txt +++ b/core/input/godotcontrollerdb.txt @@ -8,7 +8,7 @@ __XINPUT_DEVICE__,XInput Gamepad,a:b12,b:b13,x:b14,y:b15,start:b4,guide:b10,back Default Android Gamepad,Default Controller,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b8,rightshoulder:b10,rightx:a2,start:b6,righty:a3,dpleft:h0.8,lefttrigger:a4,x:b2,dpup:h0.1,back:b4,leftstick:b7,leftshoulder:b9,y:b3,a:b0,dpright:h0.2,righttrigger:a5,b:b1,platform:Android, # Web -standard,Standard Gamepad Mapping,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b8,start:b9,leftstick:b10,rightstick:b11,dpup:b12,dpdown:b13,dpleft:b14,dpright:b15,guide:b16,leftstick:b10,rightstick:b11,platform:Web, +standard,Standard Gamepad Mapping,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:+a4,righttrigger:+a5,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b8,start:b9,leftstick:b10,rightstick:b11,dpup:b12,dpdown:b13,dpleft:b14,dpright:b15,guide:b16,leftstick:b10,rightstick:b11,platform:Web, Linux24c6581a,PowerA Xbox One Cabled,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web, Linux0e6f0301,Logic 3 Controller (xbox compatible),a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web, Linux045e028e,Microsoft X-Box 360 pad,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:-a7,dpleft:-a6,dpdown:+a7,dpright:+a6,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Web, diff --git a/core/input/input.cpp b/core/input/input.cpp index 91378591b0a0..eba7ded267ba 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -513,21 +513,49 @@ void Input::joy_connection_changed(int p_idx, bool p_connected, const String &p_ Vector3 Input::get_gravity() const { _THREAD_SAFE_METHOD_ + +#ifdef DEBUG_ENABLED + if (!gravity_enabled) { + WARN_PRINT_ONCE("`input_devices/sensors/enable_gravity` is not enabled in project settings."); + } +#endif + return gravity; } Vector3 Input::get_accelerometer() const { _THREAD_SAFE_METHOD_ + +#ifdef DEBUG_ENABLED + if (!accelerometer_enabled) { + WARN_PRINT_ONCE("`input_devices/sensors/enable_accelerometer` is not enabled in project settings."); + } +#endif + return accelerometer; } Vector3 Input::get_magnetometer() const { _THREAD_SAFE_METHOD_ + +#ifdef DEBUG_ENABLED + if (!magnetometer_enabled) { + WARN_PRINT_ONCE("`input_devices/sensors/enable_magnetometer` is not enabled in project settings."); + } +#endif + return magnetometer; } Vector3 Input::get_gyroscope() const { _THREAD_SAFE_METHOD_ + +#ifdef DEBUG_ENABLED + if (!gyroscope_enabled) { + WARN_PRINT_ONCE("`input_devices/sensors/enable_gyroscope` is not enabled in project settings."); + } +#endif + return gyroscope; } @@ -1683,6 +1711,11 @@ Input::Input() { // Always use standard behavior in the editor. legacy_just_pressed_behavior = false; } + + accelerometer_enabled = GLOBAL_DEF_RST_BASIC("input_devices/sensors/enable_accelerometer", false); + gravity_enabled = GLOBAL_DEF_RST_BASIC("input_devices/sensors/enable_gravity", false); + gyroscope_enabled = GLOBAL_DEF_RST_BASIC("input_devices/sensors/enable_gyroscope", false); + magnetometer_enabled = GLOBAL_DEF_RST_BASIC("input_devices/sensors/enable_magnetometer", false); } Input::~Input() { diff --git a/core/input/input.h b/core/input/input.h index 89e48f53d740..95dd623cc032 100644 --- a/core/input/input.h +++ b/core/input/input.h @@ -92,9 +92,13 @@ class Input : public Object { RBSet joy_buttons_pressed; RBMap _joy_axis; //RBMap custom_action_press; + bool gravity_enabled = false; Vector3 gravity; + bool accelerometer_enabled = false; Vector3 accelerometer; + bool magnetometer_enabled = false; Vector3 magnetometer; + bool gyroscope_enabled = false; Vector3 gyroscope; Vector2 mouse_pos; int64_t mouse_window = 0; diff --git a/core/input/input_event.cpp b/core/input/input_event.cpp index de3efa7a3a4f..905526bbbd88 100644 --- a/core/input/input_event.cpp +++ b/core/input/input_event.cpp @@ -1088,7 +1088,7 @@ void InputEventMouseMotion::_bind_methods() { /////////////////////////////////// void InputEventJoypadMotion::set_axis(JoyAxis p_axis) { - ERR_FAIL_COND(p_axis < JoyAxis::LEFT_X || p_axis > JoyAxis::MAX); + ERR_FAIL_COND(p_axis < JoyAxis::INVALID || p_axis > JoyAxis::MAX); axis = p_axis; emit_changed(); diff --git a/core/input/input_map.cpp b/core/input/input_map.cpp index ddeee9d765a2..9a772c87c9b1 100644 --- a/core/input/input_map.cpp +++ b/core/input/input_map.cpp @@ -400,6 +400,7 @@ static const _BuiltinActionDisplayName _builtin_action_display_names[] = { { "ui_filedialog_refresh", TTRC("Refresh") }, { "ui_filedialog_show_hidden", TTRC("Show Hidden") }, { "ui_swap_input_direction ", TTRC("Swap Input Direction") }, + { "ui_unicode_start", TTRC("Start Unicode Character Input") }, { "", ""} /* clang-format on */ }; @@ -754,6 +755,10 @@ const HashMap>> &InputMap::get_builtins() { inputs.push_back(InputEventKey::create_reference(Key::KP_ENTER)); default_builtin_cache.insert("ui_text_submit", inputs); + inputs = List>(); + inputs.push_back(InputEventKey::create_reference(Key::U | KeyModifierMask::CTRL | KeyModifierMask::SHIFT)); + default_builtin_cache.insert("ui_unicode_start", inputs); + // ///// UI Graph Shortcuts ///// inputs = List>(); diff --git a/core/io/dtls_server.cpp b/core/io/dtls_server.cpp index 07d62d3a8d47..7638328dc33e 100644 --- a/core/io/dtls_server.cpp +++ b/core/io/dtls_server.cpp @@ -33,12 +33,12 @@ #include "core/config/project_settings.h" #include "core/io/file_access.h" -DTLSServer *(*DTLSServer::_create)() = nullptr; +DTLSServer *(*DTLSServer::_create)(bool p_notify_postinitialize) = nullptr; bool DTLSServer::available = false; -DTLSServer *DTLSServer::create() { +DTLSServer *DTLSServer::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } diff --git a/core/io/dtls_server.h b/core/io/dtls_server.h index f3fbde3c152a..5ffed1ecc381 100644 --- a/core/io/dtls_server.h +++ b/core/io/dtls_server.h @@ -38,14 +38,14 @@ class DTLSServer : public RefCounted { GDCLASS(DTLSServer, RefCounted); protected: - static DTLSServer *(*_create)(); + static DTLSServer *(*_create)(bool p_notify_postinitialize); static void _bind_methods(); static bool available; public: static bool is_available(); - static DTLSServer *create(); + static DTLSServer *create(bool p_notify_postinitialize = true); virtual Error setup(Ref p_options) = 0; virtual void stop() = 0; diff --git a/core/io/file_access.cpp b/core/io/file_access.cpp index 1cf388b33a79..d919243e6b7a 100644 --- a/core/io/file_access.cpp +++ b/core/io/file_access.cpp @@ -59,11 +59,9 @@ bool FileAccess::exists(const String &p_name) { return true; } - Ref f = open(p_name, READ); - if (f.is_null()) { - return false; - } - return true; + // Using file_exists because it's faster than trying to open the file. + Ref ret = create_for_path(p_name); + return ret->file_exists(p_name); } void FileAccess::_set_access_type(AccessType p_access) { @@ -225,59 +223,44 @@ String FileAccess::fix_path(const String &p_path) const { } /* these are all implemented for ease of porting, then can later be optimized */ +uint8_t FileAccess::get_8() const { + uint8_t data = 0; + get_buffer(&data, sizeof(uint8_t)); -uint16_t FileAccess::get_16() const { - uint16_t res; - uint8_t a, b; + return data; +} - a = get_8(); - b = get_8(); +uint16_t FileAccess::get_16() const { + uint16_t data = 0; + get_buffer(reinterpret_cast(&data), sizeof(uint16_t)); if (big_endian) { - SWAP(a, b); + data = BSWAP16(data); } - res = b; - res <<= 8; - res |= a; - - return res; + return data; } uint32_t FileAccess::get_32() const { - uint32_t res; - uint16_t a, b; - - a = get_16(); - b = get_16(); + uint32_t data = 0; + get_buffer(reinterpret_cast(&data), sizeof(uint32_t)); if (big_endian) { - SWAP(a, b); + data = BSWAP32(data); } - res = b; - res <<= 16; - res |= a; - - return res; + return data; } uint64_t FileAccess::get_64() const { - uint64_t res; - uint32_t a, b; - - a = get_32(); - b = get_32(); + uint64_t data = 0; + get_buffer(reinterpret_cast(&data), sizeof(uint64_t)); if (big_endian) { - SWAP(a, b); + data = BSWAP64(data); } - res = b; - res <<= 32; - res |= a; - - return res; + return data; } float FileAccess::get_float() const { @@ -467,17 +450,6 @@ String FileAccess::get_as_text(bool p_skip_cr) const { return text; } -uint64_t FileAccess::get_buffer(uint8_t *p_dst, uint64_t p_length) const { - ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); - - uint64_t i = 0; - for (i = 0; i < p_length && !eof_reached(); i++) { - p_dst[i] = get_8(); - } - - return i; -} - Vector FileAccess::get_buffer(int64_t p_length) const { Vector data; @@ -490,7 +462,7 @@ Vector FileAccess::get_buffer(int64_t p_length) const { ERR_FAIL_COND_V_MSG(err != OK, data, "Can't resize data to " + itos(p_length) + " elements."); uint8_t *w = data.ptrw(); - int64_t len = get_buffer(&w[0], p_length); + int64_t len = get_buffer(w, p_length); if (len < p_length) { data.resize(len); @@ -514,46 +486,32 @@ String FileAccess::get_as_utf8_string(bool p_skip_cr) const { return s; } -void FileAccess::store_16(uint16_t p_dest) { - uint8_t a, b; - - a = p_dest & 0xFF; - b = p_dest >> 8; +void FileAccess::store_8(uint8_t p_dest) { + store_buffer(&p_dest, sizeof(uint8_t)); +} +void FileAccess::store_16(uint16_t p_dest) { if (big_endian) { - SWAP(a, b); + p_dest = BSWAP16(p_dest); } - store_8(a); - store_8(b); + store_buffer(reinterpret_cast(&p_dest), sizeof(uint16_t)); } void FileAccess::store_32(uint32_t p_dest) { - uint16_t a, b; - - a = p_dest & 0xFFFF; - b = p_dest >> 16; - if (big_endian) { - SWAP(a, b); + p_dest = BSWAP32(p_dest); } - store_16(a); - store_16(b); + store_buffer(reinterpret_cast(&p_dest), sizeof(uint32_t)); } void FileAccess::store_64(uint64_t p_dest) { - uint32_t a, b; - - a = p_dest & 0xFFFFFFFF; - b = p_dest >> 32; - if (big_endian) { - SWAP(a, b); + p_dest = BSWAP64(p_dest); } - store_32(a); - store_32(b); + store_buffer(reinterpret_cast(&p_dest), sizeof(uint64_t)); } void FileAccess::store_real(real_t p_real) { @@ -710,22 +668,11 @@ void FileAccess::store_csv_line(const Vector &p_values, const String &p_ store_line(line); } -void FileAccess::store_buffer(const uint8_t *p_src, uint64_t p_length) { - ERR_FAIL_COND(!p_src && p_length > 0); - for (uint64_t i = 0; i < p_length; i++) { - store_8(p_src[i]); - } -} - void FileAccess::store_buffer(const Vector &p_buffer) { uint64_t len = p_buffer.size(); - if (len == 0) { - return; - } - const uint8_t *r = p_buffer.ptr(); - store_buffer(&r[0], len); + store_buffer(r, len); } void FileAccess::store_var(const Variant &p_var, bool p_full_objects) { diff --git a/core/io/file_access.h b/core/io/file_access.h index 2ab84db4b63d..2f4d1a860435 100644 --- a/core/io/file_access.h +++ b/core/io/file_access.h @@ -137,7 +137,7 @@ class FileAccess : public RefCounted { virtual bool eof_reached() const = 0; ///< reading passed EOF - virtual uint8_t get_8() const = 0; ///< get a byte + virtual uint8_t get_8() const; ///< get a byte virtual uint16_t get_16() const; ///< get 16 bits uint virtual uint32_t get_32() const; ///< get 32 bits uint virtual uint64_t get_64() const; ///< get 64 bits uint @@ -148,7 +148,7 @@ class FileAccess : public RefCounted { Variant get_var(bool p_allow_objects = false) const; - virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const; ///< get an array of bytes + virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const = 0; ///< get an array of bytes, needs to be overwritten by children. Vector get_buffer(int64_t p_length) const; virtual String get_line() const; virtual String get_token() const; @@ -168,7 +168,7 @@ class FileAccess : public RefCounted { virtual Error resize(int64_t p_length) = 0; virtual void flush() = 0; - virtual void store_8(uint8_t p_dest) = 0; ///< store a byte + virtual void store_8(uint8_t p_dest); ///< store a byte virtual void store_16(uint16_t p_dest); ///< store 16 bits uint virtual void store_32(uint32_t p_dest); ///< store 32 bits uint virtual void store_64(uint64_t p_dest); ///< store 64 bits uint @@ -184,7 +184,7 @@ class FileAccess : public RefCounted { virtual void store_pascal_string(const String &p_string); virtual String get_pascal_string(); - virtual void store_buffer(const uint8_t *p_src, uint64_t p_length); ///< store an array of bytes + virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) = 0; ///< store an array of bytes, needs to be overwritten by children. void store_buffer(const Vector &p_buffer); void store_var(const Variant &p_var, bool p_full_objects = false); diff --git a/core/io/file_access_compressed.cpp b/core/io/file_access_compressed.cpp index 0f00bd292cdd..3602baf8c5cc 100644 --- a/core/io/file_access_compressed.cpp +++ b/core/io/file_access_compressed.cpp @@ -260,38 +260,6 @@ bool FileAccessCompressed::eof_reached() const { } } -uint8_t FileAccessCompressed::get_8() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use."); - ERR_FAIL_COND_V_MSG(writing, 0, "File has not been opened in read mode."); - - if (at_end) { - read_eof = true; - return 0; - } - - uint8_t ret = read_ptr[read_pos]; - - read_pos++; - if (read_pos >= read_block_size) { - read_block++; - - if (read_block < read_block_count) { - //read another block of compressed data - f->get_buffer(comp_buffer.ptrw(), read_blocks[read_block].csize); - int total = Compression::decompress(buffer.ptrw(), read_blocks.size() == 1 ? read_total : block_size, comp_buffer.ptr(), read_blocks[read_block].csize, cmode); - ERR_FAIL_COND_V_MSG(total == -1, 0, "Compressed file is corrupt."); - read_block_size = read_block == read_block_count - 1 ? read_total % block_size : block_size; - read_pos = 0; - - } else { - read_block--; - at_end = true; - } - } - - return ret; -} - uint64_t FileAccessCompressed::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); ERR_FAIL_COND_V_MSG(f.is_null(), -1, "File must be opened before use."); @@ -341,12 +309,13 @@ void FileAccessCompressed::flush() { // compressed files keep data in memory till close() } -void FileAccessCompressed::store_8(uint8_t p_dest) { +void FileAccessCompressed::store_buffer(const uint8_t *p_src, uint64_t p_length) { ERR_FAIL_COND_MSG(f.is_null(), "File must be opened before use."); ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode."); - WRITE_FIT(1); - write_ptr[write_pos++] = p_dest; + WRITE_FIT(p_length); + memcpy(write_ptr + write_pos, p_src, p_length); + write_pos += p_length; } bool FileAccessCompressed::file_exists(const String &p_name) { diff --git a/core/io/file_access_compressed.h b/core/io/file_access_compressed.h index f706c82f8e6d..ea9837dd0394 100644 --- a/core/io/file_access_compressed.h +++ b/core/io/file_access_compressed.h @@ -83,14 +83,13 @@ class FileAccessCompressed : public FileAccess { virtual bool eof_reached() const override; ///< reading passed EOF - virtual uint8_t get_8() const override; ///< get a byte virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override; virtual Error get_error() const override; ///< get last error virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; } virtual void flush() override; - virtual void store_8(uint8_t p_dest) override; ///< store a byte + virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; virtual bool file_exists(const String &p_name) override; ///< return true if a file exists diff --git a/core/io/file_access_encrypted.cpp b/core/io/file_access_encrypted.cpp index b689f5b6284e..13d1e0c8fc31 100644 --- a/core/io/file_access_encrypted.cpp +++ b/core/io/file_access_encrypted.cpp @@ -37,7 +37,7 @@ #include Error FileAccessEncrypted::open_and_parse(Ref p_base, const Vector &p_key, Mode p_mode, bool p_with_magic) { - ERR_FAIL_COND_V_MSG(file != nullptr, ERR_ALREADY_IN_USE, "Can't open file while another file from path '" + file->get_path_absolute() + "' is open."); + ERR_FAIL_COND_V_MSG(file.is_valid(), ERR_ALREADY_IN_USE, "Can't open file while another file from path '" + file->get_path_absolute() + "' is open."); ERR_FAIL_COND_V(p_key.size() != 32, ERR_INVALID_PARAMETER); pos = 0; @@ -162,7 +162,7 @@ void FileAccessEncrypted::_close() { } bool FileAccessEncrypted::is_open() const { - return file != nullptr; + return file.is_valid(); } String FileAccessEncrypted::get_path() const { @@ -206,26 +206,13 @@ bool FileAccessEncrypted::eof_reached() const { return eofed; } -uint8_t FileAccessEncrypted::get_8() const { - ERR_FAIL_COND_V_MSG(writing, 0, "File has not been opened in read mode."); - if (pos >= get_length()) { - eofed = true; - return 0; - } - - uint8_t b = data[pos]; - pos++; - return b; -} - uint64_t FileAccessEncrypted::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); ERR_FAIL_COND_V_MSG(writing, -1, "File has not been opened in read mode."); uint64_t to_copy = MIN(p_length, get_length() - pos); - for (uint64_t i = 0; i < to_copy; i++) { - p_dst[i] = data[pos++]; - } + memcpy(p_dst, data.ptr() + pos, to_copy); + pos += to_copy; if (to_copy < p_length) { eofed = true; @@ -242,17 +229,12 @@ void FileAccessEncrypted::store_buffer(const uint8_t *p_src, uint64_t p_length) ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode."); ERR_FAIL_COND(!p_src && p_length > 0); - if (pos < get_length()) { - for (uint64_t i = 0; i < p_length; i++) { - store_8(p_src[i]); - } - } else if (pos == get_length()) { + if (pos + p_length >= get_length()) { data.resize(pos + p_length); - for (uint64_t i = 0; i < p_length; i++) { - data.write[pos + i] = p_src[i]; - } - pos += p_length; } + + memcpy(data.ptrw() + pos, p_src, p_length); + pos += p_length; } void FileAccessEncrypted::flush() { @@ -261,18 +243,6 @@ void FileAccessEncrypted::flush() { // encrypted files keep data in memory till close() } -void FileAccessEncrypted::store_8(uint8_t p_dest) { - ERR_FAIL_COND_MSG(!writing, "File has not been opened in write mode."); - - if (pos < get_length()) { - data.write[pos] = p_dest; - pos++; - } else if (pos == get_length()) { - data.push_back(p_dest); - pos++; - } -} - bool FileAccessEncrypted::file_exists(const String &p_name) { Ref fa = FileAccess::open(p_name, FileAccess::READ); if (fa.is_null()) { diff --git a/core/io/file_access_encrypted.h b/core/io/file_access_encrypted.h index 42afe49a5e7b..5f8c803d6022 100644 --- a/core/io/file_access_encrypted.h +++ b/core/io/file_access_encrypted.h @@ -73,14 +73,12 @@ class FileAccessEncrypted : public FileAccess { virtual bool eof_reached() const override; ///< reading passed EOF - virtual uint8_t get_8() const override; ///< get a byte virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override; virtual Error get_error() const override; ///< get last error virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; } virtual void flush() override; - virtual void store_8(uint8_t p_dest) override; ///< store a byte virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; ///< store an array of bytes virtual bool file_exists(const String &p_name) override; ///< return true if a file exists diff --git a/core/io/file_access_memory.cpp b/core/io/file_access_memory.cpp index 9521a4f666d1..1541a5ed4a4d 100644 --- a/core/io/file_access_memory.cpp +++ b/core/io/file_access_memory.cpp @@ -122,16 +122,6 @@ bool FileAccessMemory::eof_reached() const { return pos >= length; } -uint8_t FileAccessMemory::get_8() const { - uint8_t ret = 0; - if (pos < length) { - ret = data[pos]; - } - ++pos; - - return ret; -} - uint64_t FileAccessMemory::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); ERR_FAIL_NULL_V(data, -1); @@ -157,16 +147,12 @@ void FileAccessMemory::flush() { ERR_FAIL_NULL(data); } -void FileAccessMemory::store_8(uint8_t p_byte) { - ERR_FAIL_NULL(data); - ERR_FAIL_COND(pos >= length); - data[pos++] = p_byte; -} - void FileAccessMemory::store_buffer(const uint8_t *p_src, uint64_t p_length) { ERR_FAIL_COND(!p_src && p_length > 0); + uint64_t left = length - pos; uint64_t write = MIN(p_length, left); + if (write < p_length) { WARN_PRINT("Writing less data than requested"); } diff --git a/core/io/file_access_memory.h b/core/io/file_access_memory.h index e9fbc26d7515..39e1528d9782 100644 --- a/core/io/file_access_memory.h +++ b/core/io/file_access_memory.h @@ -55,15 +55,12 @@ class FileAccessMemory : public FileAccess { virtual bool eof_reached() const override; ///< reading passed EOF - virtual uint8_t get_8() const override; ///< get a byte - virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override; ///< get an array of bytes virtual Error get_error() const override; ///< get last error virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; } virtual void flush() override; - virtual void store_8(uint8_t p_byte) override; ///< store a byte virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; ///< store an array of bytes virtual bool file_exists(const String &p_name) override; ///< return true if a file exists diff --git a/core/io/file_access_pack.cpp b/core/io/file_access_pack.cpp index 991b94db38ed..eec27ce0aa7f 100644 --- a/core/io/file_access_pack.cpp +++ b/core/io/file_access_pack.cpp @@ -119,6 +119,10 @@ void PackedData::_free_packed_dirs(PackedDir *p_dir) { } PackedData::~PackedData() { + if (singleton == this) { + singleton = nullptr; + } + for (int i = 0; i < sources.size(); i++) { memdelete(sources[i]); } @@ -309,17 +313,6 @@ bool FileAccessPack::eof_reached() const { return eof; } -uint8_t FileAccessPack::get_8() const { - ERR_FAIL_COND_V_MSG(f.is_null(), 0, "File must be opened before use."); - if (pos >= pf.size) { - eof = true; - return 0; - } - - pos++; - return f->get_8(); -} - uint64_t FileAccessPack::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V_MSG(f.is_null(), -1, "File must be opened before use."); ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); @@ -362,10 +355,6 @@ void FileAccessPack::flush() { ERR_FAIL(); } -void FileAccessPack::store_8(uint8_t p_dest) { - ERR_FAIL(); -} - void FileAccessPack::store_buffer(const uint8_t *p_src, uint64_t p_length) { ERR_FAIL(); } diff --git a/core/io/file_access_pack.h b/core/io/file_access_pack.h index 594ac8f089b3..595a36bca4e8 100644 --- a/core/io/file_access_pack.h +++ b/core/io/file_access_pack.h @@ -169,8 +169,6 @@ class FileAccessPack : public FileAccess { virtual bool eof_reached() const override; - virtual uint8_t get_8() const override; - virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override; virtual void set_big_endian(bool p_big_endian) override; @@ -179,8 +177,6 @@ class FileAccessPack : public FileAccess { virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; } virtual void flush() override; - virtual void store_8(uint8_t p_dest) override; - virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; virtual bool file_exists(const String &p_name) override; diff --git a/core/io/file_access_zip.cpp b/core/io/file_access_zip.cpp index c0d1afc8e187..b33b7b35c31d 100644 --- a/core/io/file_access_zip.cpp +++ b/core/io/file_access_zip.cpp @@ -291,12 +291,6 @@ bool FileAccessZip::eof_reached() const { return at_eof; } -uint8_t FileAccessZip::get_8() const { - uint8_t ret = 0; - get_buffer(&ret, 1); - return ret; -} - uint64_t FileAccessZip::get_buffer(uint8_t *p_dst, uint64_t p_length) const { ERR_FAIL_COND_V(!p_dst && p_length > 0, -1); ERR_FAIL_NULL_V(zfile, -1); @@ -328,7 +322,7 @@ void FileAccessZip::flush() { ERR_FAIL(); } -void FileAccessZip::store_8(uint8_t p_dest) { +void FileAccessZip::store_buffer(const uint8_t *p_src, uint64_t p_length) { ERR_FAIL(); } diff --git a/core/io/file_access_zip.h b/core/io/file_access_zip.h index 88b63e93e2dc..1e11e050dfb9 100644 --- a/core/io/file_access_zip.h +++ b/core/io/file_access_zip.h @@ -95,14 +95,13 @@ class FileAccessZip : public FileAccess { virtual bool eof_reached() const override; ///< reading passed EOF - virtual uint8_t get_8() const override; ///< get a byte virtual uint64_t get_buffer(uint8_t *p_dst, uint64_t p_length) const override; virtual Error get_error() const override; ///< get last error virtual Error resize(int64_t p_length) override { return ERR_UNAVAILABLE; } virtual void flush() override; - virtual void store_8(uint8_t p_dest) override; ///< store a byte + virtual void store_buffer(const uint8_t *p_src, uint64_t p_length) override; virtual bool file_exists(const String &p_name) override; ///< return true if a file exists diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp index 833fd1adc381..fc91341bedda 100644 --- a/core/io/http_client.cpp +++ b/core/io/http_client.cpp @@ -42,9 +42,9 @@ const char *HTTPClient::_methods[METHOD_MAX] = { "PATCH" }; -HTTPClient *HTTPClient::create() { +HTTPClient *HTTPClient::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } diff --git a/core/io/http_client.h b/core/io/http_client.h index 9e018182e379..594529112213 100644 --- a/core/io/http_client.h +++ b/core/io/http_client.h @@ -158,12 +158,12 @@ class HTTPClient : public RefCounted { Error _request_raw(Method p_method, const String &p_url, const Vector &p_headers, const Vector &p_body); Error _request(Method p_method, const String &p_url, const Vector &p_headers, const String &p_body = String()); - static HTTPClient *(*_create)(); + static HTTPClient *(*_create)(bool p_notify_postinitialize); static void _bind_methods(); public: - static HTTPClient *create(); + static HTTPClient *create(bool p_notify_postinitialize = true); String query_string_from_dict(const Dictionary &p_dict); Error verify_headers(const Vector &p_headers); diff --git a/core/io/http_client_tcp.cpp b/core/io/http_client_tcp.cpp index 2f45238951be..70fcad543a1f 100644 --- a/core/io/http_client_tcp.cpp +++ b/core/io/http_client_tcp.cpp @@ -35,8 +35,8 @@ #include "core/io/stream_peer_tls.h" #include "core/version.h" -HTTPClient *HTTPClientTCP::_create_func() { - return memnew(HTTPClientTCP); +HTTPClient *HTTPClientTCP::_create_func(bool p_notify_postinitialize) { + return static_cast(ClassDB::creator(p_notify_postinitialize)); } Error HTTPClientTCP::connect_to_host(const String &p_host, int p_port, Ref p_options) { @@ -792,6 +792,6 @@ HTTPClientTCP::HTTPClientTCP() { request_buffer.instantiate(); } -HTTPClient *(*HTTPClient::_create)() = HTTPClientTCP::_create_func; +HTTPClient *(*HTTPClient::_create)(bool p_notify_postinitialize) = HTTPClientTCP::_create_func; #endif // WEB_ENABLED diff --git a/core/io/http_client_tcp.h b/core/io/http_client_tcp.h index 6060c975bcb8..dd6cc6b84f04 100644 --- a/core/io/http_client_tcp.h +++ b/core/io/http_client_tcp.h @@ -76,7 +76,7 @@ class HTTPClientTCP : public HTTPClient { Error _get_http_data(uint8_t *p_buffer, int p_bytes, int &r_received); public: - static HTTPClient *_create_func(); + static HTTPClient *_create_func(bool p_notify_postinitialize); Error request(Method p_method, const String &p_url, const Vector &p_headers, const uint8_t *p_body, int p_body_size) override; diff --git a/core/io/image.cpp b/core/io/image.cpp index d0598e4dc6c7..aa391b77dd43 100644 --- a/core/io/image.cpp +++ b/core/io/image.cpp @@ -30,6 +30,7 @@ #include "image.h" +#include "core/config/project_settings.h" #include "core/error/error_list.h" #include "core/error/error_macros.h" #include "core/io/image_loader.h" @@ -501,6 +502,38 @@ static void _convert(int p_width, int p_height, const uint8_t *p_src, uint8_t *p } } +template +static void _convert_fast(int p_width, int p_height, const T *p_src, T *p_dst) { + uint32_t dst_count = 0; + uint32_t src_count = 0; + + const int resolution = p_width * p_height; + + for (int i = 0; i < resolution; i++) { + memcpy(p_dst + dst_count, p_src + src_count, MIN(read_channels, write_channels) * sizeof(T)); + + if constexpr (write_channels > read_channels) { + const T def_value[4] = { def_zero, def_zero, def_zero, def_one }; + memcpy(p_dst + dst_count + read_channels, &def_value[read_channels], (write_channels - read_channels) * sizeof(T)); + } + + dst_count += write_channels; + src_count += read_channels; + } +} + +static bool _are_formats_compatible(Image::Format p_format0, Image::Format p_format1) { + if (p_format0 <= Image::FORMAT_RGBA8 && p_format1 <= Image::FORMAT_RGBA8) { + return true; + } else if (p_format0 <= Image::FORMAT_RGBAH && p_format0 >= Image::FORMAT_RH && p_format1 <= Image::FORMAT_RGBAH && p_format1 >= Image::FORMAT_RH) { + return true; + } else if (p_format0 <= Image::FORMAT_RGBAF && p_format0 >= Image::FORMAT_RF && p_format1 <= Image::FORMAT_RGBAF && p_format1 >= Image::FORMAT_RF) { + return true; + } + + return false; +} + void Image::convert(Format p_new_format) { ERR_FAIL_INDEX_MSG(p_new_format, FORMAT_MAX, "The Image format specified (" + itos(p_new_format) + ") is out of range. See Image's Format enum."); if (data.size() == 0) { @@ -517,7 +550,7 @@ void Image::convert(Format p_new_format) { if (Image::is_format_compressed(format) || Image::is_format_compressed(p_new_format)) { ERR_FAIL_MSG("Cannot convert to <-> from compressed formats. Use compress() and decompress() instead."); - } else if (format > FORMAT_RGBA8 || p_new_format > FORMAT_RGBA8) { + } else if (!_are_formats_compatible(format, p_new_format)) { //use put/set pixel which is slower but works with non byte formats Image new_img(width, height, mipmaps, p_new_format); @@ -648,6 +681,78 @@ void Image::convert(Format p_new_format) { case FORMAT_RGBA8 | (FORMAT_RGB8 << 8): _convert<3, true, 3, false, false, false>(mip_width, mip_height, rptr, wptr); break; + case FORMAT_RH | (FORMAT_RGH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RH | (FORMAT_RGBH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RH | (FORMAT_RGBAH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGH | (FORMAT_RH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGH | (FORMAT_RGBH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGH | (FORMAT_RGBAH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBH | (FORMAT_RH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBH | (FORMAT_RGH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBH | (FORMAT_RGBAH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBAH | (FORMAT_RH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBAH | (FORMAT_RGH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RGBAH | (FORMAT_RGBH << 8): + _convert_fast(mip_width, mip_height, (const uint16_t *)rptr, (uint16_t *)wptr); + break; + case FORMAT_RF | (FORMAT_RGF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RF | (FORMAT_RGBF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RF | (FORMAT_RGBAF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGF | (FORMAT_RF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGF | (FORMAT_RGBF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGF | (FORMAT_RGBAF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBF | (FORMAT_RF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBF | (FORMAT_RGF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBF | (FORMAT_RGBAF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBAF | (FORMAT_RF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBAF | (FORMAT_RGF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; + case FORMAT_RGBAF | (FORMAT_RGBF << 8): + _convert_fast(mip_width, mip_height, (const uint32_t *)rptr, (uint32_t *)wptr); + break; } } @@ -761,12 +866,10 @@ static void _scale_cubic(const uint8_t *__restrict p_src, uint8_t *__restrict p_ template static void _scale_bilinear(const uint8_t *__restrict p_src, uint8_t *__restrict p_dst, uint32_t p_src_width, uint32_t p_src_height, uint32_t p_dst_width, uint32_t p_dst_height) { - enum { - FRAC_BITS = 8, - FRAC_LEN = (1 << FRAC_BITS), - FRAC_HALF = (FRAC_LEN >> 1), - FRAC_MASK = FRAC_LEN - 1 - }; + constexpr uint32_t FRAC_BITS = 8; + constexpr uint32_t FRAC_LEN = (1 << FRAC_BITS); + constexpr uint32_t FRAC_HALF = (FRAC_LEN >> 1); + constexpr uint32_t FRAC_MASK = FRAC_LEN - 1; for (uint32_t i = 0; i < p_dst_height; i++) { // Add 0.5 in order to interpolate based on pixel center @@ -2630,6 +2733,40 @@ Error Image::compress(CompressMode p_mode, CompressSource p_source, ASTCFormat p Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels, ASTCFormat p_astc_format) { ERR_FAIL_COND_V(data.is_empty(), ERR_INVALID_DATA); + // RenderingDevice only. + if (GLOBAL_GET("rendering/textures/vram_compression/compress_with_gpu")) { + switch (p_mode) { + case COMPRESS_BPTC: { + // BC7 is unsupported currently. + if ((format >= FORMAT_RF && format <= FORMAT_RGBE9995) && _image_compress_bptc_rd_func) { + Error result = _image_compress_bptc_rd_func(this, p_channels); + + // If the image was compressed successfully, we return here. If not, we fall back to the default compression scheme. + if (result == OK) { + return OK; + } + } + + } break; + + case COMPRESS_S3TC: { + // BC3 is unsupported currently. + if ((p_channels == USED_CHANNELS_RGB || p_channels == USED_CHANNELS_L) && _image_compress_bc_rd_func) { + Error result = _image_compress_bc_rd_func(this, p_channels); + + // If the image was compressed successfully, we return here. If not, we fall back to the default compression scheme. + if (result == OK) { + return OK; + } + } + + } break; + + default: { + } + } + } + switch (p_mode) { case COMPRESS_S3TC: { ERR_FAIL_NULL_V(_image_compress_bc_func, ERR_UNAVAILABLE); @@ -3011,6 +3148,8 @@ void (*Image::_image_compress_bptc_func)(Image *, Image::UsedChannels) = nullptr void (*Image::_image_compress_etc1_func)(Image *) = nullptr; void (*Image::_image_compress_etc2_func)(Image *, Image::UsedChannels) = nullptr; void (*Image::_image_compress_astc_func)(Image *, Image::ASTCFormat) = nullptr; +Error (*Image::_image_compress_bptc_rd_func)(Image *, Image::UsedChannels) = nullptr; +Error (*Image::_image_compress_bc_rd_func)(Image *, Image::UsedChannels) = nullptr; void (*Image::_image_decompress_bc)(Image *) = nullptr; void (*Image::_image_decompress_bptc)(Image *) = nullptr; void (*Image::_image_decompress_etc1)(Image *) = nullptr; @@ -3460,6 +3599,7 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("fix_alpha_edges"), &Image::fix_alpha_edges); ClassDB::bind_method(D_METHOD("premultiply_alpha"), &Image::premultiply_alpha); ClassDB::bind_method(D_METHOD("srgb_to_linear"), &Image::srgb_to_linear); + ClassDB::bind_method(D_METHOD("linear_to_srgb"), &Image::linear_to_srgb); ClassDB::bind_method(D_METHOD("normal_map_to_xy"), &Image::normal_map_to_xy); ClassDB::bind_method(D_METHOD("rgbe_to_srgb"), &Image::rgbe_to_srgb); ClassDB::bind_method(D_METHOD("bump_map_to_normal_map", "bump_scale"), &Image::bump_map_to_normal_map, DEFVAL(1.0)); @@ -3696,6 +3836,33 @@ void Image::bump_map_to_normal_map(float bump_scale) { data = result_image; } +bool Image::detect_signed(bool p_include_mips) const { + ERR_FAIL_COND_V(is_compressed(), false); + + if (format >= Image::FORMAT_RH && format <= Image::FORMAT_RGBAH) { + const uint16_t *img_data = reinterpret_cast(data.ptr()); + const uint64_t img_size = p_include_mips ? (data.size() / 2) : (width * height * get_format_pixel_size(format) / 2); + + for (uint64_t i = 0; i < img_size; i++) { + if ((img_data[i] & 0x8000) != 0 && (img_data[i] & 0x7fff) != 0) { + return true; + } + } + + } else if (format >= Image::FORMAT_RF && format <= Image::FORMAT_RGBAF) { + const uint32_t *img_data = reinterpret_cast(data.ptr()); + const uint64_t img_size = p_include_mips ? (data.size() / 4) : (width * height * get_format_pixel_size(format) / 4); + + for (uint64_t i = 0; i < img_size; i++) { + if ((img_data[i] & 0x80000000) != 0 && (img_data[i] & 0x7fffffff) != 0) { + return true; + } + } + } + + return false; +} + void Image::srgb_to_linear() { if (data.size() == 0) { return; @@ -3727,6 +3894,37 @@ void Image::srgb_to_linear() { } } +void Image::linear_to_srgb() { + if (data.size() == 0) { + return; + } + + static const uint8_t lin2srgb[256] = { 0, 12, 21, 28, 33, 38, 42, 46, 49, 52, 55, 58, 61, 63, 66, 68, 70, 73, 75, 77, 79, 81, 82, 84, 86, 88, 89, 91, 93, 94, 96, 97, 99, 100, 102, 103, 104, 106, 107, 109, 110, 111, 112, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 191, 192, 193, 193, 194, 194, 195, 196, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 202, 203, 204, 204, 205, 205, 206, 206, 207, 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224, 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; + + ERR_FAIL_COND(format != FORMAT_RGB8 && format != FORMAT_RGBA8); + + if (format == FORMAT_RGBA8) { + int len = data.size() / 4; + uint8_t *data_ptr = data.ptrw(); + + for (int i = 0; i < len; i++) { + data_ptr[(i << 2) + 0] = lin2srgb[data_ptr[(i << 2) + 0]]; + data_ptr[(i << 2) + 1] = lin2srgb[data_ptr[(i << 2) + 1]]; + data_ptr[(i << 2) + 2] = lin2srgb[data_ptr[(i << 2) + 2]]; + } + + } else if (format == FORMAT_RGB8) { + int len = data.size() / 3; + uint8_t *data_ptr = data.ptrw(); + + for (int i = 0; i < len; i++) { + data_ptr[(i * 3) + 0] = lin2srgb[data_ptr[(i * 3) + 0]]; + data_ptr[(i * 3) + 1] = lin2srgb[data_ptr[(i * 3) + 1]]; + data_ptr[(i * 3) + 2] = lin2srgb[data_ptr[(i * 3) + 2]]; + } + } +} + void Image::premultiply_alpha() { if (data.size() == 0) { return; @@ -4039,7 +4237,7 @@ Dictionary Image::compute_image_metrics(const Ref p_compared_image, bool result["root_mean_squared"] = INFINITY; result["peak_snr"] = 0.0f; - ERR_FAIL_NULL_V(p_compared_image, result); + ERR_FAIL_COND_V(p_compared_image.is_null(), result); Error err = OK; Ref compared_image = duplicate(true); if (compared_image->is_compressed()) { diff --git a/core/io/image.h b/core/io/image.h index d55cc39dbb57..78757246e06a 100644 --- a/core/io/image.h +++ b/core/io/image.h @@ -159,6 +159,9 @@ class Image : public Resource { static void (*_image_compress_etc2_func)(Image *, UsedChannels p_channels); static void (*_image_compress_astc_func)(Image *, ASTCFormat p_format); + static Error (*_image_compress_bptc_rd_func)(Image *, UsedChannels p_channels); + static Error (*_image_compress_bc_rd_func)(Image *, UsedChannels p_channels); + static void (*_image_decompress_bc)(Image *); static void (*_image_decompress_bptc)(Image *); static void (*_image_decompress_etc1)(Image *); @@ -383,11 +386,14 @@ class Image : public Resource { void fix_alpha_edges(); void premultiply_alpha(); void srgb_to_linear(); + void linear_to_srgb(); void normal_map_to_xy(); Ref rgbe_to_srgb(); Ref get_image_from_mipmap(int p_mipmap) const; void bump_map_to_normal_map(float bump_scale = 1.0); + bool detect_signed(bool p_include_mips = true) const; + void blit_rect(const Ref &p_src, const Rect2i &p_src_rect, const Point2i &p_dest); void blit_rect_mask(const Ref &p_src, const Ref &p_mask, const Rect2i &p_src_rect, const Point2i &p_dest); void blend_rect(const Ref &p_src, const Rect2i &p_src_rect, const Point2i &p_dest); diff --git a/core/io/ip.cpp b/core/io/ip.cpp index f20d65bef901..38c71b19fa31 100644 --- a/core/io/ip.cpp +++ b/core/io/ip.cpp @@ -81,17 +81,17 @@ struct _IP_ResolverPrivate { continue; } - mutex.lock(); + MutexLock lock(mutex); List response; String hostname = queue[i].hostname; IP::Type type = queue[i].type; - mutex.unlock(); + lock.temp_unlock(); // We should not lock while resolving the hostname, // only when modifying the queue. IP::get_singleton()->_resolve_hostname(response, hostname, type); - MutexLock lock(mutex); + lock.temp_relock(); // Could have been completed by another function, or deleted. if (queue[i].status.get() != IP::RESOLVER_STATUS_WAITING) { continue; @@ -131,21 +131,22 @@ PackedStringArray IP::resolve_hostname_addresses(const String &p_hostname, Type List res; String key = _IP_ResolverPrivate::get_cache_key(p_hostname, p_type); - resolver->mutex.lock(); - if (resolver->cache.has(key)) { - res = resolver->cache[key]; - } else { - // This should be run unlocked so the resolver thread can keep resolving - // other requests. - resolver->mutex.unlock(); - _resolve_hostname(res, p_hostname, p_type); - resolver->mutex.lock(); - // We might be overriding another result, but we don't care as long as the result is valid. - if (res.size()) { - resolver->cache[key] = res; + { + MutexLock lock(resolver->mutex); + if (resolver->cache.has(key)) { + res = resolver->cache[key]; + } else { + // This should be run unlocked so the resolver thread can keep resolving + // other requests. + lock.temp_unlock(); + _resolve_hostname(res, p_hostname, p_type); + lock.temp_relock(); + // We might be overriding another result, but we don't care as long as the result is valid. + if (res.size()) { + resolver->cache[key] = res; + } } } - resolver->mutex.unlock(); PackedStringArray result; for (const IPAddress &E : res) { diff --git a/core/io/json.cpp b/core/io/json.cpp index 61051727c181..664ff7857b6b 100644 --- a/core/io/json.cpp +++ b/core/io/json.cpp @@ -588,10 +588,756 @@ void JSON::_bind_methods() { ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line); ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message); + ClassDB::bind_static_method("JSON", D_METHOD("to_native", "json", "allow_classes", "allow_scripts"), &JSON::to_native, DEFVAL(false), DEFVAL(false)); + ClassDB::bind_static_method("JSON", D_METHOD("from_native", "variant", "allow_classes", "allow_scripts"), &JSON::from_native, DEFVAL(false), DEFVAL(false)); + ADD_PROPERTY(PropertyInfo(Variant::NIL, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT), "set_data", "get_data"); // Ensures that it can be serialized as binary. } -//// +#define GDTYPE "__gdtype" +#define VALUES "values" +#define PASS_ARG p_allow_classes, p_allow_scripts + +Variant JSON::from_native(const Variant &p_variant, bool p_allow_classes, bool p_allow_scripts) { + switch (p_variant.get_type()) { + case Variant::NIL: { + Dictionary nil; + nil[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return nil; + } break; + case Variant::BOOL: { + return p_variant; + } break; + case Variant::INT: { + return p_variant; + } break; + case Variant::FLOAT: { + return p_variant; + } break; + case Variant::STRING: { + return p_variant; + } break; + case Variant::VECTOR2: { + Dictionary d; + Vector2 v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::VECTOR2I: { + Dictionary d; + Vector2i v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::RECT2: { + Dictionary d; + Rect2 r = p_variant; + d["position"] = from_native(r.position); + d["size"] = from_native(r.size); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::RECT2I: { + Dictionary d; + Rect2i r = p_variant; + d["position"] = from_native(r.position); + d["size"] = from_native(r.size); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::VECTOR3: { + Dictionary d; + Vector3 v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::VECTOR3I: { + Dictionary d; + Vector3i v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::TRANSFORM2D: { + Dictionary d; + Transform2D t = p_variant; + d["x"] = from_native(t[0]); + d["y"] = from_native(t[1]); + d["origin"] = from_native(t[2]); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::VECTOR4: { + Dictionary d; + Vector4 v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + values.push_back(v.w); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::VECTOR4I: { + Dictionary d; + Vector4i v = p_variant; + Array values; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + values.push_back(v.w); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PLANE: { + Dictionary d; + Plane p = p_variant; + d["normal"] = from_native(p.normal); + d["d"] = p.d; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::QUATERNION: { + Dictionary d; + Quaternion q = p_variant; + Array values; + values.push_back(q.x); + values.push_back(q.y); + values.push_back(q.z); + values.push_back(q.w); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::AABB: { + Dictionary d; + AABB aabb = p_variant; + d["position"] = from_native(aabb.position); + d["size"] = from_native(aabb.size); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::BASIS: { + Dictionary d; + Basis t = p_variant; + d["x"] = from_native(t.get_column(0)); + d["y"] = from_native(t.get_column(1)); + d["z"] = from_native(t.get_column(2)); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::TRANSFORM3D: { + Dictionary d; + Transform3D t = p_variant; + d["basis"] = from_native(t.basis); + d["origin"] = from_native(t.origin); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PROJECTION: { + Dictionary d; + Projection t = p_variant; + d["x"] = from_native(t[0]); + d["y"] = from_native(t[1]); + d["z"] = from_native(t[2]); + d["w"] = from_native(t[3]); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::COLOR: { + Dictionary d; + Color c = p_variant; + Array values; + values.push_back(c.r); + values.push_back(c.g); + values.push_back(c.b); + values.push_back(c.a); + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::STRING_NAME: { + Dictionary d; + d["name"] = String(p_variant); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::NODE_PATH: { + Dictionary d; + d["path"] = String(p_variant); + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::RID: { + Dictionary d; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::OBJECT: { + Object *obj = p_variant.get_validated_object(); + + if (p_allow_classes && obj) { + Dictionary d; + List property_list; + obj->get_property_list(&property_list); + + d["type"] = obj->get_class(); + Dictionary p; + for (const PropertyInfo &P : property_list) { + if (P.usage & PROPERTY_USAGE_STORAGE) { + if (P.name == "script" && !p_allow_scripts) { + continue; + } + p[P.name] = from_native(obj->get(P.name), PASS_ARG); + } + } + d["properties"] = p; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } else { + Dictionary nil; + nil[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return nil; + } + } break; + case Variant::CALLABLE: + case Variant::SIGNAL: { + Dictionary nil; + nil[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return nil; + } break; + case Variant::DICTIONARY: { + Dictionary d = p_variant; + List keys; + d.get_key_list(&keys); + bool all_strings = true; + for (const Variant &K : keys) { + if (K.get_type() != Variant::STRING) { + all_strings = false; + break; + } + } + + if (all_strings) { + Dictionary ret_dict; + for (const Variant &K : keys) { + ret_dict[K] = from_native(d[K], PASS_ARG); + } + return ret_dict; + } else { + Dictionary ret; + Array pairs; + for (const Variant &K : keys) { + Dictionary pair; + pair["key"] = from_native(K, PASS_ARG); + pair["value"] = from_native(d[K], PASS_ARG); + pairs.push_back(pair); + } + ret["pairs"] = pairs; + ret[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return ret; + } + } break; + case Variant::ARRAY: { + Array arr = p_variant; + Array ret; + for (int i = 0; i < arr.size(); i++) { + ret.push_back(from_native(arr[i], PASS_ARG)); + } + return ret; + } break; + case Variant::PACKED_BYTE_ARRAY: { + Dictionary d; + PackedByteArray arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_INT32_ARRAY: { + Dictionary d; + PackedInt32Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + + } break; + case Variant::PACKED_INT64_ARRAY: { + Dictionary d; + PackedInt64Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_FLOAT32_ARRAY: { + Dictionary d; + PackedFloat32Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_FLOAT64_ARRAY: { + Dictionary d; + PackedFloat64Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_STRING_ARRAY: { + Dictionary d; + PackedStringArray arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + values.push_back(arr[i]); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_VECTOR2_ARRAY: { + Dictionary d; + PackedVector2Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + Vector2 v = arr[i]; + values.push_back(v.x); + values.push_back(v.y); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_VECTOR3_ARRAY: { + Dictionary d; + PackedVector3Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + Vector3 v = arr[i]; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_COLOR_ARRAY: { + Dictionary d; + PackedColorArray arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + Color v = arr[i]; + values.push_back(v.r); + values.push_back(v.g); + values.push_back(v.b); + values.push_back(v.a); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + case Variant::PACKED_VECTOR4_ARRAY: { + Dictionary d; + PackedVector4Array arr = p_variant; + Array values; + for (int i = 0; i < arr.size(); i++) { + Vector4 v = arr[i]; + values.push_back(v.x); + values.push_back(v.y); + values.push_back(v.z); + values.push_back(v.w); + } + d[VALUES] = values; + d[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return d; + } break; + default: { + ERR_PRINT(vformat("Unhandled conversion from native Variant type '%s' to JSON.", Variant::get_type_name(p_variant.get_type()))); + } break; + } + + Dictionary nil; + nil[GDTYPE] = Variant::get_type_name(p_variant.get_type()); + return nil; +} + +Variant JSON::to_native(const Variant &p_json, bool p_allow_classes, bool p_allow_scripts) { + switch (p_json.get_type()) { + case Variant::BOOL: { + return p_json; + } break; + case Variant::INT: { + return p_json; + } break; + case Variant::FLOAT: { + return p_json; + } break; + case Variant::STRING: { + return p_json; + } break; + case Variant::STRING_NAME: { + return p_json; + } break; + case Variant::CALLABLE: { + return p_json; + } break; + case Variant::DICTIONARY: { + Dictionary d = p_json; + if (d.has(GDTYPE)) { + // Specific Godot Variant types serialized to JSON. + String type = d[GDTYPE]; + if (type == Variant::get_type_name(Variant::VECTOR2)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 2, Variant()); + Vector2 v; + v.x = values[0]; + v.y = values[1]; + return v; + } else if (type == Variant::get_type_name(Variant::VECTOR2I)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 2, Variant()); + Vector2i v; + v.x = values[0]; + v.y = values[1]; + return v; + } else if (type == Variant::get_type_name(Variant::RECT2)) { + ERR_FAIL_COND_V(!d.has("position"), Variant()); + ERR_FAIL_COND_V(!d.has("size"), Variant()); + Rect2 r; + r.position = to_native(d["position"]); + r.size = to_native(d["size"]); + return r; + } else if (type == Variant::get_type_name(Variant::RECT2I)) { + ERR_FAIL_COND_V(!d.has("position"), Variant()); + ERR_FAIL_COND_V(!d.has("size"), Variant()); + Rect2i r; + r.position = to_native(d["position"]); + r.size = to_native(d["size"]); + return r; + } else if (type == Variant::get_type_name(Variant::VECTOR3)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 3, Variant()); + Vector3 v; + v.x = values[0]; + v.y = values[1]; + v.z = values[2]; + return v; + } else if (type == Variant::get_type_name(Variant::VECTOR3I)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 3, Variant()); + Vector3i v; + v.x = values[0]; + v.y = values[1]; + v.z = values[2]; + return v; + } else if (type == Variant::get_type_name(Variant::TRANSFORM2D)) { + ERR_FAIL_COND_V(!d.has("x"), Variant()); + ERR_FAIL_COND_V(!d.has("y"), Variant()); + ERR_FAIL_COND_V(!d.has("origin"), Variant()); + Transform2D t; + t[0] = to_native(d["x"]); + t[1] = to_native(d["y"]); + t[2] = to_native(d["origin"]); + return t; + } else if (type == Variant::get_type_name(Variant::VECTOR4)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 4, Variant()); + Vector4 v; + v.x = values[0]; + v.y = values[1]; + v.z = values[2]; + v.w = values[3]; + return v; + } else if (type == Variant::get_type_name(Variant::VECTOR4I)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 4, Variant()); + Vector4i v; + v.x = values[0]; + v.y = values[1]; + v.z = values[2]; + v.w = values[3]; + return v; + } else if (type == Variant::get_type_name(Variant::PLANE)) { + ERR_FAIL_COND_V(!d.has("normal"), Variant()); + ERR_FAIL_COND_V(!d.has("d"), Variant()); + Plane p; + p.normal = to_native(d["normal"]); + p.d = d["d"]; + return p; + } else if (type == Variant::get_type_name(Variant::QUATERNION)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 4, Variant()); + Quaternion v; + v.x = values[0]; + v.y = values[1]; + v.z = values[2]; + v.w = values[3]; + return v; + } else if (type == Variant::get_type_name(Variant::AABB)) { + ERR_FAIL_COND_V(!d.has("position"), Variant()); + ERR_FAIL_COND_V(!d.has("size"), Variant()); + AABB r; + r.position = to_native(d["position"]); + r.size = to_native(d["size"]); + return r; + } else if (type == Variant::get_type_name(Variant::BASIS)) { + ERR_FAIL_COND_V(!d.has("x"), Variant()); + ERR_FAIL_COND_V(!d.has("y"), Variant()); + ERR_FAIL_COND_V(!d.has("z"), Variant()); + Basis b; + b.set_column(0, to_native(d["x"])); + b.set_column(1, to_native(d["y"])); + b.set_column(2, to_native(d["z"])); + return b; + } else if (type == Variant::get_type_name(Variant::TRANSFORM3D)) { + ERR_FAIL_COND_V(!d.has("basis"), Variant()); + ERR_FAIL_COND_V(!d.has("origin"), Variant()); + Transform3D t; + t.basis = to_native(d["basis"]); + t.origin = to_native(d["origin"]); + return t; + } else if (type == Variant::get_type_name(Variant::PROJECTION)) { + ERR_FAIL_COND_V(!d.has("x"), Variant()); + ERR_FAIL_COND_V(!d.has("y"), Variant()); + ERR_FAIL_COND_V(!d.has("z"), Variant()); + ERR_FAIL_COND_V(!d.has("w"), Variant()); + Projection p; + p[0] = to_native(d["x"]); + p[1] = to_native(d["y"]); + p[2] = to_native(d["z"]); + p[3] = to_native(d["w"]); + return p; + } else if (type == Variant::get_type_name(Variant::COLOR)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() != 4, Variant()); + Color c; + c.r = values[0]; + c.g = values[1]; + c.b = values[2]; + c.a = values[3]; + return c; + } else if (type == Variant::get_type_name(Variant::NODE_PATH)) { + ERR_FAIL_COND_V(!d.has("path"), Variant()); + NodePath np = d["path"]; + return np; + } else if (type == Variant::get_type_name(Variant::STRING_NAME)) { + ERR_FAIL_COND_V(!d.has("name"), Variant()); + StringName s = d["name"]; + return s; + } else if (type == Variant::get_type_name(Variant::OBJECT)) { + ERR_FAIL_COND_V(!d.has("type"), Variant()); + ERR_FAIL_COND_V(!d.has("properties"), Variant()); + + ERR_FAIL_COND_V(!p_allow_classes, Variant()); + + String obj_type = d["type"]; + bool is_script = obj_type == "Script" || ClassDB::is_parent_class(obj_type, "Script"); + ERR_FAIL_COND_V(!p_allow_scripts && is_script, Variant()); + Object *obj = ClassDB::instantiate(obj_type); + ERR_FAIL_NULL_V(obj, Variant()); + + Dictionary p = d["properties"]; + + List keys; + p.get_key_list(&keys); + + for (const Variant &K : keys) { + String property = K; + Variant value = to_native(p[K], PASS_ARG); + obj->set(property, value); + } + + Variant v(obj); + + return v; + } else if (type == Variant::get_type_name(Variant::DICTIONARY)) { + ERR_FAIL_COND_V(!d.has("pairs"), Variant()); + Array pairs = d["pairs"]; + Dictionary r; + for (int i = 0; i < pairs.size(); i++) { + Dictionary p = pairs[i]; + ERR_CONTINUE(!p.has("key")); + ERR_CONTINUE(!p.has("value")); + r[to_native(p["key"], PASS_ARG)] = to_native(p["value"]); + } + return r; + } else if (type == Variant::get_type_name(Variant::ARRAY)) { + ERR_PRINT(vformat("Unexpected Array with '%s' key. Arrays are supported natively.", GDTYPE)); + } else if (type == Variant::get_type_name(Variant::PACKED_BYTE_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedByteArray pbarr; + pbarr.resize(values.size()); + for (int i = 0; i < pbarr.size(); i++) { + pbarr.write[i] = values[i]; + } + return pbarr; + } else if (type == Variant::get_type_name(Variant::PACKED_INT32_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedInt32Array arr; + arr.resize(values.size()); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = values[i]; + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_INT64_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedInt64Array arr; + arr.resize(values.size()); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = values[i]; + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_FLOAT32_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedFloat32Array arr; + arr.resize(values.size()); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = values[i]; + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_FLOAT64_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedFloat64Array arr; + arr.resize(values.size()); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = values[i]; + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_STRING_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + PackedStringArray arr; + arr.resize(values.size()); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = values[i]; + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_VECTOR2_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() % 2 != 0, Variant()); + PackedVector2Array arr; + arr.resize(values.size() / 2); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = Vector2(values[i * 2 + 0], values[i * 2 + 1]); + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_VECTOR3_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() % 3 != 0, Variant()); + PackedVector3Array arr; + arr.resize(values.size() / 3); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = Vector3(values[i * 3 + 0], values[i * 3 + 1], values[i * 3 + 2]); + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_COLOR_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() % 4 != 0, Variant()); + PackedColorArray arr; + arr.resize(values.size() / 4); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = Color(values[i * 4 + 0], values[i * 4 + 1], values[i * 4 + 2], values[i * 4 + 3]); + } + return arr; + } else if (type == Variant::get_type_name(Variant::PACKED_VECTOR4_ARRAY)) { + ERR_FAIL_COND_V(!d.has(VALUES), Variant()); + Array values = d[VALUES]; + ERR_FAIL_COND_V(values.size() % 4 != 0, Variant()); + PackedVector4Array arr; + arr.resize(values.size() / 4); + for (int i = 0; i < arr.size(); i++) { + arr.write[i] = Vector4(values[i * 4 + 0], values[i * 4 + 1], values[i * 4 + 2], values[i * 4 + 3]); + } + return arr; + } else { + return Variant(); + } + } else { + // Regular dictionary with string keys. + List keys; + d.get_key_list(&keys); + Dictionary r; + for (const Variant &K : keys) { + r[K] = to_native(d[K], PASS_ARG); + } + return r; + } + } break; + case Variant::ARRAY: { + Array arr = p_json; + Array ret; + ret.resize(arr.size()); + for (int i = 0; i < arr.size(); i++) { + ret[i] = to_native(arr[i], PASS_ARG); + } + return ret; + } break; + default: { + ERR_PRINT(vformat("Unhandled conversion from JSON type '%s' to native Variant type.", Variant::get_type_name(p_json.get_type()))); + return Variant(); + } + } + + return Variant(); +} + +#undef GDTYPE +#undef VALUES +#undef PASS_ARG //////////// diff --git a/core/io/json.h b/core/io/json.h index 801fa29b4bbe..67b5e09afa0e 100644 --- a/core/io/json.h +++ b/core/io/json.h @@ -94,6 +94,9 @@ class JSON : public Resource { void set_data(const Variant &p_data); inline int get_error_line() const { return err_line; } inline String get_error_message() const { return err_str; } + + static Variant from_native(const Variant &p_variant, bool p_allow_classes = false, bool p_allow_scripts = false); + static Variant to_native(const Variant &p_json, bool p_allow_classes = false, bool p_allow_scripts = false); }; class ResourceFormatLoaderJSON : public ResourceFormatLoader { diff --git a/core/io/logger.cpp b/core/io/logger.cpp index a24277fe7247..26b60f6738e9 100644 --- a/core/io/logger.cpp +++ b/core/io/logger.cpp @@ -84,11 +84,7 @@ void Logger::log_error(const char *p_function, const char *p_file, int p_line, c err_details = p_code; } - if (p_editor_notify) { - logf_error("%s: %s\n", err_type, err_details); - } else { - logf_error("USER %s: %s\n", err_type, err_details); - } + logf_error("%s: %s\n", err_type, err_details); logf_error(" at: %s (%s:%i)\n", p_function, p_file, p_line); } diff --git a/core/io/packed_data_container.h b/core/io/packed_data_container.h index cc9996101e2a..f4ffa090223a 100644 --- a/core/io/packed_data_container.h +++ b/core/io/packed_data_container.h @@ -36,7 +36,7 @@ class PackedDataContainer : public Resource { GDCLASS(PackedDataContainer, Resource); - enum { + enum : uint32_t { TYPE_DICT = 0xFFFFFFFF, TYPE_ARRAY = 0xFFFFFFFE, }; diff --git a/core/io/packet_peer_dtls.cpp b/core/io/packet_peer_dtls.cpp index 18bef3ff3cca..231c48d88765 100644 --- a/core/io/packet_peer_dtls.cpp +++ b/core/io/packet_peer_dtls.cpp @@ -32,12 +32,12 @@ #include "core/config/project_settings.h" #include "core/io/file_access.h" -PacketPeerDTLS *(*PacketPeerDTLS::_create)() = nullptr; +PacketPeerDTLS *(*PacketPeerDTLS::_create)(bool p_notify_postinitialize) = nullptr; bool PacketPeerDTLS::available = false; -PacketPeerDTLS *PacketPeerDTLS::create() { +PacketPeerDTLS *PacketPeerDTLS::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } diff --git a/core/io/packet_peer_dtls.h b/core/io/packet_peer_dtls.h index 3990a851f744..03d97a59036c 100644 --- a/core/io/packet_peer_dtls.h +++ b/core/io/packet_peer_dtls.h @@ -38,7 +38,7 @@ class PacketPeerDTLS : public PacketPeer { GDCLASS(PacketPeerDTLS, PacketPeer); protected: - static PacketPeerDTLS *(*_create)(); + static PacketPeerDTLS *(*_create)(bool p_notify_postinitialize); static void _bind_methods(); static bool available; @@ -57,7 +57,7 @@ class PacketPeerDTLS : public PacketPeer { virtual void disconnect_from_peer() = 0; virtual Status get_status() const = 0; - static PacketPeerDTLS *create(); + static PacketPeerDTLS *create(bool p_notify_postinitialize = true); static bool is_available(); PacketPeerDTLS() {} diff --git a/core/io/plist.cpp b/core/io/plist.cpp index 86737609bf56..8d91e6dec294 100644 --- a/core/io/plist.cpp +++ b/core/io/plist.cpp @@ -814,7 +814,7 @@ bool PList::load_string(const String &p_string, String &r_err_out) { } PackedByteArray PList::save_asn1() const { - if (root == nullptr) { + if (root.is_null()) { ERR_FAIL_V_MSG(PackedByteArray(), "PList: Invalid PList, no root node."); } size_t size = root->get_asn1_size(1); @@ -848,7 +848,7 @@ PackedByteArray PList::save_asn1() const { } String PList::save_text() const { - if (root == nullptr) { + if (root.is_null()) { ERR_FAIL_V_MSG(String(), "PList: Invalid PList, no root node."); } diff --git a/core/io/resource.cpp b/core/io/resource.cpp index 432adb88da9f..6177cba6a40c 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -40,12 +40,12 @@ #include void Resource::emit_changed() { - if (ResourceLoader::is_within_load() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) { - // Let the connection happen on the call queue, later, since signals are not thread-safe. - call_deferred("emit_signal", CoreStringName(changed)); - } else { - emit_signal(CoreStringName(changed)); + if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) { + ResourceLoader::resource_changed_emit(this); + return; } + + emit_signal(CoreStringName(changed)); } void Resource::_resource_path_changed() { @@ -60,32 +60,32 @@ void Resource::set_path(const String &p_path, bool p_take_over) { p_take_over = false; // Can't take over an empty path } - ResourceCache::lock.lock(); + { + MutexLock lock(ResourceCache::lock); - if (!path_cache.is_empty()) { - ResourceCache::resources.erase(path_cache); - } + if (!path_cache.is_empty()) { + ResourceCache::resources.erase(path_cache); + } - path_cache = ""; + path_cache = ""; - Ref existing = ResourceCache::get_ref(p_path); + Ref existing = ResourceCache::get_ref(p_path); - if (existing.is_valid()) { - if (p_take_over) { - existing->path_cache = String(); - ResourceCache::resources.erase(p_path); - } else { - ResourceCache::lock.unlock(); - ERR_FAIL_MSG("Another resource is loaded from path '" + p_path + "' (possible cyclic resource inclusion)."); + if (existing.is_valid()) { + if (p_take_over) { + existing->path_cache = String(); + ResourceCache::resources.erase(p_path); + } else { + ERR_FAIL_MSG("Another resource is loaded from path '" + p_path + "' (possible cyclic resource inclusion)."); + } } - } - path_cache = p_path; + path_cache = p_path; - if (!path_cache.is_empty()) { - ResourceCache::resources[path_cache] = this; + if (!path_cache.is_empty()) { + ResourceCache::resources[path_cache] = this; + } } - ResourceCache::lock.unlock(); _resource_path_changed(); } @@ -166,22 +166,22 @@ bool Resource::editor_can_reload_from_file() { } void Resource::connect_changed(const Callable &p_callable, uint32_t p_flags) { - if (ResourceLoader::is_within_load() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) { - // Let the check and connection happen on the call queue, later, since signals are not thread-safe. - callable_mp(this, &Resource::connect_changed).call_deferred(p_callable, p_flags); + if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) { + ResourceLoader::resource_changed_connect(this, p_callable, p_flags); return; } + if (!is_connected(CoreStringName(changed), p_callable) || p_flags & CONNECT_REFERENCE_COUNTED) { connect(CoreStringName(changed), p_callable, p_flags); } } void Resource::disconnect_changed(const Callable &p_callable) { - if (ResourceLoader::is_within_load() && MessageQueue::get_main_singleton() != MessageQueue::get_singleton() && !MessageQueue::get_singleton()->is_flushing()) { - // Let the check and disconnection happen on the call queue, later, since signals are not thread-safe. - callable_mp(this, &Resource::disconnect_changed).call_deferred(p_callable); + if (ResourceLoader::is_within_load() && !Thread::is_main_thread()) { + ResourceLoader::resource_changed_disconnect(this, p_callable); return; } + if (is_connected(CoreStringName(changed), p_callable)) { disconnect(CoreStringName(changed), p_callable); } @@ -416,21 +416,15 @@ void Resource::_take_over_path(const String &p_path) { } RID Resource::get_rid() const { - if (get_script_instance()) { - Callable::CallError ce; - RID ret = get_script_instance()->callp(SNAME("_get_rid"), nullptr, 0, ce); - if (ce.error == Callable::CallError::CALL_OK && ret.is_valid()) { - return ret; - } - } - if (_get_extension() && _get_extension()->get_rid) { - RID ret = RID::from_uint64(_get_extension()->get_rid(_get_extension_instance())); - if (ret.is_valid()) { - return ret; + RID ret; + if (!GDVIRTUAL_CALL(_get_rid, ret)) { +#ifndef DISABLE_DEPRECATED + if (_get_extension() && _get_extension()->get_rid) { + ret = RID::from_uint64(_get_extension()->get_rid(_get_extension_instance())); } +#endif } - - return RID(); + return ret; } #ifdef TOOLS_ENABLED @@ -492,15 +486,13 @@ void Resource::set_as_translation_remapped(bool p_remapped) { return; } - ResourceCache::lock.lock(); + MutexLock lock(ResourceCache::lock); if (p_remapped) { ResourceLoader::remapped_list.add(&remapped_list); } else { ResourceLoader::remapped_list.remove(&remapped_list); } - - ResourceCache::lock.unlock(); } #ifdef TOOLS_ENABLED @@ -558,11 +550,8 @@ void Resource::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "resource_name"), "set_name", "get_name"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "resource_scene_unique_id", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_scene_unique_id", "get_scene_unique_id"); - MethodInfo get_rid_bind("_get_rid"); - get_rid_bind.return_val.type = Variant::RID; - - ::ClassDB::add_virtual_method(get_class_static(), get_rid_bind, true, Vector(), true); GDVIRTUAL_BIND(_setup_local_to_scene); + GDVIRTUAL_BIND(_get_rid); } Resource::Resource() : @@ -573,14 +562,13 @@ Resource::~Resource() { return; } - ResourceCache::lock.lock(); + MutexLock lock(ResourceCache::lock); // Only unregister from the cache if this is the actual resource listed there. // (Other resources can have the same value in `path_cache` if loaded with `CACHE_IGNORE`.) HashMap::Iterator E = ResourceCache::resources.find(path_cache); if (likely(E && E->value == this)) { ResourceCache::resources.remove(E); } - ResourceCache::lock.unlock(); } HashMap ResourceCache::resources; @@ -609,18 +597,20 @@ void ResourceCache::clear() { } bool ResourceCache::has(const String &p_path) { - lock.lock(); + Resource **res = nullptr; - Resource **res = resources.getptr(p_path); + { + MutexLock mutex_lock(lock); - if (res && (*res)->get_reference_count() == 0) { - // This resource is in the process of being deleted, ignore its existence. - (*res)->path_cache = String(); - resources.erase(p_path); - res = nullptr; - } + res = resources.getptr(p_path); - lock.unlock(); + if (res && (*res)->get_reference_count() == 0) { + // This resource is in the process of being deleted, ignore its existence. + (*res)->path_cache = String(); + resources.erase(p_path); + res = nullptr; + } + } if (!res) { return false; @@ -631,28 +621,27 @@ bool ResourceCache::has(const String &p_path) { Ref ResourceCache::get_ref(const String &p_path) { Ref ref; - lock.lock(); - - Resource **res = resources.getptr(p_path); + { + MutexLock mutex_lock(lock); + Resource **res = resources.getptr(p_path); - if (res) { - ref = Ref(*res); - } + if (res) { + ref = Ref(*res); + } - if (res && !ref.is_valid()) { - // This resource is in the process of being deleted, ignore its existence - (*res)->path_cache = String(); - resources.erase(p_path); - res = nullptr; + if (res && !ref.is_valid()) { + // This resource is in the process of being deleted, ignore its existence + (*res)->path_cache = String(); + resources.erase(p_path); + res = nullptr; + } } - lock.unlock(); - return ref; } void ResourceCache::get_cached_resources(List> *p_resources) { - lock.lock(); + MutexLock mutex_lock(lock); LocalVector to_remove; @@ -672,14 +661,9 @@ void ResourceCache::get_cached_resources(List> *p_resources) { for (const String &E : to_remove) { resources.erase(E); } - - lock.unlock(); } int ResourceCache::get_cached_resource_count() { - lock.lock(); - int rc = resources.size(); - lock.unlock(); - - return rc; + MutexLock mutex_lock(lock); + return resources.size(); } diff --git a/core/io/resource.h b/core/io/resource.h index cc8a0d4387d8..2c1a4312553b 100644 --- a/core/io/resource.h +++ b/core/io/resource.h @@ -87,6 +87,8 @@ class Resource : public RefCounted { virtual void reset_local_to_scene(); GDVIRTUAL0(_setup_local_to_scene); + GDVIRTUAL0RC(RID, _get_rid); + public: static Node *(*_get_local_scene_func)(); //used by editor static void (*_update_configuration_warning)(); //used by editor diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp index f71257fa7644..b4826c356e01 100644 --- a/core/io/resource_format_binary.cpp +++ b/core/io/resource_format_binary.cpp @@ -845,14 +845,29 @@ Error ResourceLoaderBinary::load() { } } - if (value.get_type() == Variant::ARRAY) { - Array set_array = value; - bool is_get_valid = false; - Variant get_value = res->get(name, &is_get_valid); - if (is_get_valid && get_value.get_type() == Variant::ARRAY) { - Array get_array = get_value; - if (!set_array.is_same_typed(get_array)) { - value = Array(set_array, get_array.get_typed_builtin(), get_array.get_typed_class_name(), get_array.get_typed_script()); + if (ClassDB::has_property(res->get_class_name(), name)) { + if (value.get_type() == Variant::ARRAY) { + Array set_array = value; + bool is_get_valid = false; + Variant get_value = res->get(name, &is_get_valid); + if (is_get_valid && get_value.get_type() == Variant::ARRAY) { + Array get_array = get_value; + if (!set_array.is_same_typed(get_array)) { + value = Array(set_array, get_array.get_typed_builtin(), get_array.get_typed_class_name(), get_array.get_typed_script()); + } + } + } + + if (value.get_type() == Variant::DICTIONARY) { + Dictionary set_dict = value; + bool is_get_valid = false; + Variant get_value = res->get(name, &is_get_valid); + if (is_get_valid && get_value.get_type() == Variant::DICTIONARY) { + Dictionary get_dict = get_value; + if (!set_dict.is_same_typed(get_dict)) { + value = Dictionary(set_dict, get_dict.get_typed_key_builtin(), get_dict.get_typed_key_class_name(), get_dict.get_typed_key_script(), + get_dict.get_typed_value_builtin(), get_dict.get_typed_value_class_name(), get_dict.get_typed_value_script()); + } } } } @@ -2064,6 +2079,8 @@ void ResourceFormatSaverBinaryInstance::_find_resources(const Variant &p_variant case Variant::DICTIONARY: { Dictionary d = p_variant; + _find_resources(d.get_typed_key_script()); + _find_resources(d.get_typed_value_script()); List keys; d.get_key_list(&keys); for (const Variant &E : keys) { diff --git a/core/io/resource_importer.cpp b/core/io/resource_importer.cpp index 9e6f3ba31427..a572dd562e70 100644 --- a/core/io/resource_importer.cpp +++ b/core/io/resource_importer.cpp @@ -35,6 +35,8 @@ #include "core/os/os.h" #include "core/variant/variant_parser.h" +ResourceFormatImporterLoadOnStartup ResourceImporter::load_on_startup = nullptr; + bool ResourceFormatImporter::SortImporterByName::operator()(const Ref &p_a, const Ref &p_b) const { return p_a->get_importer_name() < p_b->get_importer_name(); } @@ -137,6 +139,20 @@ Error ResourceFormatImporter::_get_path_and_type(const String &p_path, PathAndTy } Ref ResourceFormatImporter::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) { +#ifdef TOOLS_ENABLED + // When loading a resource on startup, we use the load_on_startup callback, + // which executes the loading in the EditorFileSystem. It can reimport + // the resource and retry the load, allowing the resource to be loaded + // even if it is not yet imported. + if (ResourceImporter::load_on_startup != nullptr) { + return ResourceImporter::load_on_startup(this, p_path, r_error, p_use_sub_threads, r_progress, p_cache_mode); + } +#endif + + return load_internal(p_path, r_error, p_use_sub_threads, r_progress, p_cache_mode, false); +} + +Ref ResourceFormatImporter::load_internal(const String &p_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode, bool p_silence_errors) { PathAndType pat; Error err = _get_path_and_type(p_path, pat); @@ -148,6 +164,13 @@ Ref ResourceFormatImporter::load(const String &p_path, const String &p return Ref(); } + if (p_silence_errors) { + // Note: Some importers do not create files in the .godot folder, so we need to check if the path is empty. + if (!pat.path.is_empty() && !FileAccess::exists(pat.path)) { + return Ref(); + } + } + Ref res = ResourceLoader::_load(pat.path, p_path, pat.type, p_cache_mode, r_error, p_use_sub_threads, r_progress); #ifdef TOOLS_ENABLED @@ -364,6 +387,23 @@ ResourceUID::ID ResourceFormatImporter::get_resource_uid(const String &p_path) c return pat.uid; } +Error ResourceFormatImporter::get_resource_import_info(const String &p_path, StringName &r_type, ResourceUID::ID &r_uid, String &r_import_group_file) const { + PathAndType pat; + Error err = _get_path_and_type(p_path, pat); + + if (err == OK) { + r_type = pat.type; + r_uid = pat.uid; + r_import_group_file = pat.group_file; + } else { + r_type = ""; + r_uid = ResourceUID::INVALID_ID; + r_import_group_file = ""; + } + + return err; +} + Variant ResourceFormatImporter::get_resource_metadata(const String &p_path) const { PathAndType pat; Error err = _get_path_and_type(p_path, pat); diff --git a/core/io/resource_importer.h b/core/io/resource_importer.h index dbd9e70d16be..6ea5d0972ab7 100644 --- a/core/io/resource_importer.h +++ b/core/io/resource_importer.h @@ -35,6 +35,9 @@ #include "core/io/resource_saver.h" class ResourceImporter; +class ResourceFormatImporter; + +typedef Ref (*ResourceFormatImporterLoadOnStartup)(ResourceFormatImporter *p_importer, const String &p_path, Error *r_error, bool p_use_sub_threads, float *r_progress, ResourceFormatLoader::CacheMode p_cache_mode); class ResourceFormatImporter : public ResourceFormatLoader { struct PathAndType { @@ -60,6 +63,7 @@ class ResourceFormatImporter : public ResourceFormatLoader { public: static ResourceFormatImporter *get_singleton() { return singleton; } virtual Ref load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE) override; + Ref load_internal(const String &p_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode, bool p_silence_errors); virtual void get_recognized_extensions(List *p_extensions) const override; virtual void get_recognized_extensions_for_type(const String &p_type, List *p_extensions) const override; virtual bool recognize_path(const String &p_path, const String &p_for_type = String()) const override; @@ -93,6 +97,8 @@ class ResourceFormatImporter : public ResourceFormatLoader { String get_import_settings_hash() const; String get_import_base_path(const String &p_for_file) const; + Error get_resource_import_info(const String &p_path, StringName &r_type, ResourceUID::ID &r_uid, String &r_import_group_file) const; + ResourceFormatImporter(); }; @@ -103,6 +109,8 @@ class ResourceImporter : public RefCounted { static void _bind_methods(); public: + static ResourceFormatImporterLoadOnStartup load_on_startup; + virtual String get_importer_name() const = 0; virtual String get_visible_name() const = 0; virtual void get_recognized_extensions(List *p_extensions) const = 0; diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index 2b5e83264e4f..f026d5416caf 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -31,6 +31,7 @@ #include "resource_loader.h" #include "core/config/project_settings.h" +#include "core/core_bind.h" #include "core/io/file_access.h" #include "core/io/resource_importer.h" #include "core/object/script_language.h" @@ -38,7 +39,7 @@ #include "core/os/os.h" #include "core/os/safe_binary_mutex.h" #include "core/string/print_string.h" -#include "core/string/translation.h" +#include "core/string/translation_server.h" #include "core/variant/variant_parser.h" #include "servers/rendering_server.h" @@ -207,34 +208,57 @@ void ResourceFormatLoader::_bind_methods() { /////////////////////////////////// +// These are used before and after a wait for a WorkerThreadPool task +// because that can lead to another load started in the same thread, +// something we must treat as a different stack for the purposes +// of tracking nesting. + +#define PREPARE_FOR_WTP_WAIT \ + int load_nesting_backup = ResourceLoader::load_nesting; \ + Vector load_paths_stack_backup = ResourceLoader::load_paths_stack; \ + ResourceLoader::load_nesting = 0; \ + ResourceLoader::load_paths_stack.clear(); + +#define RESTORE_AFTER_WTP_WAIT \ + DEV_ASSERT(ResourceLoader::load_nesting == 0); \ + DEV_ASSERT(ResourceLoader::load_paths_stack.is_empty()); \ + ResourceLoader::load_nesting = load_nesting_backup; \ + ResourceLoader::load_paths_stack = load_paths_stack_backup; \ + load_paths_stack_backup.clear(); + // This should be robust enough to be called redundantly without issues. void ResourceLoader::LoadToken::clear() { - thread_load_mutex.lock(); - WorkerThreadPool::TaskID task_to_await = 0; - if (!local_path.is_empty()) { // Empty is used for the special case where the load task is not registered. - DEV_ASSERT(thread_load_tasks.has(local_path)); - ThreadLoadTask &load_task = thread_load_tasks[local_path]; - if (!load_task.awaited) { - task_to_await = load_task.task_id; - load_task.awaited = true; - } - thread_load_tasks.erase(local_path); - local_path.clear(); - } + { + MutexLock thread_load_lock(thread_load_mutex); + // User-facing tokens shouldn't be deleted until completely claimed. + DEV_ASSERT(user_rc == 0 && user_path.is_empty()); - if (!user_path.is_empty()) { - DEV_ASSERT(user_load_tokens.has(user_path)); - user_load_tokens.erase(user_path); - user_path.clear(); + if (!local_path.is_empty()) { + if (task_if_unregistered) { + memdelete(task_if_unregistered); + task_if_unregistered = nullptr; + } else { + DEV_ASSERT(thread_load_tasks.has(local_path)); + ThreadLoadTask &load_task = thread_load_tasks[local_path]; + if (load_task.task_id && !load_task.awaited) { + task_to_await = load_task.task_id; + } + // Removing a task which is still in progress would be catastrophic. + // Tokens must be alive until the task thread function is done. + DEV_ASSERT(load_task.status == THREAD_LOAD_FAILED || load_task.status == THREAD_LOAD_LOADED); + thread_load_tasks.erase(local_path); + } + local_path.clear(); // Mark as already cleared. + } } - thread_load_mutex.unlock(); - // If task is unused, await it here, locally, now the token data is consistent. if (task_to_await) { + PREPARE_FOR_WTP_WAIT WorkerThreadPool::get_singleton()->wait_for_task_completion(task_to_await); + RESTORE_AFTER_WTP_WAIT } } @@ -245,18 +269,17 @@ ResourceLoader::LoadToken::~LoadToken() { Ref ResourceLoader::_load(const String &p_path, const String &p_original_path, const String &p_type_hint, ResourceFormatLoader::CacheMode p_cache_mode, Error *r_error, bool p_use_sub_threads, float *r_progress) { const String &original_path = p_original_path.is_empty() ? p_path : p_original_path; load_nesting++; - if (load_paths_stack->size()) { - thread_load_mutex.lock(); - const String &parent_task_path = load_paths_stack->get(load_paths_stack->size() - 1); + if (load_paths_stack.size()) { + MutexLock thread_load_lock(thread_load_mutex); + const String &parent_task_path = load_paths_stack.get(load_paths_stack.size() - 1); HashMap::Iterator E = thread_load_tasks.find(parent_task_path); // Avoid double-tracking, for progress reporting, resources that boil down to a remapped path containing the real payload (e.g., imported resources). bool is_remapped_load = original_path == parent_task_path; if (E && !is_remapped_load) { E->value.sub_tasks.insert(p_original_path); } - thread_load_mutex.unlock(); } - load_paths_stack->push_back(original_path); + load_paths_stack.push_back(original_path); // Try all loaders and pick the first match for the type hint bool found = false; @@ -272,7 +295,7 @@ Ref ResourceLoader::_load(const String &p_path, const String &p_origin } } - load_paths_stack->resize(load_paths_stack->size() - 1); + load_paths_stack.resize(load_paths_stack.size() - 1); res_ref_overrides.erase(load_nesting); load_nesting--; @@ -291,23 +314,26 @@ Ref ResourceLoader::_load(const String &p_path, const String &p_origin ERR_FAIL_V_MSG(Ref(), vformat("No loader found for resource: %s (expected type: %s)", p_path, p_type_hint)); } -void ResourceLoader::_thread_load_function(void *p_userdata) { +// This implementation must allow re-entrancy for a task that started awaiting in a deeper stack frame. +// The load task token must be manually re-referenced before this is called, which includes threaded runs. +void ResourceLoader::_run_load_task(void *p_userdata) { ThreadLoadTask &load_task = *(ThreadLoadTask *)p_userdata; - thread_load_mutex.lock(); - caller_task_id = load_task.task_id; - if (cleaning_tasks) { - load_task.status = THREAD_LOAD_FAILED; - thread_load_mutex.unlock(); - return; + { + MutexLock thread_load_lock(thread_load_mutex); + if (cleaning_tasks) { + load_task.status = THREAD_LOAD_FAILED; + return; + } } - thread_load_mutex.unlock(); + + ThreadLoadTask *curr_load_task_backup = curr_load_task; + curr_load_task = &load_task; // Thread-safe either if it's the current thread or a brand new one. CallQueue *own_mq_override = nullptr; if (load_nesting == 0) { - load_paths_stack = memnew(Vector); - + DEV_ASSERT(load_paths_stack.is_empty()); if (!Thread::is_main_thread()) { // Let the caller thread use its own, for added flexibility. Provide one otherwise. if (MessageQueue::get_singleton() == MessageQueue::get_main_singleton()) { @@ -319,12 +345,21 @@ void ResourceLoader::_thread_load_function(void *p_userdata) { } // -- + bool xl_remapped = false; + const String &remapped_path = _path_remap(load_task.local_path, &xl_remapped); + + print_verbose("Loading resource: " + remapped_path); + Error load_err = OK; - Ref res = _load(load_task.remapped_path, load_task.remapped_path != load_task.local_path ? load_task.local_path : String(), load_task.type_hint, load_task.cache_mode, &load_err, load_task.use_sub_threads, &load_task.progress); + Ref res = _load(remapped_path, remapped_path != load_task.local_path ? load_task.local_path : String(), load_task.type_hint, load_task.cache_mode, &load_err, load_task.use_sub_threads, &load_task.progress); if (MessageQueue::get_singleton() != MessageQueue::get_main_singleton()) { MessageQueue::get_singleton()->flush(); } + if (res.is_null()) { + print_verbose("Failed loading resource: " + remapped_path); + } + thread_load_mutex.lock(); load_task.resource = res; @@ -337,11 +372,10 @@ void ResourceLoader::_thread_load_function(void *p_userdata) { load_task.status = THREAD_LOAD_LOADED; } - if (load_task.cond_var) { + if (load_task.cond_var && load_task.need_wait) { load_task.cond_var->notify_all(); - memdelete(load_task.cond_var); - load_task.cond_var = nullptr; } + load_task.need_wait = false; bool ignoring = load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE || load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE_DEEP; bool replacing = load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE || load_task.cache_mode == ResourceFormatLoader::CACHE_MODE_REPLACE_DEEP; @@ -354,27 +388,40 @@ void ResourceLoader::_thread_load_function(void *p_userdata) { unlock_pending = false; if (!ignoring) { - if (replacing) { - Ref old_res = ResourceCache::get_ref(load_task.local_path); - if (old_res.is_valid() && old_res != load_task.resource) { - // If resource is already loaded, only replace its data, to avoid existing invalidating instances. - old_res->copy_from(load_task.resource); + ResourceCache::lock.lock(); // Check and operations must happen atomically. + bool pending_unlock = true; + Ref old_res = ResourceCache::get_ref(load_task.local_path); + if (old_res.is_valid()) { + if (old_res != load_task.resource) { + // Resource can already exists at this point for two reasons: + // a) The load uses replace mode. + // b) There were more than one load in flight for the same path because of deadlock prevention. + // Either case, we want to keep the resource that was already there. + ResourceCache::lock.unlock(); + pending_unlock = false; + if (replacing) { + old_res->copy_from(load_task.resource); + } load_task.resource = old_res; } + } else { + load_task.resource->set_path(load_task.local_path); + } + if (pending_unlock) { + ResourceCache::lock.unlock(); } - load_task.resource->set_path(load_task.local_path, replacing); } else { load_task.resource->set_path_cache(load_task.local_path); } - if (load_task.xl_remapped) { + if (xl_remapped) { load_task.resource->set_as_translation_remapped(true); } #ifdef TOOLS_ENABLED load_task.resource->set_edited(false); if (timestamp_on_load) { - uint64_t mt = FileAccess::get_modified_time(load_task.remapped_path); + uint64_t mt = FileAccess::get_modified_time(remapped_path); //printf("mt %s: %lli\n",remapped_path.utf8().get_data(),mt); load_task.resource->set_last_modified_time(mt); } @@ -399,6 +446,9 @@ void ResourceLoader::_thread_load_function(void *p_userdata) { } } + // It's safe now to let the task go in case no one else was grabbing the token. + load_task.load_token->unreference(); + if (unlock_pending) { thread_load_mutex.unlock(); } @@ -408,8 +458,10 @@ void ResourceLoader::_thread_load_function(void *p_userdata) { MessageQueue::set_thread_singleton_override(nullptr); memdelete(own_mq_override); } - memdelete(load_paths_stack); + DEV_ASSERT(load_paths_stack.is_empty()); } + + curr_load_task = curr_load_task_backup; } static String _validate_local_path(const String &p_path) { @@ -424,36 +476,44 @@ static String _validate_local_path(const String &p_path) { } Error ResourceLoader::load_threaded_request(const String &p_path, const String &p_type_hint, bool p_use_sub_threads, ResourceFormatLoader::CacheMode p_cache_mode) { - thread_load_mutex.lock(); - if (user_load_tokens.has(p_path)) { + Ref token = _load_start(p_path, p_type_hint, p_use_sub_threads ? LOAD_THREAD_DISTRIBUTE : LOAD_THREAD_SPAWN_SINGLE, p_cache_mode, true); + return token.is_valid() ? OK : FAILED; +} + +ResourceLoader::LoadToken *ResourceLoader::_load_threaded_request_reuse_user_token(const String &p_path) { + HashMap::Iterator E = user_load_tokens.find(p_path); + if (E) { print_verbose("load_threaded_request(): Another threaded load for resource path '" + p_path + "' has been initiated. Not an error."); - user_load_tokens[p_path]->reference(); // Additional request. - thread_load_mutex.unlock(); - return OK; - } - user_load_tokens[p_path] = nullptr; - thread_load_mutex.unlock(); - - Ref token = _load_start(p_path, p_type_hint, p_use_sub_threads ? LOAD_THREAD_DISTRIBUTE : LOAD_THREAD_SPAWN_SINGLE, p_cache_mode); - if (token.is_valid()) { - thread_load_mutex.lock(); - token->user_path = p_path; - token->reference(); // First request. - user_load_tokens[p_path] = token.ptr(); - print_lt("REQUEST: user load tokens: " + itos(user_load_tokens.size())); - thread_load_mutex.unlock(); - return OK; + LoadToken *token = E->value; + token->user_rc++; + return token; } else { - return FAILED; + return nullptr; } } +void ResourceLoader::_load_threaded_request_setup_user_token(LoadToken *p_token, const String &p_path) { + p_token->user_path = p_path; + p_token->reference(); // Extra RC until all user requests have been gotten. + p_token->user_rc = 1; + user_load_tokens[p_path] = p_token; + print_lt("REQUEST: user load tokens: " + itos(user_load_tokens.size())); +} + Ref ResourceLoader::load(const String &p_path, const String &p_type_hint, ResourceFormatLoader::CacheMode p_cache_mode, Error *r_error) { if (r_error) { *r_error = OK; } - Ref load_token = _load_start(p_path, p_type_hint, LOAD_THREAD_FROM_CURRENT, p_cache_mode); + LoadThreadMode thread_mode = LOAD_THREAD_FROM_CURRENT; + if (WorkerThreadPool::get_singleton()->get_caller_task_id() != WorkerThreadPool::INVALID_TASK_ID) { + // If user is initiating a single-threaded load from a WorkerThreadPool task, + // we instead spawn a new task so there's a precondition that a load in a pool task + // is always initiated by the engine. That makes certain aspects simpler, such as + // cyclic load detection and awaiting. + thread_mode = LOAD_THREAD_SPAWN_SINGLE; + } + Ref load_token = _load_start(p_path, p_type_hint, thread_mode, p_cache_mode); if (!load_token.is_valid()) { if (r_error) { *r_error = FAILED; @@ -465,21 +525,32 @@ Ref ResourceLoader::load(const String &p_path, const String &p_type_hi return res; } -Ref ResourceLoader::_load_start(const String &p_path, const String &p_type_hint, LoadThreadMode p_thread_mode, ResourceFormatLoader::CacheMode p_cache_mode) { +Ref ResourceLoader::_load_start(const String &p_path, const String &p_type_hint, LoadThreadMode p_thread_mode, ResourceFormatLoader::CacheMode p_cache_mode, bool p_for_user) { String local_path = _validate_local_path(p_path); bool ignoring_cache = p_cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE || p_cache_mode == ResourceFormatLoader::CACHE_MODE_IGNORE_DEEP; Ref load_token; - ThreadLoadTask unregistered_load_task; // Once set, must be valid up to the call to do the load. + bool must_not_register = false; ThreadLoadTask *load_task_ptr = nullptr; - bool run_on_current_thread = false; { MutexLock thread_load_lock(thread_load_mutex); + if (p_for_user) { + LoadToken *existing_token = _load_threaded_request_reuse_user_token(p_path); + if (existing_token) { + return Ref(existing_token); + } + } + if (!ignoring_cache && thread_load_tasks.has(local_path)) { load_token = Ref(thread_load_tasks[local_path].load_token); if (load_token.is_valid()) { + if (p_for_user) { + // Load task exists, with no user tokens at the moment. + // Let's "attach" to it. + _load_threaded_request_setup_user_token(load_token.ptr(), p_path); + } return load_token; } else { // The token is dying (reached 0 on another thread). @@ -490,12 +561,14 @@ Ref ResourceLoader::_load_start(const String &p_path, load_token.instantiate(); load_token->local_path = local_path; + if (p_for_user) { + _load_threaded_request_setup_user_token(load_token.ptr(), p_path); + } //create load task { ThreadLoadTask load_task; - load_task.remapped_path = _path_remap(local_path, &load_task.xl_remapped); load_task.load_token = load_token.ptr(); load_task.local_path = local_path; load_task.type_hint = p_type_hint; @@ -508,16 +581,17 @@ Ref ResourceLoader::_load_start(const String &p_path, load_task.resource = existing; load_task.status = THREAD_LOAD_LOADED; load_task.progress = 1.0; + DEV_ASSERT(!thread_load_tasks.has(local_path)); thread_load_tasks[local_path] = load_task; return load_token; } } - // Cache-ignoring tasks aren't registered in the map and so must finish within scope. - if (ignoring_cache) { - load_token->local_path.clear(); - unregistered_load_task = load_task; - load_task_ptr = &unregistered_load_task; + // If we want to ignore cache, but there's another task loading it, we can't add this one to the map. + must_not_register = ignoring_cache && thread_load_tasks.has(local_path); + if (must_not_register) { + load_token->task_if_unregistered = memnew(ThreadLoadTask(load_task)); + load_task_ptr = load_token->task_if_unregistered; } else { DEV_ASSERT(!thread_load_tasks.has(local_path)); HashMap::Iterator E = thread_load_tasks.insert(local_path, load_task); @@ -525,20 +599,26 @@ Ref ResourceLoader::_load_start(const String &p_path, } } - run_on_current_thread = ignoring_cache || p_thread_mode == LOAD_THREAD_FROM_CURRENT; + // It's important to keep the token alive because until the load completes, + // which includes before the thread start, it may happen that no one is grabbing + // the token anymore so it's released. + load_task_ptr->load_token->reference(); - if (run_on_current_thread) { - load_task_ptr->thread_id = Thread::get_caller_id(); + if (p_thread_mode == LOAD_THREAD_FROM_CURRENT) { + // The current thread may happen to be a thread from the pool. + WorkerThreadPool::TaskID tid = WorkerThreadPool::get_singleton()->get_caller_task_id(); + if (tid != WorkerThreadPool::INVALID_TASK_ID) { + load_task_ptr->task_id = tid; + } else { + load_task_ptr->thread_id = Thread::get_caller_id(); + } } else { - load_task_ptr->task_id = WorkerThreadPool::get_singleton()->add_native_task(&ResourceLoader::_thread_load_function, load_task_ptr); + load_task_ptr->task_id = WorkerThreadPool::get_singleton()->add_native_task(&ResourceLoader::_run_load_task, load_task_ptr); } - } + } // MutexLock(thread_load_mutex). - if (run_on_current_thread) { - _thread_load_function(load_task_ptr); - if (ignoring_cache) { - load_token->res_if_unregistered = load_task_ptr->resource; - } + if (p_thread_mode == LOAD_THREAD_FROM_CURRENT) { + _run_load_task(load_task_ptr); } return load_token; @@ -578,13 +658,7 @@ ResourceLoader::ThreadLoadStatus ResourceLoader::load_threaded_get_status(const } String local_path = _validate_local_path(p_path); - if (!thread_load_tasks.has(local_path)) { -#ifdef DEV_ENABLED - CRASH_NOW(); -#endif - // On non-dev, be defensive and at least avoid crashing (at this point at least). - return THREAD_LOAD_INVALID_RESOURCE; - } + ERR_FAIL_COND_V_MSG(!thread_load_tasks.has(local_path), THREAD_LOAD_INVALID_RESOURCE, "Bug in ResourceLoader logic, please report."); ThreadLoadTask &load_task = thread_load_tasks[local_path]; status = load_task.status; @@ -628,22 +702,16 @@ Ref ResourceLoader::load_threaded_get(const String &p_path, Error *r_e } LoadToken *load_token = user_load_tokens[p_path]; - if (!load_token) { - // This happens if requested from one thread and rapidly querying from another. - if (r_error) { - *r_error = ERR_BUSY; - } - return Ref(); - } + DEV_ASSERT(load_token->user_rc >= 1); // Support userland requesting on the main thread before the load is reported to be complete. if (Thread::is_main_thread() && !load_token->local_path.is_empty()) { const ThreadLoadTask &load_task = thread_load_tasks[load_token->local_path]; while (load_task.status == THREAD_LOAD_IN_PROGRESS) { - thread_load_lock.~MutexLock(); + thread_load_lock.temp_unlock(); bool exit = !_ensure_load_progress(); OS::get_singleton()->delay_usec(1000); - new (&thread_load_lock) MutexLock(thread_load_mutex); + thread_load_lock.temp_relock(); if (exit) { break; } @@ -651,8 +719,15 @@ Ref ResourceLoader::load_threaded_get(const String &p_path, Error *r_e } res = _load_complete_inner(*load_token, r_error, thread_load_lock); - if (load_token->unreference()) { - memdelete(load_token); + + load_token->user_rc--; + if (load_token->user_rc == 0) { + load_token->user_path.clear(); + user_load_tokens.erase(p_path); + if (load_token->unreference()) { + memdelete(load_token); + load_token = nullptr; + } } } @@ -671,16 +746,15 @@ Ref ResourceLoader::_load_complete_inner(LoadToken &p_load_token, Erro *r_error = OK; } - if (!p_load_token.local_path.is_empty()) { + ThreadLoadTask *load_task_ptr = nullptr; + if (p_load_token.task_if_unregistered) { + load_task_ptr = p_load_token.task_if_unregistered; + } else { if (!thread_load_tasks.has(p_load_token.local_path)) { -#ifdef DEV_ENABLED - CRASH_NOW(); -#endif - // On non-dev, be defensive and at least avoid crashing (at this point at least). if (r_error) { *r_error = ERR_BUG; } - return Ref(); + ERR_FAIL_V_MSG(Ref(), "Bug in ResourceLoader logic, please report."); } ThreadLoadTask &load_task = thread_load_tasks[p_load_token.local_path]; @@ -688,7 +762,7 @@ Ref ResourceLoader::_load_complete_inner(LoadToken &p_load_token, Erro if (load_task.status == THREAD_LOAD_IN_PROGRESS) { DEV_ASSERT((load_task.task_id == 0) != (load_task.thread_id == 0)); - if ((load_task.task_id != 0 && load_task.task_id == caller_task_id) || + if ((load_task.task_id != 0 && load_task.task_id == WorkerThreadPool::get_singleton()->get_caller_task_id()) || (load_task.thread_id != 0 && load_task.thread_id == Thread::get_caller_id())) { // Load is in progress, but it's precisely this thread the one in charge. // That means this is a cyclic load. @@ -699,49 +773,46 @@ Ref ResourceLoader::_load_complete_inner(LoadToken &p_load_token, Erro } bool loader_is_wtp = load_task.task_id != 0; - Error wtp_task_err = FAILED; if (loader_is_wtp) { // Loading thread is in the worker pool. + p_thread_load_lock.temp_unlock(); + + PREPARE_FOR_WTP_WAIT + Error wait_err = WorkerThreadPool::get_singleton()->wait_for_task_completion(load_task.task_id); + RESTORE_AFTER_WTP_WAIT + + DEV_ASSERT(!wait_err || wait_err == ERR_BUSY); + if (wait_err == ERR_BUSY) { + // The WorkerThreadPool has reported that the current task wants to await on an older one. + // That't not allowed for safety, to avoid deadlocks. Fortunately, though, in the context of + // resource loading that means that the task to wait for can be restarted here to break the + // cycle, with as much recursion into this process as needed. + // When the stack is eventually unrolled, the original load will have been notified to go on. + load_task.load_token->reference(); + _run_load_task(&load_task); + } + + p_thread_load_lock.temp_relock(); load_task.awaited = true; - thread_load_mutex.unlock(); - wtp_task_err = WorkerThreadPool::get_singleton()->wait_for_task_completion(load_task.task_id); - } - if (load_task.status == THREAD_LOAD_IN_PROGRESS) { // If early errored, awaiting would deadlock. - if (loader_is_wtp) { - if (wtp_task_err == ERR_BUSY) { - // The WorkerThreadPool has reported that the current task wants to await on an older one. - // That't not allowed for safety, to avoid deadlocks. Fortunately, though, in the context of - // resource loading that means that the task to wait for can be restarted here to break the - // cycle, with as much recursion into this process as needed. - // When the stack is eventually unrolled, the original load will have been notified to go on. - // CACHE_MODE_IGNORE is needed because, otherwise, the new request would just see there's - // an ongoing load for that resource and wait for it again. This value forces a new load. - Ref token = _load_start(load_task.local_path, load_task.type_hint, LOAD_THREAD_DISTRIBUTE, ResourceFormatLoader::CACHE_MODE_IGNORE); - Ref resource = _load_complete(*token.ptr(), &wtp_task_err); - if (r_error) { - *r_error = wtp_task_err; - } - thread_load_mutex.lock(); - return resource; - } else { - DEV_ASSERT(wtp_task_err == OK); - thread_load_mutex.lock(); - } - } else { - // Loading thread is main or user thread. - if (!load_task.cond_var) { - load_task.cond_var = memnew(ConditionVariable); - } - do { - load_task.cond_var->wait(p_thread_load_lock); - DEV_ASSERT(thread_load_tasks.has(p_load_token.local_path) && p_load_token.get_reference_count()); - } while (load_task.cond_var); + DEV_ASSERT(load_task.status == THREAD_LOAD_FAILED || load_task.status == THREAD_LOAD_LOADED); + } else if (load_task.need_wait) { + // Loading thread is main or user thread. + if (!load_task.cond_var) { + load_task.cond_var = memnew(ConditionVariable); } - } else { - if (loader_is_wtp) { - thread_load_mutex.lock(); + load_task.awaiters_count++; + do { + load_task.cond_var->wait(p_thread_load_lock); + DEV_ASSERT(thread_load_tasks.has(p_load_token.local_path) && p_load_token.get_reference_count()); + } while (load_task.need_wait); + load_task.awaiters_count--; + if (load_task.awaiters_count == 0) { + memdelete(load_task.cond_var); + load_task.cond_var = nullptr; } + + DEV_ASSERT(load_task.status == THREAD_LOAD_FAILED || load_task.status == THREAD_LOAD_LOADED); } } @@ -750,22 +821,51 @@ Ref ResourceLoader::_load_complete_inner(LoadToken &p_load_token, Erro load_task.error = FAILED; } - Ref resource = load_task.resource; - if (r_error) { - *r_error = load_task.error; - } - return resource; - } else { - // Special case of an unregistered task. - // The resource should have been loaded by now. - Ref resource = p_load_token.res_if_unregistered; - if (!resource.is_valid()) { - if (r_error) { - *r_error = FAILED; + load_task_ptr = &load_task; + } + + p_thread_load_lock.temp_unlock(); + + Ref resource = load_task_ptr->resource; + if (r_error) { + *r_error = load_task_ptr->error; + } + + if (resource.is_valid()) { + if (curr_load_task) { + // A task awaiting another => Let the awaiter accumulate the resource changed connections. + DEV_ASSERT(curr_load_task != load_task_ptr); + for (const ThreadLoadTask::ResourceChangedConnection &rcc : load_task_ptr->resource_changed_connections) { + curr_load_task->resource_changed_connections.push_back(rcc); + } + } else { + // A leaf task being awaited => Propagate the resource changed connections. + if (Thread::is_main_thread()) { + // On the main thread it's safe to migrate the connections to the standard signal mechanism. + for (const ThreadLoadTask::ResourceChangedConnection &rcc : load_task_ptr->resource_changed_connections) { + if (rcc.callable.is_valid()) { + rcc.source->connect_changed(rcc.callable, rcc.flags); + } + } + } else { + // On non-main threads, we have to queue and call it done when processed. + if (!load_task_ptr->resource_changed_connections.is_empty()) { + for (const ThreadLoadTask::ResourceChangedConnection &rcc : load_task_ptr->resource_changed_connections) { + if (rcc.callable.is_valid()) { + MessageQueue::get_main_singleton()->push_callable(callable_mp(rcc.source, &Resource::connect_changed).bind(rcc.callable, rcc.flags)); + } + } + core_bind::Semaphore done; + MessageQueue::get_main_singleton()->push_callable(callable_mp(&done, &core_bind::Semaphore::post).bind(1)); + done.wait(); + } } } - return resource; } + + p_thread_load_lock.temp_relock(); + + return resource; } bool ResourceLoader::_ensure_load_progress() { @@ -779,6 +879,50 @@ bool ResourceLoader::_ensure_load_progress() { return true; } +void ResourceLoader::resource_changed_connect(Resource *p_source, const Callable &p_callable, uint32_t p_flags) { + print_lt(vformat("%d\t%ud:%s\t" FUNCTION_STR "\t%d", Thread::get_caller_id(), p_source->get_instance_id(), p_source->get_class(), p_callable.get_object_id())); + + MutexLock lock(thread_load_mutex); + + for (const ThreadLoadTask::ResourceChangedConnection &rcc : curr_load_task->resource_changed_connections) { + if (unlikely(rcc.source == p_source && rcc.callable == p_callable)) { + return; + } + } + + ThreadLoadTask::ResourceChangedConnection rcc; + rcc.source = p_source; + rcc.callable = p_callable; + rcc.flags = p_flags; + curr_load_task->resource_changed_connections.push_back(rcc); +} + +void ResourceLoader::resource_changed_disconnect(Resource *p_source, const Callable &p_callable) { + print_lt(vformat("%d\t%ud:%s\t" FUNCTION_STR "t%d", Thread::get_caller_id(), p_source->get_instance_id(), p_source->get_class(), p_callable.get_object_id())); + + MutexLock lock(thread_load_mutex); + + for (uint32_t i = 0; i < curr_load_task->resource_changed_connections.size(); ++i) { + const ThreadLoadTask::ResourceChangedConnection &rcc = curr_load_task->resource_changed_connections[i]; + if (unlikely(rcc.source == p_source && rcc.callable == p_callable)) { + curr_load_task->resource_changed_connections.remove_at_unordered(i); + return; + } + } +} + +void ResourceLoader::resource_changed_emit(Resource *p_source) { + print_lt(vformat("%d\t%ud:%s\t" FUNCTION_STR, Thread::get_caller_id(), p_source->get_instance_id(), p_source->get_class())); + + MutexLock lock(thread_load_mutex); + + for (const ThreadLoadTask::ResourceChangedConnection &rcc : curr_load_task->resource_changed_connections) { + if (unlikely(rcc.source == p_source)) { + rcc.callable.call(); + } + } +} + Ref ResourceLoader::ensure_resource_ref_override_for_outer_load(const String &p_path, const String &p_res_type) { ERR_FAIL_COND_V(load_nesting == 0, Ref()); // It makes no sense to use this from nesting level 0. const String &local_path = _validate_local_path(p_path); @@ -1055,36 +1199,39 @@ String ResourceLoader::_path_remap(const String &p_path, bool *r_translation_rem new_path = path_remaps[new_path]; } else { // Try file remap. - Error err; - Ref f = FileAccess::open(new_path + ".remap", FileAccess::READ, &err); - if (f.is_valid()) { - VariantParser::StreamFile stream; - stream.f = f; - - String assign; - Variant value; - VariantParser::Tag next_tag; - - int lines = 0; - String error_text; - while (true) { - assign = Variant(); - next_tag.fields.clear(); - next_tag.name = String(); - - err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, nullptr, true); - if (err == ERR_FILE_EOF) { - break; - } else if (err != OK) { - ERR_PRINT("Parse error: " + p_path + ".remap:" + itos(lines) + " error: " + error_text + "."); - break; - } + // Usually, there's no remap file and FileAccess::exists() is faster than FileAccess::open(). + if (FileAccess::exists(new_path + ".remap")) { + Error err; + Ref f = FileAccess::open(new_path + ".remap", FileAccess::READ, &err); + if (f.is_valid()) { + VariantParser::StreamFile stream; + stream.f = f; + + String assign; + Variant value; + VariantParser::Tag next_tag; + + int lines = 0; + String error_text; + while (true) { + assign = Variant(); + next_tag.fields.clear(); + next_tag.name = String(); + + err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, nullptr, true); + if (err == ERR_FILE_EOF) { + break; + } else if (err != OK) { + ERR_PRINT("Parse error: " + p_path + ".remap:" + itos(lines) + " error: " + error_text + "."); + break; + } - if (assign == "path") { - new_path = value; - break; - } else if (next_tag.name != "remap") { - break; + if (assign == "path") { + new_path = value; + break; + } else if (next_tag.name != "remap") { + break; + } } } } @@ -1106,17 +1253,17 @@ String ResourceLoader::path_remap(const String &p_path) { } void ResourceLoader::reload_translation_remaps() { - ResourceCache::lock.lock(); - List to_reload; - SelfList *E = remapped_list.first(); - while (E) { - to_reload.push_back(E->self()); - E = E->next(); - } + { + MutexLock lock(ResourceCache::lock); + SelfList *E = remapped_list.first(); - ResourceCache::lock.unlock(); + while (E) { + to_reload.push_back(E->self()); + E = E->next(); + } + } //now just make sure to not delete any of these resources while changing locale.. while (to_reload.front()) { @@ -1156,7 +1303,7 @@ void ResourceLoader::clear_translation_remaps() { void ResourceLoader::clear_thread_load_tasks() { // Bring the thing down as quickly as possible without causing deadlocks or leaks. - thread_load_mutex.lock(); + MutexLock thread_load_lock(thread_load_mutex); cleaning_tasks = true; while (true) { @@ -1164,11 +1311,10 @@ void ResourceLoader::clear_thread_load_tasks() { if (thread_load_tasks.size()) { for (KeyValue &E : thread_load_tasks) { if (E.value.status == THREAD_LOAD_IN_PROGRESS) { - if (E.value.cond_var) { + if (E.value.cond_var && E.value.need_wait) { E.value.cond_var->notify_all(); - memdelete(E.value.cond_var); - E.value.cond_var = nullptr; } + E.value.need_wait = false; none_running = false; } } @@ -1176,21 +1322,23 @@ void ResourceLoader::clear_thread_load_tasks() { if (none_running) { break; } - thread_load_mutex.unlock(); + thread_load_lock.temp_unlock(); OS::get_singleton()->delay_usec(1000); - thread_load_mutex.lock(); + thread_load_lock.temp_relock(); } while (user_load_tokens.begin()) { - // User load tokens remove themselves from the map on destruction. - memdelete(user_load_tokens.begin()->value); + LoadToken *user_token = user_load_tokens.begin()->value; + user_load_tokens.remove(user_load_tokens.begin()); + DEV_ASSERT(user_token->user_rc > 0 && !user_token->user_path.is_empty()); + user_token->user_path.clear(); + user_token->user_rc = 0; + user_token->unreference(); } - user_load_tokens.clear(); thread_load_tasks.clear(); cleaning_tasks = false; - thread_load_mutex.unlock(); } void ResourceLoader::load_path_remaps() { @@ -1303,12 +1451,16 @@ bool ResourceLoader::abort_on_missing_resource = true; bool ResourceLoader::timestamp_on_load = false; thread_local int ResourceLoader::load_nesting = 0; -thread_local WorkerThreadPool::TaskID ResourceLoader::caller_task_id = 0; -thread_local Vector *ResourceLoader::load_paths_stack; +thread_local Vector ResourceLoader::load_paths_stack; thread_local HashMap>> ResourceLoader::res_ref_overrides; +thread_local ResourceLoader::ThreadLoadTask *ResourceLoader::curr_load_task = nullptr; + +SafeBinaryMutex &_get_res_loader_mutex() { + return ResourceLoader::thread_load_mutex; +} template <> -thread_local uint32_t SafeBinaryMutex::count = 0; +thread_local SafeBinaryMutex::TLSData SafeBinaryMutex::tls_data(_get_res_loader_mutex()); SafeBinaryMutex ResourceLoader::thread_load_mutex; HashMap ResourceLoader::thread_load_tasks; bool ResourceLoader::cleaning_tasks = false; diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h index 5f1831f0d988..caaf9f8f45dd 100644 --- a/core/io/resource_loader.h +++ b/core/io/resource_loader.h @@ -100,10 +100,14 @@ typedef Error (*ResourceLoaderImport)(const String &p_path); typedef void (*ResourceLoadedCallback)(Ref p_resource, const String &p_path); class ResourceLoader { + friend class LoadToken; + enum { MAX_LOADERS = 64 }; + struct ThreadLoadTask; + public: enum ThreadLoadStatus { THREAD_LOAD_INVALID_RESOURCE, @@ -121,7 +125,8 @@ class ResourceLoader { struct LoadToken : public RefCounted { String local_path; String user_path; - Ref res_if_unregistered; + uint32_t user_rc = 0; // Having user RC implies regular RC incremented in one, until the user RC reaches zero. + ThreadLoadTask *task_if_unregistered = nullptr; void clear(); @@ -130,10 +135,13 @@ class ResourceLoader { static const int BINARY_MUTEX_TAG = 1; - static Ref _load_start(const String &p_path, const String &p_type_hint, LoadThreadMode p_thread_mode, ResourceFormatLoader::CacheMode p_cache_mode); + static Ref _load_start(const String &p_path, const String &p_type_hint, LoadThreadMode p_thread_mode, ResourceFormatLoader::CacheMode p_cache_mode, bool p_for_user = false); static Ref _load_complete(LoadToken &p_load_token, Error *r_error); private: + static LoadToken *_load_threaded_request_reuse_user_token(const String &p_path); + static void _load_threaded_request_setup_user_token(LoadToken *p_token, const String &p_path); + static Ref _load_complete_inner(LoadToken &p_load_token, Error *r_error, MutexLock> &p_thread_load_lock); static Ref loader[MAX_LOADERS]; @@ -167,9 +175,10 @@ class ResourceLoader { Thread::ID thread_id = 0; // Used if running on an user thread (e.g., simple non-threaded load). bool awaited = false; // If it's in the pool, this helps not awaiting from more than one dependent thread. ConditionVariable *cond_var = nullptr; // In not in the worker pool or already awaiting, this is used as a secondary awaiting mechanism. + uint32_t awaiters_count = 0; + bool need_wait = true; LoadToken *load_token = nullptr; String local_path; - String remapped_path; String type_hint; float progress = 0.0f; float max_reported_progress = 0.0f; @@ -178,18 +187,27 @@ class ResourceLoader { ResourceFormatLoader::CacheMode cache_mode = ResourceFormatLoader::CACHE_MODE_REUSE; Error error = OK; Ref resource; - bool xl_remapped = false; bool use_sub_threads = false; HashSet sub_tasks; + + struct ResourceChangedConnection { + Resource *source = nullptr; + Callable callable; + uint32_t flags = 0; + }; + LocalVector resource_changed_connections; }; - static void _thread_load_function(void *p_userdata); + static void _run_load_task(void *p_userdata); static thread_local int load_nesting; - static thread_local WorkerThreadPool::TaskID caller_task_id; static thread_local HashMap>> res_ref_overrides; // Outermost key is nesting level. - static thread_local Vector *load_paths_stack; // A pointer to avoid broken TLS implementations from double-running the destructor. + static thread_local Vector load_paths_stack; + static thread_local ThreadLoadTask *curr_load_task; + static SafeBinaryMutex thread_load_mutex; + friend SafeBinaryMutex &_get_res_loader_mutex(); + static HashMap thread_load_tasks; static bool cleaning_tasks; @@ -206,6 +224,10 @@ class ResourceLoader { static bool is_within_load() { return load_nesting > 0; }; + static void resource_changed_connect(Resource *p_source, const Callable &p_callable, uint32_t p_flags); + static void resource_changed_disconnect(Resource *p_source, const Callable &p_callable); + static void resource_changed_emit(Resource *p_source); + static Ref load(const String &p_path, const String &p_type_hint = "", ResourceFormatLoader::CacheMode p_cache_mode = ResourceFormatLoader::CACHE_MODE_REUSE, Error *r_error = nullptr); static bool exists(const String &p_path, const String &p_type_hint = ""); diff --git a/core/io/stream_peer_tls.cpp b/core/io/stream_peer_tls.cpp index 69877974e685..f04e217a266b 100644 --- a/core/io/stream_peer_tls.cpp +++ b/core/io/stream_peer_tls.cpp @@ -32,11 +32,11 @@ #include "core/config/engine.h" -StreamPeerTLS *(*StreamPeerTLS::_create)() = nullptr; +StreamPeerTLS *(*StreamPeerTLS::_create)(bool p_notify_postinitialize) = nullptr; -StreamPeerTLS *StreamPeerTLS::create() { +StreamPeerTLS *StreamPeerTLS::create(bool p_notify_postinitialize) { if (_create) { - return _create(); + return _create(p_notify_postinitialize); } return nullptr; } diff --git a/core/io/stream_peer_tls.h b/core/io/stream_peer_tls.h index 5894abb7a465..3e03e25a2d42 100644 --- a/core/io/stream_peer_tls.h +++ b/core/io/stream_peer_tls.h @@ -38,7 +38,7 @@ class StreamPeerTLS : public StreamPeer { GDCLASS(StreamPeerTLS, StreamPeer); protected: - static StreamPeerTLS *(*_create)(); + static StreamPeerTLS *(*_create)(bool p_notify_postinitialize); static void _bind_methods(); public: @@ -58,7 +58,7 @@ class StreamPeerTLS : public StreamPeer { virtual void disconnect_from_stream() = 0; - static StreamPeerTLS *create(); + static StreamPeerTLS *create(bool p_notify_postinitialize = true); static bool is_available(); diff --git a/core/math/a_star.cpp b/core/math/a_star.cpp index 449760494735..c85201a97393 100644 --- a/core/math/a_star.cpp +++ b/core/math/a_star.cpp @@ -319,11 +319,11 @@ Vector3 AStar3D::get_closest_position_in_segment(const Vector3 &p_point) const { return closest_point; } -bool AStar3D::_solve(Point *begin_point, Point *end_point) { +bool AStar3D::_solve(Point *begin_point, Point *end_point, bool p_allow_partial_path) { last_closest_point = nullptr; pass++; - if (!end_point->enabled) { + if (!end_point->enabled && !p_allow_partial_path) { return false; } @@ -391,9 +391,9 @@ bool AStar3D::_solve(Point *begin_point, Point *end_point) { return found_route; } -real_t AStar3D::_estimate_cost(int64_t p_from_id, int64_t p_to_id) { +real_t AStar3D::_estimate_cost(int64_t p_from_id, int64_t p_end_id) { real_t scost; - if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_to_id, scost)) { + if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_end_id, scost)) { return scost; } @@ -401,11 +401,11 @@ real_t AStar3D::_estimate_cost(int64_t p_from_id, int64_t p_to_id) { bool from_exists = points.lookup(p_from_id, from_point); ERR_FAIL_COND_V_MSG(!from_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_from_id)); - Point *to_point = nullptr; - bool to_exists = points.lookup(p_to_id, to_point); - ERR_FAIL_COND_V_MSG(!to_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_to_id)); + Point *end_point = nullptr; + bool end_exists = points.lookup(p_end_id, end_point); + ERR_FAIL_COND_V_MSG(!end_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_end_id)); - return from_point->pos.distance_to(to_point->pos); + return from_point->pos.distance_to(end_point->pos); } real_t AStar3D::_compute_cost(int64_t p_from_id, int64_t p_to_id) { @@ -443,7 +443,7 @@ Vector AStar3D::get_point_path(int64_t p_from_id, int64_t p_to_id, bool Point *begin_point = a; Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || last_closest_point == nullptr) { return Vector(); @@ -497,7 +497,7 @@ Vector AStar3D::get_id_path(int64_t p_from_id, int64_t p_to_id, bool p_ Point *begin_point = a; Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || last_closest_point == nullptr) { return Vector(); @@ -579,7 +579,7 @@ void AStar3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_point_path", "from_id", "to_id", "allow_partial_path"), &AStar3D::get_point_path, DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_id_path", "from_id", "to_id", "allow_partial_path"), &AStar3D::get_id_path, DEFVAL(false)); - GDVIRTUAL_BIND(_estimate_cost, "from_id", "to_id") + GDVIRTUAL_BIND(_estimate_cost, "from_id", "end_id") GDVIRTUAL_BIND(_compute_cost, "from_id", "to_id") } @@ -675,9 +675,9 @@ Vector2 AStar2D::get_closest_position_in_segment(const Vector2 &p_point) const { return Vector2(p.x, p.y); } -real_t AStar2D::_estimate_cost(int64_t p_from_id, int64_t p_to_id) { +real_t AStar2D::_estimate_cost(int64_t p_from_id, int64_t p_end_id) { real_t scost; - if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_to_id, scost)) { + if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_end_id, scost)) { return scost; } @@ -685,11 +685,11 @@ real_t AStar2D::_estimate_cost(int64_t p_from_id, int64_t p_to_id) { bool from_exists = astar.points.lookup(p_from_id, from_point); ERR_FAIL_COND_V_MSG(!from_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_from_id)); - AStar3D::Point *to_point = nullptr; - bool to_exists = astar.points.lookup(p_to_id, to_point); - ERR_FAIL_COND_V_MSG(!to_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_to_id)); + AStar3D::Point *end_point = nullptr; + bool to_exists = astar.points.lookup(p_end_id, end_point); + ERR_FAIL_COND_V_MSG(!to_exists, 0, vformat("Can't estimate cost. Point with id: %d doesn't exist.", p_end_id)); - return from_point->pos.distance_to(to_point->pos); + return from_point->pos.distance_to(end_point->pos); } real_t AStar2D::_compute_cost(int64_t p_from_id, int64_t p_to_id) { @@ -726,7 +726,7 @@ Vector AStar2D::get_point_path(int64_t p_from_id, int64_t p_to_id, bool AStar3D::Point *begin_point = a; AStar3D::Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || astar.last_closest_point == nullptr) { return Vector(); @@ -780,7 +780,7 @@ Vector AStar2D::get_id_path(int64_t p_from_id, int64_t p_to_id, bool p_ AStar3D::Point *begin_point = a; AStar3D::Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || astar.last_closest_point == nullptr) { return Vector(); @@ -816,11 +816,11 @@ Vector AStar2D::get_id_path(int64_t p_from_id, int64_t p_to_id, bool p_ return path; } -bool AStar2D::_solve(AStar3D::Point *begin_point, AStar3D::Point *end_point) { +bool AStar2D::_solve(AStar3D::Point *begin_point, AStar3D::Point *end_point, bool p_allow_partial_path) { astar.last_closest_point = nullptr; astar.pass++; - if (!end_point->enabled) { + if (!end_point->enabled && !p_allow_partial_path) { return false; } @@ -918,6 +918,6 @@ void AStar2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_point_path", "from_id", "to_id", "allow_partial_path"), &AStar2D::get_point_path, DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_id_path", "from_id", "to_id", "allow_partial_path"), &AStar2D::get_id_path, DEFVAL(false)); - GDVIRTUAL_BIND(_estimate_cost, "from_id", "to_id") + GDVIRTUAL_BIND(_estimate_cost, "from_id", "end_id") GDVIRTUAL_BIND(_compute_cost, "from_id", "to_id") } diff --git a/core/math/a_star.h b/core/math/a_star.h index 8e054c478989..cbaafc101836 100644 --- a/core/math/a_star.h +++ b/core/math/a_star.h @@ -115,12 +115,12 @@ class AStar3D : public RefCounted { HashSet segments; Point *last_closest_point = nullptr; - bool _solve(Point *begin_point, Point *end_point); + bool _solve(Point *begin_point, Point *end_point, bool p_allow_partial_path); protected: static void _bind_methods(); - virtual real_t _estimate_cost(int64_t p_from_id, int64_t p_to_id); + virtual real_t _estimate_cost(int64_t p_from_id, int64_t p_end_id); virtual real_t _compute_cost(int64_t p_from_id, int64_t p_to_id); GDVIRTUAL2RC(real_t, _estimate_cost, int64_t, int64_t) @@ -171,12 +171,12 @@ class AStar2D : public RefCounted { GDCLASS(AStar2D, RefCounted); AStar3D astar; - bool _solve(AStar3D::Point *begin_point, AStar3D::Point *end_point); + bool _solve(AStar3D::Point *begin_point, AStar3D::Point *end_point, bool p_allow_partial_path); protected: static void _bind_methods(); - virtual real_t _estimate_cost(int64_t p_from_id, int64_t p_to_id); + virtual real_t _estimate_cost(int64_t p_from_id, int64_t p_end_id); virtual real_t _compute_cost(int64_t p_from_id, int64_t p_to_id); GDVIRTUAL2RC(real_t, _estimate_cost, int64_t, int64_t) diff --git a/core/math/a_star_grid_2d.cpp b/core/math/a_star_grid_2d.cpp index 984bb1c9c18b..7e0e982c6244 100644 --- a/core/math/a_star_grid_2d.cpp +++ b/core/math/a_star_grid_2d.cpp @@ -127,13 +127,18 @@ void AStarGrid2D::update() { } points.clear(); + solid_mask.clear(); const int32_t end_x = region.get_end().x; const int32_t end_y = region.get_end().y; const Vector2 half_cell_size = cell_size / 2; + for (int32_t x = region.position.x; x < end_x + 2; x++) { + solid_mask.push_back(true); + } for (int32_t y = region.position.y; y < end_y; y++) { LocalVector line; + solid_mask.push_back(true); for (int32_t x = region.position.x; x < end_x; x++) { Vector2 v = offset; switch (cell_shape) { @@ -150,10 +155,16 @@ void AStarGrid2D::update() { break; } line.push_back(Point(Vector2i(x, y), v)); + solid_mask.push_back(false); } + solid_mask.push_back(true); points.push_back(line); } + for (int32_t x = region.position.x; x < end_x + 2; x++) { + solid_mask.push_back(true); + } + dirty = false; } @@ -207,13 +218,13 @@ AStarGrid2D::Heuristic AStarGrid2D::get_default_estimate_heuristic() const { void AStarGrid2D::set_point_solid(const Vector2i &p_id, bool p_solid) { ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method."); ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set if point is disabled. Point %s out of bounds %s.", p_id, region)); - _get_point_unchecked(p_id)->solid = p_solid; + _set_solid_unchecked(p_id, p_solid); } bool AStarGrid2D::is_point_solid(const Vector2i &p_id) const { ERR_FAIL_COND_V_MSG(dirty, false, "Grid is not initialized. Call the update method."); ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), false, vformat("Can't get if point is disabled. Point %s out of bounds %s.", p_id, region)); - return _get_point_unchecked(p_id)->solid; + return _get_solid_unchecked(p_id); } void AStarGrid2D::set_point_weight_scale(const Vector2i &p_id, real_t p_weight_scale) { @@ -238,7 +249,7 @@ void AStarGrid2D::fill_solid_region(const Rect2i &p_region, bool p_solid) { for (int32_t y = safe_region.position.y; y < end_y; y++) { for (int32_t x = safe_region.position.x; x < end_x; x++) { - _get_point_unchecked(x, y)->solid = p_solid; + _set_solid_unchecked(x, y, p_solid); } } } @@ -259,13 +270,6 @@ void AStarGrid2D::fill_weight_scale_region(const Rect2i &p_region, real_t p_weig } AStarGrid2D::Point *AStarGrid2D::_jump(Point *p_from, Point *p_to) { - if (!p_to || p_to->solid) { - return nullptr; - } - if (p_to == end) { - return p_to; - } - int32_t from_x = p_from->id.x; int32_t from_y = p_from->id.y; @@ -276,72 +280,109 @@ AStarGrid2D::Point *AStarGrid2D::_jump(Point *p_from, Point *p_to) { int32_t dy = to_y - from_y; if (diagonal_mode == DIAGONAL_MODE_ALWAYS || diagonal_mode == DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE) { - if (dx != 0 && dy != 0) { - if ((_is_walkable(to_x - dx, to_y + dy) && !_is_walkable(to_x - dx, to_y)) || (_is_walkable(to_x + dx, to_y - dy) && !_is_walkable(to_x, to_y - dy))) { - return p_to; - } - if (_jump(p_to, _get_point(to_x + dx, to_y)) != nullptr) { - return p_to; + if (dx == 0 || dy == 0) { + return _forced_successor(to_x, to_y, dx, dy); + } + + while (_is_walkable(to_x, to_y) && (diagonal_mode == DIAGONAL_MODE_ALWAYS || _is_walkable(to_x, to_y - dy) || _is_walkable(to_x - dx, to_y))) { + if (end->id.x == to_x && end->id.y == to_y) { + return end; } - if (_jump(p_to, _get_point(to_x, to_y + dy)) != nullptr) { - return p_to; + + if ((_is_walkable(to_x - dx, to_y + dy) && !_is_walkable(to_x - dx, to_y)) || (_is_walkable(to_x + dx, to_y - dy) && !_is_walkable(to_x, to_y - dy))) { + return _get_point_unchecked(to_x, to_y); } - } else { - if (dx != 0) { - if ((_is_walkable(to_x + dx, to_y + 1) && !_is_walkable(to_x, to_y + 1)) || (_is_walkable(to_x + dx, to_y - 1) && !_is_walkable(to_x, to_y - 1))) { - return p_to; - } - } else { - if ((_is_walkable(to_x + 1, to_y + dy) && !_is_walkable(to_x + 1, to_y)) || (_is_walkable(to_x - 1, to_y + dy) && !_is_walkable(to_x - 1, to_y))) { - return p_to; - } + + if (_forced_successor(to_x + dx, to_y, dx, 0) != nullptr || _forced_successor(to_x, to_y + dy, 0, dy) != nullptr) { + return _get_point_unchecked(to_x, to_y); } + + to_x += dx; + to_y += dy; } - if (_is_walkable(to_x + dx, to_y + dy) && (diagonal_mode == DIAGONAL_MODE_ALWAYS || (_is_walkable(to_x + dx, to_y) || _is_walkable(to_x, to_y + dy)))) { - return _jump(p_to, _get_point(to_x + dx, to_y + dy)); - } + } else if (diagonal_mode == DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES) { - if (dx != 0 && dy != 0) { - if ((_is_walkable(to_x + dx, to_y + dy) && !_is_walkable(to_x, to_y + dy)) || !_is_walkable(to_x + dx, to_y)) { - return p_to; - } - if (_jump(p_to, _get_point(to_x + dx, to_y)) != nullptr) { - return p_to; + if (dx == 0 || dy == 0) { + return _forced_successor(from_x, from_y, dx, dy, true); + } + + while (_is_walkable(to_x, to_y) && _is_walkable(to_x, to_y - dy) && _is_walkable(to_x - dx, to_y)) { + if (end->id.x == to_x && end->id.y == to_y) { + return end; } - if (_jump(p_to, _get_point(to_x, to_y + dy)) != nullptr) { - return p_to; + + if ((_is_walkable(to_x + dx, to_y + dy) && !_is_walkable(to_x, to_y + dy)) || !_is_walkable(to_x + dx, to_y)) { + return _get_point_unchecked(to_x, to_y); } - } else { - if (dx != 0) { - if ((_is_walkable(to_x, to_y + 1) && !_is_walkable(to_x - dx, to_y + 1)) || (_is_walkable(to_x, to_y - 1) && !_is_walkable(to_x - dx, to_y - 1))) { - return p_to; - } - } else { - if ((_is_walkable(to_x + 1, to_y) && !_is_walkable(to_x + 1, to_y - dy)) || (_is_walkable(to_x - 1, to_y) && !_is_walkable(to_x - 1, to_y - dy))) { - return p_to; - } + + if (_forced_successor(to_x, to_y, dx, 0) != nullptr || _forced_successor(to_x, to_y, 0, dy) != nullptr) { + return _get_point_unchecked(to_x, to_y); } + + to_x += dx; + to_y += dy; } - if (_is_walkable(to_x + dx, to_y + dy) && _is_walkable(to_x + dx, to_y) && _is_walkable(to_x, to_y + dy)) { - return _jump(p_to, _get_point(to_x + dx, to_y + dy)); - } + } else { // DIAGONAL_MODE_NEVER - if (dx != 0) { - if ((_is_walkable(to_x, to_y - 1) && !_is_walkable(to_x - dx, to_y - 1)) || (_is_walkable(to_x, to_y + 1) && !_is_walkable(to_x - dx, to_y + 1))) { - return p_to; + if (dy == 0) { + return _forced_successor(from_x, from_y, dx, 0, true); + } + + while (_is_walkable(to_x, to_y)) { + if (end->id.x == to_x && end->id.y == to_y) { + return end; } - } else if (dy != 0) { + if ((_is_walkable(to_x - 1, to_y) && !_is_walkable(to_x - 1, to_y - dy)) || (_is_walkable(to_x + 1, to_y) && !_is_walkable(to_x + 1, to_y - dy))) { - return p_to; - } - if (_jump(p_to, _get_point(to_x + 1, to_y)) != nullptr) { - return p_to; + return _get_point_unchecked(to_x, to_y); } - if (_jump(p_to, _get_point(to_x - 1, to_y)) != nullptr) { - return p_to; + + if (_forced_successor(to_x, to_y, 1, 0, true) != nullptr || _forced_successor(to_x, to_y, -1, 0, true) != nullptr) { + return _get_point_unchecked(to_x, to_y); } + + to_y += dy; } - return _jump(p_to, _get_point(to_x + dx, to_y + dy)); + } + + return nullptr; +} + +AStarGrid2D::Point *AStarGrid2D::_forced_successor(int32_t p_x, int32_t p_y, int32_t p_dx, int32_t p_dy, bool p_inclusive) { + // Remembering previous results can improve performance. + bool l_prev = false, r_prev = false, l = false, r = false; + + int32_t o_x = p_x, o_y = p_y; + if (p_inclusive) { + o_x += p_dx; + o_y += p_dy; + } + + int32_t l_x = p_x - p_dy, l_y = p_y - p_dx; + int32_t r_x = p_x + p_dy, r_y = p_y + p_dx; + + while (_is_walkable(o_x, o_y)) { + if (end->id.x == o_x && end->id.y == o_y) { + return end; + } + + l_prev = l || _is_walkable(l_x, l_y); + r_prev = r || _is_walkable(r_x, r_y); + + l_x += p_dx; + l_y += p_dy; + r_x += p_dx; + r_y += p_dy; + + l = _is_walkable(l_x, l_y); + r = _is_walkable(r_x, r_y); + + if ((l && !l_prev) || (r && !r_prev)) { + return _get_point_unchecked(o_x, o_y); + } + + o_x += p_dx; + o_y += p_dy; } return nullptr; } @@ -394,19 +435,19 @@ void AStarGrid2D::_get_nbors(Point *p_point, LocalVector &r_nbors) { } } - if (top && !top->solid) { + if (top && !_get_solid_unchecked(top->id)) { r_nbors.push_back(top); ts0 = true; } - if (right && !right->solid) { + if (right && !_get_solid_unchecked(right->id)) { r_nbors.push_back(right); ts1 = true; } - if (bottom && !bottom->solid) { + if (bottom && !_get_solid_unchecked(bottom->id)) { r_nbors.push_back(bottom); ts2 = true; } - if (left && !left->solid) { + if (left && !_get_solid_unchecked(left->id)) { r_nbors.push_back(left); ts3 = true; } @@ -436,25 +477,25 @@ void AStarGrid2D::_get_nbors(Point *p_point, LocalVector &r_nbors) { break; } - if (td0 && (top_left && !top_left->solid)) { + if (td0 && (top_left && !_get_solid_unchecked(top_left->id))) { r_nbors.push_back(top_left); } - if (td1 && (top_right && !top_right->solid)) { + if (td1 && (top_right && !_get_solid_unchecked(top_right->id))) { r_nbors.push_back(top_right); } - if (td2 && (bottom_right && !bottom_right->solid)) { + if (td2 && (bottom_right && !_get_solid_unchecked(bottom_right->id))) { r_nbors.push_back(bottom_right); } - if (td3 && (bottom_left && !bottom_left->solid)) { + if (td3 && (bottom_left && !_get_solid_unchecked(bottom_left->id))) { r_nbors.push_back(bottom_left); } } -bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point) { +bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point, bool p_allow_partial_path) { last_closest_point = nullptr; pass++; - if (p_end_point->solid) { + if (_get_solid_unchecked(p_end_point->id) && !p_allow_partial_path) { return false; } @@ -500,7 +541,7 @@ bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point) { continue; } } else { - if (e->solid || e->closed_pass == pass) { + if (_get_solid_unchecked(e->id) || e->closed_pass == pass) { continue; } weight_scale = e->weight_scale; @@ -535,12 +576,12 @@ bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point) { return found_route; } -real_t AStarGrid2D::_estimate_cost(const Vector2i &p_from_id, const Vector2i &p_to_id) { +real_t AStarGrid2D::_estimate_cost(const Vector2i &p_from_id, const Vector2i &p_end_id) { real_t scost; - if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_to_id, scost)) { + if (GDVIRTUAL_CALL(_estimate_cost, p_from_id, p_end_id, scost)) { return scost; } - return heuristics[default_estimate_heuristic](p_from_id, p_to_id); + return heuristics[default_estimate_heuristic](p_from_id, p_end_id); } real_t AStarGrid2D::_compute_cost(const Vector2i &p_from_id, const Vector2i &p_to_id) { @@ -562,6 +603,33 @@ Vector2 AStarGrid2D::get_point_position(const Vector2i &p_id) const { return _get_point_unchecked(p_id)->pos; } +TypedArray AStarGrid2D::get_point_data_in_region(const Rect2i &p_region) const { + ERR_FAIL_COND_V_MSG(dirty, TypedArray(), "Grid is not initialized. Call the update method."); + const Rect2i inter_region = region.intersection(p_region); + + const int32_t start_x = inter_region.position.x - region.position.x; + const int32_t start_y = inter_region.position.y - region.position.y; + const int32_t end_x = inter_region.get_end().x - region.position.x; + const int32_t end_y = inter_region.get_end().y - region.position.y; + + TypedArray data; + + for (int32_t y = start_y; y < end_y; y++) { + for (int32_t x = start_x; x < end_x; x++) { + const Point &p = points[y][x]; + + Dictionary dict; + dict["id"] = p.id; + dict["position"] = p.pos; + dict["solid"] = _get_solid_unchecked(p.id); + dict["weight_scale"] = p.weight_scale; + data.push_back(dict); + } + } + + return data; +} + Vector AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vector2i &p_to_id, bool p_allow_partial_path) { ERR_FAIL_COND_V_MSG(dirty, Vector(), "Grid is not initialized. Call the update method."); ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_from_id), Vector(), vformat("Can't get id path. Point %s out of bounds %s.", p_from_id, region)); @@ -579,7 +647,7 @@ Vector AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vec Point *begin_point = a; Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || last_closest_point == nullptr) { return Vector(); @@ -632,7 +700,7 @@ TypedArray AStarGrid2D::get_id_path(const Vector2i &p_from_id, const V Point *begin_point = a; Point *end_point = b; - bool found_route = _solve(begin_point, end_point); + bool found_route = _solve(begin_point, end_point, p_allow_partial_path); if (!found_route) { if (!p_allow_partial_path || last_closest_point == nullptr) { return TypedArray(); @@ -698,10 +766,11 @@ void AStarGrid2D::_bind_methods() { ClassDB::bind_method(D_METHOD("clear"), &AStarGrid2D::clear); ClassDB::bind_method(D_METHOD("get_point_position", "id"), &AStarGrid2D::get_point_position); + ClassDB::bind_method(D_METHOD("get_point_data_in_region", "region"), &AStarGrid2D::get_point_data_in_region); ClassDB::bind_method(D_METHOD("get_point_path", "from_id", "to_id", "allow_partial_path"), &AStarGrid2D::get_point_path, DEFVAL(false)); ClassDB::bind_method(D_METHOD("get_id_path", "from_id", "to_id", "allow_partial_path"), &AStarGrid2D::get_id_path, DEFVAL(false)); - GDVIRTUAL_BIND(_estimate_cost, "from_id", "to_id") + GDVIRTUAL_BIND(_estimate_cost, "from_id", "end_id") GDVIRTUAL_BIND(_compute_cost, "from_id", "to_id") ADD_PROPERTY(PropertyInfo(Variant::RECT2I, "region"), "set_region", "get_region"); diff --git a/core/math/a_star_grid_2d.h b/core/math/a_star_grid_2d.h index 1a9f6dcc11fa..0536b8109b73 100644 --- a/core/math/a_star_grid_2d.h +++ b/core/math/a_star_grid_2d.h @@ -78,7 +78,6 @@ class AStarGrid2D : public RefCounted { struct Point { Vector2i id; - bool solid = false; Vector2 pos; real_t weight_scale = 1.0; @@ -111,6 +110,7 @@ class AStarGrid2D : public RefCounted { } }; + LocalVector solid_mask; LocalVector> points; Point *end = nullptr; Point *last_closest_point = nullptr; @@ -118,11 +118,12 @@ class AStarGrid2D : public RefCounted { uint64_t pass = 1; private: // Internal routines. + _FORCE_INLINE_ size_t _to_mask_index(int32_t p_x, int32_t p_y) const { + return ((p_y - region.position.y + 1) * (region.size.x + 2)) + p_x - region.position.x + 1; + } + _FORCE_INLINE_ bool _is_walkable(int32_t p_x, int32_t p_y) const { - if (region.has_point(Vector2i(p_x, p_y))) { - return !points[p_y - region.position.y][p_x - region.position.x].solid; - } - return false; + return !solid_mask[_to_mask_index(p_x, p_y)]; } _FORCE_INLINE_ Point *_get_point(int32_t p_x, int32_t p_y) { @@ -132,6 +133,18 @@ class AStarGrid2D : public RefCounted { return nullptr; } + _FORCE_INLINE_ void _set_solid_unchecked(int32_t p_x, int32_t p_y, bool p_solid) { + solid_mask[_to_mask_index(p_x, p_y)] = p_solid; + } + + _FORCE_INLINE_ void _set_solid_unchecked(const Vector2i &p_id, bool p_solid) { + solid_mask[_to_mask_index(p_id.x, p_id.y)] = p_solid; + } + + _FORCE_INLINE_ bool _get_solid_unchecked(const Vector2i &p_id) const { + return solid_mask[_to_mask_index(p_id.x, p_id.y)]; + } + _FORCE_INLINE_ Point *_get_point_unchecked(int32_t p_x, int32_t p_y) { return &points[p_y - region.position.y][p_x - region.position.x]; } @@ -146,12 +159,13 @@ class AStarGrid2D : public RefCounted { void _get_nbors(Point *p_point, LocalVector &r_nbors); Point *_jump(Point *p_from, Point *p_to); - bool _solve(Point *p_begin_point, Point *p_end_point); + bool _solve(Point *p_begin_point, Point *p_end_point, bool p_allow_partial_path); + Point *_forced_successor(int32_t p_x, int32_t p_y, int32_t p_dx, int32_t p_dy, bool p_inclusive = false); protected: static void _bind_methods(); - virtual real_t _estimate_cost(const Vector2i &p_from_id, const Vector2i &p_to_id); + virtual real_t _estimate_cost(const Vector2i &p_from_id, const Vector2i &p_end_id); virtual real_t _compute_cost(const Vector2i &p_from_id, const Vector2i &p_to_id); GDVIRTUAL2RC(real_t, _estimate_cost, Vector2i, Vector2i) @@ -209,6 +223,7 @@ class AStarGrid2D : public RefCounted { void clear(); Vector2 get_point_position(const Vector2i &p_id) const; + TypedArray get_point_data_in_region(const Rect2i &p_region) const; Vector get_point_path(const Vector2i &p_from, const Vector2i &p_to, bool p_allow_partial_path = false); TypedArray get_id_path(const Vector2i &p_from, const Vector2i &p_to, bool p_allow_partial_path = false); }; diff --git a/core/math/aabb.h b/core/math/aabb.h index cb358ca7efc2..7a5581b5d453 100644 --- a/core/math/aabb.h +++ b/core/math/aabb.h @@ -85,7 +85,7 @@ struct [[nodiscard]] AABB { bool intersects_plane(const Plane &p_plane) const; _FORCE_INLINE_ bool has_point(const Vector3 &p_point) const; - _FORCE_INLINE_ Vector3 get_support(const Vector3 &p_normal) const; + _FORCE_INLINE_ Vector3 get_support(const Vector3 &p_direction) const; Vector3 get_longest_axis() const; int get_longest_axis_index() const; @@ -212,15 +212,18 @@ inline bool AABB::encloses(const AABB &p_aabb) const { (src_max.z >= dst_max.z)); } -Vector3 AABB::get_support(const Vector3 &p_normal) const { - Vector3 half_extents = size * 0.5f; - Vector3 ofs = position + half_extents; - - return Vector3( - (p_normal.x > 0) ? half_extents.x : -half_extents.x, - (p_normal.y > 0) ? half_extents.y : -half_extents.y, - (p_normal.z > 0) ? half_extents.z : -half_extents.z) + - ofs; +Vector3 AABB::get_support(const Vector3 &p_direction) const { + Vector3 support = position; + if (p_direction.x > 0.0f) { + support.x += size.x; + } + if (p_direction.y > 0.0f) { + support.y += size.y; + } + if (p_direction.z > 0.0f) { + support.z += size.z; + } + return support; } Vector3 AABB::get_endpoint(int p_point) const { diff --git a/core/math/color.h b/core/math/color.h index e17b8c9fd703..70fad78acbdd 100644 --- a/core/math/color.h +++ b/core/math/color.h @@ -129,33 +129,46 @@ struct [[nodiscard]] Color { } _FORCE_INLINE_ uint32_t to_rgbe9995() const { - const float pow2to9 = 512.0f; - const float B = 15.0f; - const float N = 9.0f; - - float sharedexp = 65408.000f; // Result of: ((pow2to9 - 1.0f) / pow2to9) * powf(2.0f, 31.0f - 15.0f) - - float cRed = MAX(0.0f, MIN(sharedexp, r)); - float cGreen = MAX(0.0f, MIN(sharedexp, g)); - float cBlue = MAX(0.0f, MIN(sharedexp, b)); - - float cMax = MAX(cRed, MAX(cGreen, cBlue)); - - float expp = MAX(-B - 1.0f, floor(Math::log(cMax) / (real_t)Math_LN2)) + 1.0f + B; - - float sMax = (float)floor((cMax / Math::pow(2.0f, expp - B - N)) + 0.5f); - - float exps = expp + 1.0f; - - if (0.0f <= sMax && sMax < pow2to9) { - exps = expp; - } - - float sRed = Math::floor((cRed / pow(2.0f, exps - B - N)) + 0.5f); - float sGreen = Math::floor((cGreen / pow(2.0f, exps - B - N)) + 0.5f); - float sBlue = Math::floor((cBlue / pow(2.0f, exps - B - N)) + 0.5f); - - return (uint32_t(Math::fast_ftoi(sRed)) & 0x1FF) | ((uint32_t(Math::fast_ftoi(sGreen)) & 0x1FF) << 9) | ((uint32_t(Math::fast_ftoi(sBlue)) & 0x1FF) << 18) | ((uint32_t(Math::fast_ftoi(exps)) & 0x1F) << 27); + // https://github.com/microsoft/DirectX-Graphics-Samples/blob/v10.0.19041.0/MiniEngine/Core/Color.cpp + static const float kMaxVal = float(0x1FF << 7); + static const float kMinVal = float(1.f / (1 << 16)); + + // Clamp RGB to [0, 1.FF*2^16] + const float _r = CLAMP(r, 0.0f, kMaxVal); + const float _g = CLAMP(g, 0.0f, kMaxVal); + const float _b = CLAMP(b, 0.0f, kMaxVal); + + // Compute the maximum channel, no less than 1.0*2^-15 + const float MaxChannel = MAX(MAX(_r, _g), MAX(_b, kMinVal)); + + // Take the exponent of the maximum channel (rounding up the 9th bit) and + // add 15 to it. When added to the channels, it causes the implicit '1.0' + // bit and the first 8 mantissa bits to be shifted down to the low 9 bits + // of the mantissa, rounding the truncated bits. + union { + float f; + int32_t i; + } R, G, B, E; + + E.f = MaxChannel; + E.i += 0x07804000; // Add 15 to the exponent and 0x4000 to the mantissa + E.i &= 0x7F800000; // Zero the mantissa + + // This shifts the 9-bit values we need into the lowest bits, rounding as + // needed. Note that if the channel has a smaller exponent than the max + // channel, it will shift even more. This is intentional. + R.f = _r + E.f; + G.f = _g + E.f; + B.f = _b + E.f; + + // Convert the Bias to the correct exponent in the upper 5 bits. + E.i <<= 4; + E.i += 0x10000000; + + // Combine the fields. RGB floats have unwanted data in the upper 9 + // bits. Only red needs to mask them off because green and blue shift + // it out to the left. + return E.i | (B.i << 18) | (G.i << 9) | (R.i & 511); } _FORCE_INLINE_ Color blend(const Color &p_over) const { diff --git a/core/math/expression.cpp b/core/math/expression.cpp index 636c2c16bf36..0692ece1e6fa 100644 --- a/core/math/expression.cpp +++ b/core/math/expression.cpp @@ -30,12 +30,7 @@ #include "expression.h" -#include "core/io/marshalls.h" -#include "core/math/math_funcs.h" #include "core/object/class_db.h" -#include "core/object/ref_counted.h" -#include "core/os/os.h" -#include "core/variant/variant_parser.h" Error Expression::_get_token(Token &r_token) { while (true) { @@ -392,7 +387,6 @@ Error Expression::_get_token(Token &r_token) { if (is_digit(c)) { } else if (c == 'e') { reading = READING_EXP; - } else { reading = READING_DONE; } @@ -419,7 +413,9 @@ Error Expression::_get_token(Token &r_token) { is_first_char = false; } - str_ofs--; + if (c != 0) { + str_ofs--; + } r_token.type = TK_CONSTANT; diff --git a/core/math/math_funcs.h b/core/math/math_funcs.h index 3060f31970c3..1afc5f4bbbdf 100644 --- a/core/math/math_funcs.h +++ b/core/math/math_funcs.h @@ -105,6 +105,9 @@ class Math { static _ALWAYS_INLINE_ double fmod(double p_x, double p_y) { return ::fmod(p_x, p_y); } static _ALWAYS_INLINE_ float fmod(float p_x, float p_y) { return ::fmodf(p_x, p_y); } + static _ALWAYS_INLINE_ double modf(double p_x, double *r_y) { return ::modf(p_x, r_y); } + static _ALWAYS_INLINE_ float modf(float p_x, float *r_y) { return ::modff(p_x, r_y); } + static _ALWAYS_INLINE_ double floor(double p_x) { return ::floor(p_x); } static _ALWAYS_INLINE_ float floor(float p_x) { return ::floorf(p_x); } @@ -447,14 +450,22 @@ class Math { static _ALWAYS_INLINE_ double smoothstep(double p_from, double p_to, double p_s) { if (is_equal_approx(p_from, p_to)) { - return p_from; + if (likely(p_from <= p_to)) { + return p_s <= p_from ? 0.0 : 1.0; + } else { + return p_s <= p_to ? 1.0 : 0.0; + } } double s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0, 1.0); return s * s * (3.0 - 2.0 * s); } static _ALWAYS_INLINE_ float smoothstep(float p_from, float p_to, float p_s) { if (is_equal_approx(p_from, p_to)) { - return p_from; + if (likely(p_from <= p_to)) { + return p_s <= p_from ? 0.0f : 1.0f; + } else { + return p_s <= p_to ? 1.0f : 0.0f; + } } float s = CLAMP((p_s - p_from) / (p_to - p_from), 0.0f, 1.0f); return s * s * (3.0f - 2.0f * s); diff --git a/core/math/random_pcg.cpp b/core/math/random_pcg.cpp index 55787a0b57e9..c286a6042182 100644 --- a/core/math/random_pcg.cpp +++ b/core/math/random_pcg.cpp @@ -60,6 +60,11 @@ int64_t RandomPCG::rand_weighted(const Vector &p_weights) { } } + for (int64_t i = weights_size - 1; i >= 0; --i) { + if (weights[i] > 0) { + return i; + } + } return -1; } diff --git a/core/math/rect2.h b/core/math/rect2.h index 9cb341b6894a..817923c13488 100644 --- a/core/math/rect2.h +++ b/core/math/rect2.h @@ -285,13 +285,15 @@ struct [[nodiscard]] Rect2 { return Rect2(position.round(), size.round()); } - Vector2 get_support(const Vector2 &p_normal) const { - Vector2 half_extents = size * 0.5f; - Vector2 ofs = position + half_extents; - return Vector2( - (p_normal.x > 0) ? -half_extents.x : half_extents.x, - (p_normal.y > 0) ? -half_extents.y : half_extents.y) + - ofs; + Vector2 get_support(const Vector2 &p_direction) const { + Vector2 support = position; + if (p_direction.x > 0.0f) { + support.x += size.x; + } + if (p_direction.y > 0.0f) { + support.y += size.y; + } + return support; } _FORCE_INLINE_ bool intersects_filled_polygon(const Vector2 *p_points, int p_point_count) const { diff --git a/core/math/transform_interpolator.cpp b/core/math/transform_interpolator.cpp index 6a564b0ca7f6..1cd35b3d1aee 100644 --- a/core/math/transform_interpolator.cpp +++ b/core/math/transform_interpolator.cpp @@ -31,6 +31,7 @@ #include "transform_interpolator.h" #include "core/math/transform_2d.h" +#include "core/math/transform_3d.h" void TransformInterpolator::interpolate_transform_2d(const Transform2D &p_prev, const Transform2D &p_curr, Transform2D &r_result, real_t p_fraction) { // Special case for physics interpolation, if flipping, don't interpolate basis. @@ -44,3 +45,340 @@ void TransformInterpolator::interpolate_transform_2d(const Transform2D &p_prev, r_result = p_prev.interpolate_with(p_curr, p_fraction); } + +void TransformInterpolator::interpolate_transform_3d(const Transform3D &p_prev, const Transform3D &p_curr, Transform3D &r_result, real_t p_fraction) { + r_result.origin = p_prev.origin + ((p_curr.origin - p_prev.origin) * p_fraction); + interpolate_basis(p_prev.basis, p_curr.basis, r_result.basis, p_fraction); +} + +void TransformInterpolator::interpolate_basis(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction) { + Method method = find_method(p_prev, p_curr); + interpolate_basis_via_method(p_prev, p_curr, r_result, p_fraction, method); +} + +void TransformInterpolator::interpolate_transform_3d_via_method(const Transform3D &p_prev, const Transform3D &p_curr, Transform3D &r_result, real_t p_fraction, Method p_method) { + r_result.origin = p_prev.origin + ((p_curr.origin - p_prev.origin) * p_fraction); + interpolate_basis_via_method(p_prev.basis, p_curr.basis, r_result.basis, p_fraction, p_method); +} + +void TransformInterpolator::interpolate_basis_via_method(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction, Method p_method) { + switch (p_method) { + default: { + interpolate_basis_linear(p_prev, p_curr, r_result, p_fraction); + } break; + case INTERP_SLERP: { + r_result = _basis_slerp_unchecked(p_prev, p_curr, p_fraction); + } break; + case INTERP_SCALED_SLERP: { + interpolate_basis_scaled_slerp(p_prev, p_curr, r_result, p_fraction); + } break; + } +} + +Quaternion TransformInterpolator::_basis_to_quat_unchecked(const Basis &p_basis) { + Basis m = p_basis; + real_t trace = m.rows[0][0] + m.rows[1][1] + m.rows[2][2]; + real_t temp[4]; + + if (trace > 0.0) { + real_t s = Math::sqrt(trace + 1.0f); + temp[3] = (s * 0.5f); + s = 0.5f / s; + + temp[0] = ((m.rows[2][1] - m.rows[1][2]) * s); + temp[1] = ((m.rows[0][2] - m.rows[2][0]) * s); + temp[2] = ((m.rows[1][0] - m.rows[0][1]) * s); + } else { + int i = m.rows[0][0] < m.rows[1][1] + ? (m.rows[1][1] < m.rows[2][2] ? 2 : 1) + : (m.rows[0][0] < m.rows[2][2] ? 2 : 0); + int j = (i + 1) % 3; + int k = (i + 2) % 3; + + real_t s = Math::sqrt(m.rows[i][i] - m.rows[j][j] - m.rows[k][k] + 1.0f); + temp[i] = s * 0.5f; + s = 0.5f / s; + + temp[3] = (m.rows[k][j] - m.rows[j][k]) * s; + temp[j] = (m.rows[j][i] + m.rows[i][j]) * s; + temp[k] = (m.rows[k][i] + m.rows[i][k]) * s; + } + + return Quaternion(temp[0], temp[1], temp[2], temp[3]); +} + +Quaternion TransformInterpolator::_quat_slerp_unchecked(const Quaternion &p_from, const Quaternion &p_to, real_t p_fraction) { + Quaternion to1; + real_t omega, cosom, sinom, scale0, scale1; + + // Calculate cosine. + cosom = p_from.dot(p_to); + + // Adjust signs (if necessary) + if (cosom < 0.0f) { + cosom = -cosom; + to1.x = -p_to.x; + to1.y = -p_to.y; + to1.z = -p_to.z; + to1.w = -p_to.w; + } else { + to1.x = p_to.x; + to1.y = p_to.y; + to1.z = p_to.z; + to1.w = p_to.w; + } + + // Calculate coefficients. + + // This check could possibly be removed as we dealt with this + // case in the find_method() function, but is left for safety, it probably + // isn't a bottleneck. + if ((1.0f - cosom) > (real_t)CMP_EPSILON) { + // standard case (slerp) + omega = Math::acos(cosom); + sinom = Math::sin(omega); + scale0 = Math::sin((1.0f - p_fraction) * omega) / sinom; + scale1 = Math::sin(p_fraction * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0f - p_fraction; + scale1 = p_fraction; + } + // Calculate final values. + return Quaternion( + scale0 * p_from.x + scale1 * to1.x, + scale0 * p_from.y + scale1 * to1.y, + scale0 * p_from.z + scale1 * to1.z, + scale0 * p_from.w + scale1 * to1.w); +} + +Basis TransformInterpolator::_basis_slerp_unchecked(Basis p_from, Basis p_to, real_t p_fraction) { + Quaternion from = _basis_to_quat_unchecked(p_from); + Quaternion to = _basis_to_quat_unchecked(p_to); + + Basis b(_quat_slerp_unchecked(from, to, p_fraction)); + return b; +} + +void TransformInterpolator::interpolate_basis_scaled_slerp(Basis p_prev, Basis p_curr, Basis &r_result, real_t p_fraction) { + // Normalize both and find lengths. + Vector3 lengths_prev = _basis_orthonormalize(p_prev); + Vector3 lengths_curr = _basis_orthonormalize(p_curr); + + r_result = _basis_slerp_unchecked(p_prev, p_curr, p_fraction); + + // Now the result is unit length basis, we need to scale. + Vector3 lengths_lerped = lengths_prev + ((lengths_curr - lengths_prev) * p_fraction); + + // Keep a note that the column / row order of the basis is weird, + // so keep an eye for bugs with this. + r_result[0] *= lengths_lerped; + r_result[1] *= lengths_lerped; + r_result[2] *= lengths_lerped; +} + +void TransformInterpolator::interpolate_basis_linear(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction) { + // Interpolate basis. + r_result = p_prev.lerp(p_curr, p_fraction); + + // It turns out we need to guard against zero scale basis. + // This is kind of silly, as we should probably fix the bugs elsewhere in Godot that can't deal with + // zero scale, but until that time... + for (int n = 0; n < 3; n++) { + Vector3 &axis = r_result[n]; + + // Not ok, this could cause errors due to bugs elsewhere, + // so we will bodge set this to a small value. + const real_t smallest = 0.0001f; + const real_t smallest_squared = smallest * smallest; + if (axis.length_squared() < smallest_squared) { + // Setting a different component to the smallest + // helps prevent the situation where all the axes are pointing in the same direction, + // which could be a problem for e.g. cross products... + axis[n] = smallest; + } + } +} + +// Returns length. +real_t TransformInterpolator::_vec3_normalize(Vector3 &p_vec) { + real_t lengthsq = p_vec.length_squared(); + if (lengthsq == 0.0f) { + p_vec.x = p_vec.y = p_vec.z = 0.0f; + return 0.0f; + } + real_t length = Math::sqrt(lengthsq); + p_vec.x /= length; + p_vec.y /= length; + p_vec.z /= length; + return length; +} + +// Returns lengths. +Vector3 TransformInterpolator::_basis_orthonormalize(Basis &r_basis) { + // Gram-Schmidt Process. + + Vector3 x = r_basis.get_column(0); + Vector3 y = r_basis.get_column(1); + Vector3 z = r_basis.get_column(2); + + Vector3 lengths; + + lengths.x = _vec3_normalize(x); + y = (y - x * (x.dot(y))); + lengths.y = _vec3_normalize(y); + z = (z - x * (x.dot(z)) - y * (y.dot(z))); + lengths.z = _vec3_normalize(z); + + r_basis.set_column(0, x); + r_basis.set_column(1, y); + r_basis.set_column(2, z); + + return lengths; +} + +TransformInterpolator::Method TransformInterpolator::_test_basis(Basis p_basis, bool r_needed_normalize, Quaternion &r_quat) { + // Axis lengths. + Vector3 al = Vector3(p_basis.get_column(0).length_squared(), + p_basis.get_column(1).length_squared(), + p_basis.get_column(2).length_squared()); + + // Non unit scale? + if (r_needed_normalize || !_vec3_is_equal_approx(al, Vector3(1.0, 1.0, 1.0), (real_t)0.001f)) { + // If the basis is not normalized (at least approximately), it will fail the checks needed for slerp. + // So we try to detect a scaled (but not sheared) basis, which we *can* slerp by normalizing first, + // and lerping the scales separately. + + // If any of the axes are really small, it is unlikely to be a valid rotation, or is scaled too small to deal with float error. + const real_t sl_epsilon = 0.00001f; + if ((al.x < sl_epsilon) || + (al.y < sl_epsilon) || + (al.z < sl_epsilon)) { + return INTERP_LERP; + } + + // Normalize the basis. + Basis norm_basis = p_basis; + + al.x = Math::sqrt(al.x); + al.y = Math::sqrt(al.y); + al.z = Math::sqrt(al.z); + + norm_basis.set_column(0, norm_basis.get_column(0) / al.x); + norm_basis.set_column(1, norm_basis.get_column(1) / al.y); + norm_basis.set_column(2, norm_basis.get_column(2) / al.z); + + // This doesn't appear necessary, as the later checks will catch it. + // if (!_basis_is_orthogonal_any_scale(norm_basis)) { + // return INTERP_LERP; + // } + + p_basis = norm_basis; + + // Orthonormalize not necessary as normal normalization(!) works if the + // axes are orthonormal. + // p_basis.orthonormalize(); + + // If we needed to normalize one of the two bases, we will need to normalize both, + // regardless of whether the 2nd needs it, just to make sure it takes the path to return + // INTERP_SCALED_LERP on the 2nd call of _test_basis. + r_needed_normalize = true; + } + + // Apply less stringent tests than the built in slerp, the standard Godot slerp + // is too susceptible to float error to be useful. + real_t det = p_basis.determinant(); + if (!Math::is_equal_approx(det, 1, (real_t)0.01f)) { + return INTERP_LERP; + } + + if (!_basis_is_orthogonal(p_basis)) { + return INTERP_LERP; + } + + // TODO: This could possibly be less stringent too, check this. + r_quat = _basis_to_quat_unchecked(p_basis); + if (!r_quat.is_normalized()) { + return INTERP_LERP; + } + + return r_needed_normalize ? INTERP_SCALED_SLERP : INTERP_SLERP; +} + +// This check doesn't seem to be needed but is preserved in case of bugs. +bool TransformInterpolator::_basis_is_orthogonal_any_scale(const Basis &p_basis) { + Vector3 cross = p_basis.get_column(0).cross(p_basis.get_column(1)); + real_t l = _vec3_normalize(cross); + // Too small numbers, revert to lerp. + if (l < 0.001f) { + return false; + } + + const real_t epsilon = 0.9995f; + + real_t dot = cross.dot(p_basis.get_column(2)); + if (dot < epsilon) { + return false; + } + + cross = p_basis.get_column(1).cross(p_basis.get_column(2)); + l = _vec3_normalize(cross); + // Too small numbers, revert to lerp. + if (l < 0.001f) { + return false; + } + + dot = cross.dot(p_basis.get_column(0)); + if (dot < epsilon) { + return false; + } + + return true; +} + +bool TransformInterpolator::_basis_is_orthogonal(const Basis &p_basis, real_t p_epsilon) { + Basis identity; + Basis m = p_basis * p_basis.transposed(); + + // Less stringent tests than the standard Godot slerp. + if (!_vec3_is_equal_approx(m[0], identity[0], p_epsilon) || !_vec3_is_equal_approx(m[1], identity[1], p_epsilon) || !_vec3_is_equal_approx(m[2], identity[2], p_epsilon)) { + return false; + } + return true; +} + +real_t TransformInterpolator::checksum_transform_3d(const Transform3D &p_transform) { + // just a really basic checksum, this can probably be improved + real_t sum = _vec3_sum(p_transform.origin); + sum -= _vec3_sum(p_transform.basis.rows[0]); + sum += _vec3_sum(p_transform.basis.rows[1]); + sum -= _vec3_sum(p_transform.basis.rows[2]); + return sum; +} + +TransformInterpolator::Method TransformInterpolator::find_method(const Basis &p_a, const Basis &p_b) { + bool needed_normalize = false; + + Quaternion q0; + Method method = _test_basis(p_a, needed_normalize, q0); + if (method == INTERP_LERP) { + return method; + } + + Quaternion q1; + method = _test_basis(p_b, needed_normalize, q1); + if (method == INTERP_LERP) { + return method; + } + + // Are they close together? + // Apply the same test that will revert to lerp as is present in the slerp routine. + // Calculate cosine. + real_t cosom = Math::abs(q0.dot(q1)); + if ((1.0f - cosom) <= (real_t)CMP_EPSILON) { + return INTERP_LERP; + } + + return method; +} diff --git a/core/math/transform_interpolator.h b/core/math/transform_interpolator.h index a9bce2bd7fea..cc556707e4c6 100644 --- a/core/math/transform_interpolator.h +++ b/core/math/transform_interpolator.h @@ -32,15 +32,64 @@ #define TRANSFORM_INTERPOLATOR_H #include "core/math/math_defs.h" +#include "core/math/vector3.h" + +// Keep all the functions for fixed timestep interpolation together. +// There are two stages involved: +// Finding a method, for determining the interpolation method between two +// keyframes (which are physics ticks). +// And applying that pre-determined method. + +// Pre-determining the method makes sense because it is expensive and often +// several frames may occur between each physics tick, which will make it cheaper +// than performing every frame. struct Transform2D; +struct Transform3D; +struct Basis; +struct Quaternion; class TransformInterpolator { +public: + enum Method { + INTERP_LERP, + INTERP_SLERP, + INTERP_SCALED_SLERP, + }; + private: - static bool _sign(real_t p_val) { return p_val >= 0; } + _FORCE_INLINE_ static bool _sign(real_t p_val) { return p_val >= 0; } + static real_t _vec3_sum(const Vector3 &p_pt) { return p_pt.x + p_pt.y + p_pt.z; } + static real_t _vec3_normalize(Vector3 &p_vec); + _FORCE_INLINE_ static bool _vec3_is_equal_approx(const Vector3 &p_a, const Vector3 &p_b, real_t p_tolerance) { + return Math::is_equal_approx(p_a.x, p_b.x, p_tolerance) && Math::is_equal_approx(p_a.y, p_b.y, p_tolerance) && Math::is_equal_approx(p_a.z, p_b.z, p_tolerance); + } + static Vector3 _basis_orthonormalize(Basis &r_basis); + static Method _test_basis(Basis p_basis, bool r_needed_normalize, Quaternion &r_quat); + static Basis _basis_slerp_unchecked(Basis p_from, Basis p_to, real_t p_fraction); + static Quaternion _quat_slerp_unchecked(const Quaternion &p_from, const Quaternion &p_to, real_t p_fraction); + static Quaternion _basis_to_quat_unchecked(const Basis &p_basis); + static bool _basis_is_orthogonal(const Basis &p_basis, real_t p_epsilon = 0.01f); + static bool _basis_is_orthogonal_any_scale(const Basis &p_basis); + + static void interpolate_basis_linear(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction); + static void interpolate_basis_scaled_slerp(Basis p_prev, Basis p_curr, Basis &r_result, real_t p_fraction); public: static void interpolate_transform_2d(const Transform2D &p_prev, const Transform2D &p_curr, Transform2D &r_result, real_t p_fraction); + + // Generic functions, use when you don't know what method should be used, e.g. from GDScript. + // These will be slower. + static void interpolate_transform_3d(const Transform3D &p_prev, const Transform3D &p_curr, Transform3D &r_result, real_t p_fraction); + static void interpolate_basis(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction); + + // Optimized function when you know ahead of time the method. + static void interpolate_transform_3d_via_method(const Transform3D &p_prev, const Transform3D &p_curr, Transform3D &r_result, real_t p_fraction, Method p_method); + static void interpolate_basis_via_method(const Basis &p_prev, const Basis &p_curr, Basis &r_result, real_t p_fraction, Method p_method); + + static real_t checksum_transform_3d(const Transform3D &p_transform); + + static Method find_method(const Basis &p_a, const Basis &p_b); }; #endif // TRANSFORM_INTERPOLATOR_H diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp index ceeb04b8eae3..9826d73a9dda 100644 --- a/core/object/class_db.cpp +++ b/core/object/class_db.cpp @@ -181,7 +181,7 @@ class PlaceholderExtensionInstance { return 0; } - static GDExtensionObjectPtr placeholder_class_create_instance(void *p_class_userdata) { + static GDExtensionObjectPtr placeholder_class_create_instance(void *p_class_userdata, GDExtensionBool p_notify_postinitialize) { ClassDB::ClassInfo *ti = (ClassDB::ClassInfo *)p_class_userdata; // Find the closest native parent, that isn't a runtime class. @@ -192,7 +192,7 @@ class PlaceholderExtensionInstance { ERR_FAIL_NULL_V(native_parent->creation_func, nullptr); // Construct a placeholder. - Object *obj = native_parent->creation_func(); + Object *obj = native_parent->creation_func(static_cast(p_notify_postinitialize)); // ClassDB::set_object_extension_instance() won't be called for placeholders. // We need need to make sure that all the things it would have done (even if @@ -227,16 +227,12 @@ class PlaceholderExtensionInstance { #endif bool ClassDB::_is_parent_class(const StringName &p_class, const StringName &p_inherits) { - if (!classes.has(p_class)) { - return false; - } - - StringName inherits = p_class; - while (inherits.operator String().length()) { - if (inherits == p_inherits) { + ClassInfo *c = classes.getptr(p_class); + while (c) { + if (c->name == p_inherits) { return true; } - inherits = _get_parent_class(inherits); + c = c->inherits_ptr; } return false; @@ -271,6 +267,22 @@ void ClassDB::get_extensions_class_list(List *p_classes) { p_classes->sort_custom(); } + +void ClassDB::get_extension_class_list(const Ref &p_extension, List *p_classes) { + OBJTYPE_RLOCK; + + for (const KeyValue &E : classes) { + if (E.value.api != API_EXTENSION && E.value.api != API_EDITOR_EXTENSION) { + continue; + } + if (!E.value.gdextension || E.value.gdextension->library != p_extension.ptr()) { + continue; + } + p_classes->push_back(E.key); + } + + p_classes->sort_custom(); +} #endif void ClassDB::get_inheriters_from_class(const StringName &p_class, List *p_classes) { @@ -303,6 +315,29 @@ StringName ClassDB::get_parent_class_nocheck(const StringName &p_class) { return ti->inherits; } +bool ClassDB::get_inheritance_chain_nocheck(const StringName &p_class, Vector &r_result) { + OBJTYPE_RLOCK; + + ClassInfo *start = classes.getptr(p_class); + if (!start) { + return false; + } + + int classes_to_add = 0; + for (ClassInfo *ti = start; ti; ti = ti->inherits_ptr) { + classes_to_add++; + } + + int64_t old_size = r_result.size(); + r_result.resize(old_size + classes_to_add); + StringName *w = r_result.ptrw() + old_size; + for (ClassInfo *ti = start; ti; ti = ti->inherits_ptr) { + *w++ = ti->name; + } + + return true; +} + StringName ClassDB::get_compatibility_remapped_class(const StringName &p_class) { if (classes.has(p_class)) { return p_class; @@ -502,12 +537,12 @@ StringName ClassDB::get_compatibility_class(const StringName &p_class) { return StringName(); } -Object *ClassDB::_instantiate_internal(const StringName &p_class, bool p_require_real_class) { +Object *ClassDB::_instantiate_internal(const StringName &p_class, bool p_require_real_class, bool p_notify_postinitialize) { ClassInfo *ti; { OBJTYPE_RLOCK; ti = classes.getptr(p_class); - if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) { + if (!_can_instantiate(ti)) { if (compat_classes.has(p_class)) { ti = classes.getptr(compat_classes[p_class]); } @@ -516,34 +551,78 @@ Object *ClassDB::_instantiate_internal(const StringName &p_class, bool p_require ERR_FAIL_COND_V_MSG(ti->disabled, nullptr, "Class '" + String(p_class) + "' is disabled."); ERR_FAIL_NULL_V_MSG(ti->creation_func, nullptr, "Class '" + String(p_class) + "' or its base class cannot be instantiated."); } + #ifdef TOOLS_ENABLED if ((ti->api == API_EDITOR || ti->api == API_EDITOR_EXTENSION) && !Engine::get_singleton()->is_editor_hint()) { ERR_PRINT("Class '" + String(p_class) + "' can only be instantiated by editor."); return nullptr; } #endif - if (ti->gdextension && ti->gdextension->create_instance) { - ObjectGDExtension *extension = ti->gdextension; -#ifdef TOOLS_ENABLED - if (!p_require_real_class && ti->is_runtime && Engine::get_singleton()->is_editor_hint()) { - extension = get_placeholder_extension(ti->name); - } -#endif - return (Object *)extension->create_instance(extension->class_userdata); - } else { + #ifdef TOOLS_ENABLED - if (!p_require_real_class && ti->is_runtime && Engine::get_singleton()->is_editor_hint()) { - if (!ti->inherits_ptr || !ti->inherits_ptr->creation_func) { - ERR_PRINT(vformat("Cannot make a placeholder instance of runtime class %s because its parent cannot be constructed.", ti->name)); - } else { - ObjectGDExtension *extension = get_placeholder_extension(ti->name); - return (Object *)extension->create_instance(extension->class_userdata); + // Try to create placeholder. + if (!p_require_real_class && ti->is_runtime && Engine::get_singleton()->is_editor_hint()) { + bool can_create_placeholder = false; + if (ti->gdextension) { + if (ti->gdextension->create_instance2) { + can_create_placeholder = true; } +#ifndef DISABLE_DEPRECATED + else if (ti->gdextension->create_instance) { + can_create_placeholder = true; + } +#endif // DISABLE_DEPRECATED + } else if (!ti->inherits_ptr || !ti->inherits_ptr->creation_func) { + ERR_PRINT(vformat("Cannot make a placeholder instance of runtime class %s because its parent cannot be constructed.", ti->name)); + } else { + can_create_placeholder = true; } -#endif - return ti->creation_func(); + if (can_create_placeholder) { + ObjectGDExtension *extension = get_placeholder_extension(ti->name); + return (Object *)extension->create_instance2(extension->class_userdata, p_notify_postinitialize); + } + } +#endif // TOOLS_ENABLED + + if (ti->gdextension && ti->gdextension->create_instance2) { + ObjectGDExtension *extension = ti->gdextension; + return (Object *)extension->create_instance2(extension->class_userdata, p_notify_postinitialize); + } +#ifndef DISABLE_DEPRECATED + else if (ti->gdextension && ti->gdextension->create_instance) { + ObjectGDExtension *extension = ti->gdextension; + return (Object *)extension->create_instance(extension->class_userdata); + } +#endif // DISABLE_DEPRECATED + else { + return ti->creation_func(p_notify_postinitialize); + } +} + +bool ClassDB::_can_instantiate(ClassInfo *p_class_info) { + if (!p_class_info) { + return false; + } + + if (p_class_info->disabled || !p_class_info->creation_func) { + return false; + } + + if (!p_class_info->gdextension) { + return true; + } + + if (p_class_info->gdextension->create_instance2) { + return true; + } + +#ifndef DISABLE_DEPRECATED + if (p_class_info->gdextension->create_instance) { + return true; } +#endif // DISABLE_DEPRECATED + return false; } Object *ClassDB::instantiate(const StringName &p_class) { @@ -554,6 +633,10 @@ Object *ClassDB::instantiate_no_placeholders(const StringName &p_class) { return _instantiate_internal(p_class, true); } +Object *ClassDB::instantiate_without_postinitialization(const StringName &p_class) { + return _instantiate_internal(p_class, true, false); +} + #ifdef TOOLS_ENABLED ObjectGDExtension *ClassDB::get_placeholder_extension(const StringName &p_class) { ObjectGDExtension *placeholder_extension = placeholder_extensions.getptr(p_class); @@ -565,7 +648,7 @@ ObjectGDExtension *ClassDB::get_placeholder_extension(const StringName &p_class) { OBJTYPE_RLOCK; ti = classes.getptr(p_class); - if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) { + if (!_can_instantiate(ti)) { if (compat_classes.has(p_class)) { ti = classes.getptr(compat_classes[p_class]); } @@ -626,7 +709,10 @@ ObjectGDExtension *ClassDB::get_placeholder_extension(const StringName &p_class) placeholder_extension->get_rid = &PlaceholderExtensionInstance::placeholder_instance_get_rid; placeholder_extension->class_userdata = ti; - placeholder_extension->create_instance = &PlaceholderExtensionInstance::placeholder_class_create_instance; +#ifndef DISABLE_DEPRECATED + placeholder_extension->create_instance = nullptr; +#endif // DISABLE_DEPRECATED + placeholder_extension->create_instance2 = &PlaceholderExtensionInstance::placeholder_class_create_instance; placeholder_extension->free_instance = &PlaceholderExtensionInstance::placeholder_class_free_instance; placeholder_extension->get_virtual = &PlaceholderExtensionInstance::placeholder_class_get_virtual; placeholder_extension->get_virtual_call_data = nullptr; @@ -643,7 +729,7 @@ void ClassDB::set_object_extension_instance(Object *p_object, const StringName & { OBJTYPE_RLOCK; ti = classes.getptr(p_class); - if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) { + if (!_can_instantiate(ti)) { if (compat_classes.has(p_class)) { ti = classes.getptr(compat_classes[p_class]); } @@ -680,7 +766,7 @@ bool ClassDB::can_instantiate(const StringName &p_class) { return false; } #endif - return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance)); + return _can_instantiate(ti); } bool ClassDB::is_abstract(const StringName &p_class) { @@ -695,7 +781,18 @@ bool ClassDB::is_abstract(const StringName &p_class) { Ref